【发布时间】:2013-06-27 17:00:22
【问题描述】:
我有一个特定的函数使用相同的代码行(很少,2-5 取决于我如何更改它以适应未来可能的用途)代码行 4 次。
我查看了this question,但它对我来说不够具体,也不符合我的方向。
这里有一些伪:
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 - 我知道如果这段代码要在不同的(类)或源文件中使用,将它变成一个函数以避免需要找到它被复制/粘贴的所有位置是合乎逻辑的为了做出改变。但我说的或多或少是一种两难的单文件/单类或函数内。 此外,如果我没有正确执行,请随时修复我的标签/标题。我不太确定如何正确命名/标记这篇文章。
【问题讨论】:
-
许多编译器/解释器可以/将在可能的情况下内联函数,这意味着除非您的函数是递归的(有时即使如此,请参阅tail call),您可以毫无开销地调用它。
-
我刚刚阅读了一些关于内联函数的内容 - 是 C/C++/C# 特定的吗?还是 Javascript 编译器也这样做?我没有指定任何我希望函数内联的标志,而且我不确定 JS 编译器是否会自动知道何时使函数内联。你有什么想法吗?
-
我不确定 Google 的 JS 服务,但 IonMonkey(Firefox 使用的编译器)有函数内联。所以在JS中绝对可以做到。至于内联哪些函数,打开内联的编译器将内联每个他们认为“简单”到值得内联的函数。
-
好的,我知道谷歌,我确信他们的 JS 服务就是这样做的!
-
性能方面我只能说这取决于。许多环境(例如 .net 和 JVM)可能会为您内联它。我会这样做是为了提高可读性,然后检查它是否会对性能产生负面影响,但这不太可能。
标签: function language-agnostic code-readability