我有一个问题可能是一个纯粹的品味问题,但我只想从不同的角度得到一些意见,以便更清楚地了解这一点。
类从数据库读取和写入状态值。目前有5个状态值,它们可能会变得更多。为简洁起见,我在示例中仅使用3个状态值。此外,虽然这是Java代码,但该概念也可以转移到其他语言。
class Status {
private enum Value { FAILED, FINISHED, RUNNING }
// getters (read from db)
// ...
// setters (write into db)
// ...
}
我无法决定是否应该使用像
这样的通用getter和setterValue get()
void set(Value value)
或者我是否应该创建具有更多语义的特定getter和setter,如
boolean isRunning()
boolean hasFailed()
boolean hasFinished() // could also be named isFinished()...
void setFailed()
void setFinished()
void setRunning()
该组件对性能不是很重要,但语义getter的明显缺点是您需要对if-else if
语句进行多次数据库读取,并且switch
不能使用。if (status.get() == Status.Value.RUNNING) { ... }
。另一方面,它隐藏了消费者的实现的内部细节,并且不需要使用此类之外的枚举值:
if (status.isRunning()) { ... }
VS
{{1}}
感谢任何评论。
答案 0 :(得分:2)
如果客户必须多次进行比较,例如:
if (status.get() == Status.Value.RUNNING) { ... }
您可能会为Status
类中包含的枚举字段提供过多细粒度的API
它将强制每个客户端具有重复的代码或以其他方式创建自己的util方法,例如boolean isRunning(Status status){return status.get() == Status.Value.RUNNING}
。
出于两个原因,这不是一个好主意:
Status
。不要限制客户端类来承担此方法的责任。请注意,您不应同时提供:值getter / setter +特定方法。这可能会产生误导。
答案 1 :(得分:1)
我同意梅纳认为这是基于意见的,我更喜欢使用isRunning,hasFailed等。 因为名字具有更多意义,而且更短,更容易理解。
正如你所写:
if (status.get() == Status.Value.RUNNING) { ... }
if (status.isRunning()) { ... }
第二个选项更短,可以更好地了解正在发生的事情,但这又是个人的事情。
此外,您可以考虑使用更多功能方法,类似于Optional,例如ifFailed(Consumer<Throwable>)
。