我正在尝试在我的文件生成程序中建模一些状态, 在某一点上:
psudocode就像:
if(isValid()){
writeFile()
} else {
switch(getReason()){
case FAIL1: doSomething1();
break;
case FAIL2: doSomething2();
break;
case FAIL3: doSomething3();
break;
}
}
不确定这样的方法是否正确,想要您的建议/意见。其中:总共少于10个错误状态,并且在给定时间只有一个错误状态适用。
答案 0 :(得分:0)
我会为您的enum
创建一个Reason
,并将您原因的所有具体信息放在那里。然后,您可以使用原因中的特定信息对doSomething
方法进行参数化。听起来像这样可能是String
。使用这种方法,扩展代码要容易得多。
代码可能如下所示:
if(isValid()){
writeFile()
} else { Reason reason = getReason();
doSomething(reason.getMessage());
}
使用您的枚举Reason
enum Reason {
REASON1("message1"), REASON2("message2")/* ... */;
private String message;
private Reason(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
答案 1 :(得分:0)
来自加尔诺夫的想法正朝着一个好方向发展;但在OO术语中它仍然不是一个非常好的解决方案。
事情是:你已经提到了重要的关键概念:状态,如状态机。
你真的想在这里使用多态:
abstract class Reason() {
String getMessage() { // just to show that there might be some shared code
abstract void doSomething();
那么你的Reason类会有不同的子类;最后,您的客户端代码归结为:
getReason().doSomething();
因为每个理由都知道自己要做什么!当然,这可能需要进一步思考 - 取决于这些不同的错误原因究竟是什么。
关键是:你真的想避免任何切换枚举或字符串值。如果有的话,你在工厂里隐藏这样的开关,返回一些抽象的类/接口东西(工厂为你创建一个具体的子类/实现)。