我知道您可以通过使用策略或命令模式的多态性来删除 if block 。但是,假设我的代码如下所示:
ArgumentObject arg = getArg();
if (arg.getId() == "id2_1" || arg.getId() == "id3_1" || arg.getId() == "id4_1") {
//do something
}
if (arg.getId() == "id2_1") {
//do something
}
if (arg.getId() = "id2_2" || arg.getId() = "id3_1") {
//do something
}
if (arg.getId().startsWith("id1") || arg.getId().startsWith("id4")) {
//do something
}
基本上,代码根据产品 ID 执行一些字段填充操作。它使用startsWith()检查产品是否来自某组产品,然后执行填充,检查产品是否具有特定的id,然后适本地填充字段等。
我不知道如何在这里使用策略模式?如果我创建一个策略来处理第一个 if 语句,那么如何继续处理第二个语句?问题在于 if 并不是相互排斥的。我应该将相关的 if 移至策略类吗?有什么模式可以帮助我重构它以便更容易测试吗?
最佳答案
您的代码揭示的问题更为基本:它违反了告诉!不要问!原则。
您的arg
对象不应具有方法getId()
,而应该具有此时调用的通用接口(interface)方法。要完成的工作可以在实例化时注入(inject) arg 对象,也可以将它们作为参数传递给方法,由 arg 对象的具体实现决定调用哪个参数...
关于java - 使用模式避免 ifs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44800278/