你的辅助函数命名规范是什么?

12
在函数式编程中,优化任何“循环”代码以实现尾递归通常非常重要。然而,尾递归算法通常分为两个函数 - 一个设置基本情况,另一个实现实际的循环。一个好的(虽然学术性质的)例子是反转函数。
reverse :: [a] -> [a]
reverse = reverse_helper []

reverse_helper :: [a] -> [a] -> [a]
reverse_helper result [] = result
reverse_helper result (x:xs) = reverse_helper (x:result) xs

"reverse_helper"并不是一个好的、描述性的名称。然而,"reverse_recursive_part"只是笨拙的。

你会为这样的辅助函数使用什么命名惯例?


很抱歉,我现在正在进行一个Haskell项目,这也启发了我的问题。我本可以给出Python/Java的例子,但在命令式语言中,这样的辅助函数并不是那么有用。 - Cybis
循环,foo,go或只是g。当然,使其内部化,不可像您展示的那样全局访问。如果必须是全局的,则为yourfunctionsname_aux。至于带撇号的名称,我个人非常非常不喜欢它们。我们命名事物是为了区分它们,而longfunctionname'与其非带撇号的对应项相比,可以说是没有什么区别。 - Will Ness
7个回答

24

只要不把辅助函数放在“全局”命名空间中,你可以随意命名辅助函数,这并不重要。添加一个"prime"似乎是常见的做法。例如,在Haskell中:

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs

8

我同意ShreevatsaR的观点,如果您不将辅助函数设为顶层函数(或更糟糕的是,将其放在导出列表中),那么它的名称就无关紧要了。 我倾向于将辅助函数称为fg

reverse :: [a] -> [a]
reverse = f []
  where
    f ys []     = xs
    f ys (x:xs) = f (x:ys) xs

我通常会对一些小的函数采用这种命名方式(否则我就不知道f代表什么)。但是,为什么要写那么大的函数呢?

不过,如果你想要输出你的“辅助”函数,因为它可能对其他人有用,那么我会把它命名为:

reverseAccumulator

像 Haskell 的 zipzipWith 一样。 但我不会称它们为“ helper ”函数,zipWith 只是一个通用函数,而 zip 则是默认实现(可能是最常用的实现方式)。

我喜欢使用质数(rev-> rev'=,正如ShreevatsaR所建议的那样),但我认为这应该是被接受的答案,因为它具有普适性,并且与库中的约定相关。 - Bladt

7

我总是使用do_,比如说"do_compute"和"compute". 我认为这样的命名很具描述性,因为它实际上是函数执行操作的一部分,而被调用的"compute"需要对外界有一个简单的描述性名称。


4
我使用auxfoo_aux(针对主函数foo)并嵌套定义,以便不会在外部可见。

3

我倾向于在末尾添加“_recurse”,所以是“reverse_recurse”。不确定我从哪里得到这个想法。就像您在示例中所示,我喜欢保持基本情况函数的简单性。它往往是“公共”函数,并且使用辅助函数执行迭代的事实对调用方来说并不重要。在javascript中,有时我甚至通过闭包隐藏迭代函数,以使其真正清楚地表明不应直接调用。


3
我也同意ShreevatsaR的观点,在这个例子中,我会将helper函数设为私有函数。
对于其他需要在整个模块中可见但不导出的帮助程序函数的情况,我倾向于在函数前加上“_”前缀。当然,有明确的导出语句,但在开发过程中,我倾向于导出所有函数以便于交互式探索,例如在ghci中。稍后我会添加导出函数列表,下划线使得很容易记住我是否打算将函数设为局部函数。

1

建立和执行

例子:

function whateverSetup() { ... }
function whateverExecute() { ... }

2
如果函数是公共的,那么whateverSetup是一个可怕的名称。 - Cybis
@[Cybis]: 应该暗示您用适当的描述性术语替换“whatever”,例如WidgetSetup,WidgetExecute等。 - Steven A. Lowe
Steven:我认为他的意思是,“Setup” 不是一个适合导出函数的后缀。 - Bladt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接