2

我有一个特定的函数使用相同的代码行(很少,2-5 取决于我如何更改它以适应未来可能的用途)代码行 4 次。

我看了这个问题,但它对我来说不够具体,也不符合我要找的方向。

这是一些

function myFunction() {
  if (something) {
    // Code line 1
    // Code line 2
    // Code line 3
  }
  else if (somethingElse) {
    // Code line 1
    // Code line 2
    // Code line 3
  }
  else if (anotherThing) {
    // Code line 1
    // Code line 2
    // Code line 3
  }
  else if (theLastThing) {
    // Code line 1
    // Code line 2
    // Code line 3
  }
  else {
  // Not previously used code
  }
}

复制/粘贴相同的 3 行代码(如果满足任何这些条件,则构造相同的对象)。创建一个可以将所有这些信息传递给它并在完成后返回必要信息的函数是一种好习惯吗?所有这些条件语句都在一个可以运行多达 1000 次左右的循环中。

我不确定通过跳转到另一个函数来准备堆栈帧(?)的成本是否比 1000 次迭代更昂贵,值得拥有约 15 行重复代码。显然,对其进行功能化会使它更具可读性,但是这是非常具体的功能,在其他任何地方都没有使用。我可以编写以消除复制/粘贴心态的功能类似于:

function myHelperFunction(someParameter, someOtherParameter) {
  // Code line 1
  // Code line 2
  // Code line 3
  return usefulInformation;
}

然后在所有这些条件语句中调用该函数作为每个条件语句 1 行:

myHelperFunction(myPassedParameter, myOtherPassedParameter);

基本上把这 12 行变成了 4 行。

所以问题是——这是一个很好的做法吗?为非常少量的代码创建一个新函数以节省一些空间和可读性?或者跳跃功能的成本是否太影响而不值得?是否应该为将来可能复制/粘贴的任何代码创建一个新函数?

PS - 我知道如果这段代码要在不同的(类)或源文件中使用,将它变成一个函数是合乎逻辑的,以避免需要找到它被复制/粘贴的所有位置以便做出改变。但我说的或多或少是单文件/单类或功能内的一种困境。此外,如果我没有正确执行,请随时修复我的标签/标题。我不太确定如何正确命名/标记这篇文章。

4

5 回答 5

3

任何不是算法/数据结构问题的优化问题的答案都是:分析您的代码!仅优化显示为问题区域的事物。

这意味着您应该确定函数调用开销是否实际上是您正在编写的特定程序中的性能问题。如果是,则内联代码。如果不是,不要。就那么简单。

于 2013-06-27T17:10:24.383 回答
1

在我看来,你以错误的方式处理这个问题。首先,你不应该使用多个(else)if,它们都执行相同的代码;将一个与复合或预计算(在这种情况下,由于所有可能的子条件,我建议预计算)条件一起使用。这样的事情可能会使维护代码变得容易得多。

function myFunction() {
  bool condition = something ||
                   somethingElse ||
                   anotherThing ||
                   theLastThing;

  if (condition) {
    // Code line 1
    // Code line 2
    // Code line 3
  }
  else {
  // Not previously used code
  }
}
于 2013-06-27T17:07:09.873 回答
1

是的,创建一个函数,通常你应该遵循 DRY 原则。不要重复自己。

http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

对于这样的事情,您的堆栈操作将是最小的。请参阅 Imre Kerr 对您的问题的评论。

这不仅仅是为了可读性。这么多原因。可维护性是巨大的。如果必须更改此代码,那么其他人出现并尝试找出更改它的每个地方都会很痛苦。只需要在一个地方更改代码要好得多。

于 2013-06-27T17:06:10.927 回答
1

我不知道这是否适用于您提供的示例,但分解代码不是编写函数的唯一原因,您也可以从测试的角度思考

一个函数提供了一个可以单独测试的编程单元。

因此,您可能会将复杂的操作分解为几个更简单/更基本的单元,即使这些函数只被调用一次。

既然你问了几行代码的问题,你可以问自己:

  • 我可以合理地命名这个函数吗?
    (justDoThis应该没问题,doThisAndThatAndThenAnotherThing少这样)
  • 它有合理数量的参数吗?
    (我会说两三个)
  • 是否值得将其作为一个单独的单元进行测试?
    (它是否简化了整体测试)
  • 通过这样的函数调用,代码是否更具可读性/可理解性?
    (如果前两个问题的答案是否定的,则不一定很明显)
于 2013-06-27T22:23:38.720 回答
0

这是一个很好的问题,答案是:视情况而定。

就我个人而言,我会创建一个函数来提高代码的可读性,但如果您正在寻找效率,也许您希望保留复制和粘贴的代码。

于 2013-06-27T17:05:37.860 回答