java - 使用模式避免 ifs

标签 java oop design-patterns

我知道您可以通过使用策略或命令模式的多态性来删除 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/

相关文章:

java - JBOSS网站开发

java - 如何修复 gradle 构建错误配置根项目时出现问题?

java - 从移动设备指向 ebay.com 时出现 fileNotFoundException

java - Java 中的 OOP : Class inheritance with method chaining

oop - 实体组件系统中的有限状态机实现

design-patterns - 安全地检查用户是否登录到另一个域 (JSONP)

java - 有没有书籍解释Suns/Oracle 类层次结构背后的逻辑?

java - 设计建议,未能将工厂与泛型结合起来

Java Web App FutureTask 进度条

ios - 从 Objective-C 的角度来看 "over ride"是什么意思?