摆脱 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
实例。
如何改进以下代码的设计:
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
实例。