【问题标题】:Pattern for converting if-then-else to conditional将 if-then-else 转换为条件的模式
【发布时间】:2015-02-09 08:41:45
【问题描述】:

这种重构模式的名称是什么?我想阅读更多关于它的意见,但不能说出它的名字。

相同的代码在 if-else-statement 的两个分支中执行,但只有一个原子表达式不同。例如

if (condition) {
    prepareSomethingAdditional();
    callMethod(true, "foobar");
}
else {
    callMethod(false, "foobar");
}

这可以重构,以表示“callMethod”调用意味着总是被执行,只是参数应根据条件而有所不同。例如

if (condition) {
    prepareSomethingAdditional();
}
callMethod(condition, "foobar");

当然,这可能会导致使用条件运算符作为方法参数(如果一个不同的表达式不仅仅是简单的真/假),这是另一场争论。

【问题讨论】:

  • 一个体面的现代编译器可能会通过公共子表达式消除 (CSE) 做类似的事情,尽管我不确定这里是否会使用相同的术语;我仍然不知道我输入的所有内容都被 Martin Fowler 命名了三次。
  • 我不确定这个模式是否有名字。在另一个主题上:将布尔值传递给方法是 bad pattern
  • @alfasin,当方法是“isVisible”或类似的方法时,我倾向于不同意;在这种情况下,您会建议什么替代品?
  • @Tom isVisible() 应该是一个不接受任何参数的方法:)
  • 不知道你是不是故意钝...请描述一个函数的参数来设置实体是否可见?

标签: design-patterns refactoring


【解决方案1】:

我找到的最接近的模式是 Martin Fowler 的 Consolidate Duplicate Conditional Fragments

由于片段略有不同,所以并不完全相同,但我认为在这种情况下它仍然可以放在伞下。

您也可以将其视为DRY,恕我直言。

另一方面,请注意,将布尔值传递给用于控制执行流程的函数通常不是一个好主意,但这不是黄金法则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多