1

您有一系列功能要执行。案例A:它们不相互依赖。这些哪个更好?

function main() {
  a();
  b();
  c();
}

或者

function main() {
  a();
}

function a() {
  ...
  b();
}

function b() {
  ...
  c();
}

案例B:它们确实取决于成功完成前一个。

function main() {
  if (a())
    if (b())
      c();
}

或者

function main() {
  if (!a()) return false;
  if (!b()) return false;
  c();
}

或者

function main() {
  a();
}

function a() {
  ... // maybe return false
  b();
}

function b() {
  ... // maybe return false
  c();
}

当然,更好意味着更易于维护和更易于遵循。

4

4 回答 4

14

案例 A: 1.
推理:由于没有一个函数相互依赖,因此在 main 中按顺序调用它们显示了事件的逻辑顺序。您在每个函数末尾调用下一个函数的替代方案看起来就像意大利面条代码,阅读您的程序的人很难理解。

案例B:以上都不是。

function main() {
    return a() && b() && c();
}

推理:看起来你并不真正关心返回值,如果其中一个函数返回某个值,你只是想早点突破。您可以返回所有这些函数的“anded”结果,如果其中任何一个返回 false,代码将提前中断。因此,如果 a 返回 false 那么 b 将不会被执行。将它们全部放在一行上很容易阅读,并且简明扼要地表明它们相互依赖。

于 2010-04-29T14:36:33.947 回答
2

案例A:第一选择

如果您使用第二个选项,那么您将更加难以重用 a,因为您会自动引入 b 和 c。

案例 b:取决于 - a、b 和 c 是否自然返回布尔值,或者要检查的其他值?我仍然不会调用 b 和 b 调用 c,因为那样会引入不必要的依赖。如果返回值有意义,我倾向于选项 2 - 减少嵌套是一件好事。

于 2010-04-29T14:40:25.063 回答
1

首先,最佳答案将取决于代码所在上下文的多个方面——除了“它取决于”之外,没有一个正确的答案。

但是,从表面上看,案例 A:

选项 1 显示了算法的顶层视图。

选项 2 隐藏了这一点,对 B 和 C 的调用被隐藏。发现 C 被调用可能需要做很多工作。此外,如果 A & B 然后调用进一步的方法,则更难单独测试 A 和 B。如果可以模拟 A、B 和 C,则始终可以测试 Main。

案例 B:在一个方法中有 1 个退出点与多个退出点的争论很常见。有时,多个退出点可以使代码更简单,从而使其更易于维护,有时返回的影响并不明显,或者将发生返回,这使得它的可维护性降低。

选项 1 明确显示了算法,但多个嵌套的 if 很快就会失控。在这种情况下,我肯定会有选项 2 或一些聪明的布尔变量(是的,corey)。

选项 3 对我来说看起来很迟钝。

于 2010-04-29T14:46:49.753 回答
0

案例A:第一选择

案例 B:第二种选择

于 2010-04-29T14:36:35.027 回答