2016-06-13 45 views
-1

如何才能提高代码如下设计:摆脱if语句来提高代码的设计

class Foo { 
    public Configuration configure() { 
     return new Configuration().withPropertyA().withPropertyB(); 
    } 
} 

class Configuration{ 


    private boolean propertyA = false; 
    private boolean propertyB = false; 

    public Configuration withPropertyA() { 
     this.propertyA = true; 
     return this; 
    } 

    public Configuration withPropertyB() { 
     this.propertyB = true; 
     return this; 
    } 

    public boolean hasPropertyA() { 
     return this.propertyA; 
    } 

    public boolean hasPropertyB() { 
     return this.propertyB; 
    } 

    ... 
} 

class Client{ 

public void someMethod(Configuration config) { 
    if (config.hasPropertyA() { 
     doStuffA(); 
    } 
    if (config.hasPropertyB() { 
     doStuffB(); 
    } 
    //... 
} 

} 

即,配置类包含一些标志呼叫者(Client)告诉给调用者这“事物”需要配置。客户知道如果设置了每个标志,该怎么做。我想摆脱Client中的if语句以及在Configuration实例中简单设置布尔标志的概念。你能提出一个更“通用”和面向对象的方法吗?

亲切的问候

+1

代码优化通常是无关紧要的...... –

回答

1

您可以使用策略模式。 每个If都成为一个策略,它实现doStuff,并拥有自己的逻辑。当设置属性(A,B ...)时,将策略添加到列表中。你只需要在战略环和执行它们,没有任何IFS:

public class Foo { 
    public Configuration configure() { 
     return new Configuration().withPropertyA().withPropertyB(); 
    } 
} 

class Configuration { 
    Set<StuffStrategy> strategies = new HashSet<StuffStrategy>(); 

    public Configuration withPropertyA() { 
     strategies.add(new PropertyAStrategy()); 
     return this; 
    } 

    public Configuration withPropertyB() { 
     strategies.add(new PropertyBStrategy()); 
     return this; 
    } 

    public void executeStrategies() { 
     for (StuffStrategy strategy : strategies) { 
      strategy.doStuff(); 
     } 
    } 
} 

interface StuffStrategy { 
    public void doStuff(); 
} 
class PropertyAStrategy implements StuffStrategy { 
    @Override 
    public void doStuff() { 
    } 
} 

class PropertyBStrategy implements StuffStrategy { 
    @Override 
    public void doStuff() { 
    } 
} 

class Client { 
    public void someMethod(Configuration config) { 
     config.executeStrategies(); 
    } 
} 
-1

看起来你正在编写一个陷阱

尝试使用在这种情况下一些在设计更加灵活....像一个枚举... 看看这个:

例子:

public class Foo { 
    public Configuration configure() { 
    return new Configuration(Config.A); 
    } 
} 

class Configuration { 

enum Config{ 
A,B, NONE} 

    private Config propertyConfig = Config.NONE; 

    public Configuration(Config a) { 
    propertyConfig=a; 
    } 


    public Config getConfig() { 
    return this.propertyConfig; 
    } 

    ... 
} 

class Client { 

    public void someMethod(Configuration config) { 
     switch (config.getConfig()) { 
    case A: 
     System.out.println("a config"); 
     break; 
    case B: 
     System.out.println("b config"); 
     break; 

    default: 
     break; 
    } 
    // ... 
} 

} 
+2

所以,你用'switch-case'替换了'if'语句。这是如何更好/不同? – Tunaki

+0

是否知道开关盒的速度比if if还快,在代码中省略了设计的事实... –

+0

虽然我想在真实环境中测量它,但速度可能稍快。这就是说,问题是关于代码的设计。 – Tunaki

1

我不相信,你可以找到比你currenly做特别是更面向对象的方法,如果你可以有更多的参数,确这是知名设计模式Builder,你所能做的最好的就是通过使你的对象Configuration从外部不可改变来完成实现这个模式,只有你的构建器类应该能够创建一个Configuration的实例。您的构建器应该是一个可变的静态内部类,它带有一个返回不可变的Configuration实例的build()方法。

+0

我认为@Alex为此提供了一种干净的面向对象的方法。不过,我会给你建设者提示的最高票数。 thx – Moonlit

+0

@ user1291235即使它看起来像您所说的那样“干净”,它根本就不灵活,如果您的需求有所改变,您将如何处理,并且您必须支持您拥有A和B属性或你有A但不是B,那么你的代码将是一个噩梦来维护 –