我有一些我想重构的代码.我有很多方法采用相同类型的多个参数,例如:
public void foo(String name, String street, boolean b1, boolean b2) { ... }
Run Code Online (Sandbox Code Playgroud)
等等.因为不同的对象只能通过名称来区分,所以我想将它们包装在Objects(Enums)中,这样我就可以使用该语言的类型系统(在本例中为Java).
public class Name {
private String value;
public String getValue() { return value; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
像这样我可以强制调用代码传递某种类型的对象.这样可以确保它不会意外混淆方法参数的顺序,因此不会在运行时产生意外行为:
foo(new Name("John"), new Street("Broadway"), new B1(true), new B2(false);
Run Code Online (Sandbox Code Playgroud)
这使得重构更加安全,只要你愿意,你可以通过系统携带对象,其中的数据,字符串始终是安全的.只有在需要它时,才能通过调用getValue()来获得它.
现在,对于包装字符串的对象,它非常简单,因为有许多状态实例可以存在.
但是布尔包装器怎么样?这些是TRUE或FALSE.实现只是看起来,有点好笑:
public enum Quanto {
YES() {
protected boolean isQuanto() {
return true;
}
},
NO() {
protected boolean isQuanto() {
return false;
}
};
protected abstract boolean isQuanto();
}
Run Code Online (Sandbox Code Playgroud)
更奇怪的是我发现调用代码是什么样的:
public void doStuff(Quanto quanto) {
if(quanto.isQuanto()) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
从技术上讲,它当然没关系,但它感觉不对......你找到了"更好"的方法来解决这个问题吗?
编辑:令我不高兴的是,在上面的例子中有比Yes和NO更值得思考的事实,比如MAYBE ......?!
谢谢!
我会将布尔值换成语义枚举.换一种说法:
public void doStuff(boolean isActive, boolean wrapResult);
Run Code Online (Sandbox Code Playgroud)
变
public enum State {ACTIVE, INACTIVE};
public enum ResultMode {WRAPPED, UNWRAPPED};
public void doStuff(State state, ResultMode resultsMode);
Run Code Online (Sandbox Code Playgroud)