摆脱 if 语句以改进代码设计

Get rid of if statements to improve code design

如何改进以下代码的设计:

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();
   }
   //...
}

}

即,配置 class 为调用者 (Client) 保留一些标志,告诉调用者需要配置哪个 "things"。如果设置了每个标志,则客户端知道如何处理这些标志。我想摆脱 Client 中的 if 语句以及在 Configuration 实例中简单设置布尔标志的概念。您能否对此提出更 "generic" 和更面向对象的方法?

亲切的问候

看来你在写坑

尝试在这种情况下在设计中使用更灵活的东西……比如枚举器…… 看看这个:

示例:

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;
    }
    // ...
}

}

您可以使用策略模式。 每个 If 都成为一个 Strategy,它以自己的逻辑实现 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();
    }
}

我不相信你能找到比你目前所做的更多的 OO 方法,特别是如果你可以有更多的参数,实际上这是众所周知的设计模式 Builder,你能做到的最好do 是通过使您的对象 Configuration 从外部不可变来正确实现此模式,只有您的构建器 class 应该能够创建 Configuration 的实例。你的构建器应该是一个可变的静态内部 class 和一个 build() 方法,returns 一个不可变的 Configuration 实例。