在一个非常大和旧的代码库中,假设我们正在使用一个数据库列
status
,枚举值为NEW
,IN_PROGRESS
,COMPLETED
,REJECTED
.
现在这个
status
在代码中的多个条件下使用
if (status == `NEW` || status == `IN_PROGRESS`) {
// do something
}
或者可能在一些 SQL 语句中,比如
WHERE status NOT IN ("REJECTED")
现在,如果我们想向
status
添加一个新的枚举值,例如。 “取消”,那么我们必须处理代码中所有使用status
的地方。
考虑到代码库可能有点分布式、庞大且相当陈旧,这种更改将被证明是非常困难的。我们如何改进这一点,以便更容易维护这些变化?
我不是在写任何特定的语言,只是概念,因为它应该可以复制到多种语言。
这是 Java 还是 JavaScript?无论如何,您应该能够将一些多态行为添加到您的枚举中。这意味着每种类型的枚举都知道如何做某事或是否允许做某事。让我们看一个简单的 Java 示例:
public enum Status {
NEW(true),
IN_PROGRESS(true),
REJECTED(false);
private final boolean allowsSomething;
Status(boolean allowsSomething) {
this.allowsSomething = allowsSomething;
}
public boolean allowsSomething() {
return allowsSomething;
}
}
现在,让我们重构你的方法。而不是这个:
void someMethod() {
Status status = someStatus();
if (status == Status.NEW || status == Status.IN_PROGRESS) {
// do something
}
}
我们会这样使用它:
void someMethod_refactored() {
Status status = someStatus();
if (status.allowsSomething()) {
// do something
}
}
假设您现在想要向枚举添加一个附加值,例如,
CANCELLED
。您将被迫指定 allowsSomething
标志,然后该枚举的所有客户端都将正常工作。
希望这有帮助,如果有帮助,我将不胜感激。