Coding style 关于变量/函数命名约定的思考

Coding style 关于变量/函数命名约定的思考,coding-style,Coding Style,我一辈子都在断断续续地写代码。我主要是编码Perl,但也有一些java、PHP、C++、C++。我甚至尝试过Emacs Lisp,并且偶尔编写了shell脚本。然而,我从来没有真正接触过这门学科来获得任何专业知识——其他事情对我来说有着更高的优先级。我不认为自己真的精通任何语言,但Perl,现在也是Haskell,我现在正在学习一门课程。 最近,我一直在思考我的编码风格。不是实际代码的样式;作为一名CS学生,我只为娱乐或学校做项目,这使我几乎总是能写出我认为漂亮的代码。有一个问题特别困扰着我。这

我一辈子都在断断续续地写代码。我主要是编码Perl,但也有一些java、PHP、C++、C++。我甚至尝试过Emacs Lisp,并且偶尔编写了shell脚本。然而,我从来没有真正接触过这门学科来获得任何专业知识——其他事情对我来说有着更高的优先级。我不认为自己真的精通任何语言,但Perl,现在也是Haskell,我现在正在学习一门课程。

最近,我一直在思考我的编码风格。不是实际代码的样式;作为一名CS学生,我只为娱乐或学校做项目,这使我几乎总是能写出我认为漂亮的代码。有一个问题特别困扰着我。这是一件很奇怪的事情,但我还是想听听其他的意见

事情是这样的:我发现自己花了相当多的时间将函数和变量命名为我能想到的最容易理解的名称。有时,这项任务可能非常乏味,即使没有考虑到查找传达代码含义的变量名的困难。例如,现在我正在做一个函数,看起来像这样

这是Haskell代码,但其含义应该非常清楚。(它的确切含义并不那么重要,因此如果您愿意,只需跳过代码并继续阅读即可。)

——返回包含最少个空值的行
bestRow::[[Maybe Int]->Int->Maybe(Int,Int)
bestRow[]uz=无
最佳行(行:行)此索引
|nextRow==Nothing&&thisFilled>8=Nothing
|nextRow==Nothing=Just(thisIndex,thisFilled)
|thisFilled>=nextFilled=Just(thisIndex,thisFilled)
|thisFilled
我无法决定变量名。这个函数很好地完成了它的任务,但它并没有尽可能清晰。一旦我确定了解决方案,我就花了15分钟来命名和重命名变量。我应该使用curIndex、nextIndex | | | index、nextIndex | | ind、indN等吗?在我决定完成15分钟后,我意识到这个功能根本不需要:我找到了一个更好的解决问题的方法。我浪费了很多时间,只是简单地清理代码,对任何人都没有用,尤其是对我。至少感觉是这样

这件事发生在我身上不止一次,而且相当令人沮丧,主要是因为它让我觉得自己很笨。你对这个问题有什么看法?这是你经历过的,是我做事的方式有问题还是不可避免的

是否有“完美”的变量名,或者如果它们至少不会混淆您的代码,那么它是否“正常”

谢谢


Stefan Kangas

变量和函数的好名字可以让代码更容易理解。好的名称应该描述变量或函数的用途。当需要进行更改时,坏名字会使其他编码人员感到困惑


清晰的代码很好。

阅读罗伯特·C·马丁的《清洁代码》一书

有一件事他详述了,那就是命名。变量和函数名应尽可能精确。如果您需要注释来描述它,则该函数要么做得太多,要么名称更清晰

目标是让代码读起来像一个故事。更改变量和函数名,并在必要时将其分解为多个函数或变量,以实现此目标


伟大的书,值得每一分钱

我认为这是心理上的,我总是认为我的变量等除了我之外任何人都读不懂,即使我总是在代码中添加注释

每当我必须阅读其他人的代码时,我都非常惊讶,我可以轻松地阅读他们的代码,而不必阅读每一条注释,当他们如此清晰地阅读我的代码时,同样的事情也会发生,我做得很好;)

我认为只要你的评论是有意义的,并且确实描述了一个方法的作用,那么一个变量对你来说是什么就可以了


其中一个技巧就是要确保你的评论是最新的。我见过太多的代码,其中一个方法的注释没有改变,但方法代码却改变了……这可能会让人非常困惑

+1-变量和函数名称本身应为注释。也就是说,有一些毫无意义但行之有效的命名实践(如控制循环的
i
j
k
)最好遵循,因为该领域的每个人都希望事物已经以这种方式命名。一般来说,从书中可以看出,变量的范围越短,它的名字越短。因此,循环中的控制变量可以是1个字符……这是一个公认的做法,这是预期的。但是如果变量事先有描述性名称,那么这些注释就不必要了。例如如果您看到一个名为“email”的变量,它是什么?它是个人的电子邮件地址吗?或者它是一个布尔值,指示他们是否希望接收电子邮件?或者一个布尔值,指示他们是否有电子邮件地址。如果它被命名为hasEmail或emailAddress,我们会更确定。即使你有评论,我真的不想滚动到定义来找到答案。与不清理并保留错误代码相比,清理错误代码然后扔掉它所花费的时间可能更少。我希望和我一起工作的人和你一样担心变量命名。
-- return the row with least number of Nothing values
bestRow :: [[Maybe Int]] -> Int -> Maybe (Int,Int)
bestRow [] _ = Nothing
bestRow (row:rows) thisIndex
   | nextRow == Nothing && thisFilled > 8 = Nothing
   | nextRow == Nothing       = Just (thisIndex,thisFilled)
   | thisFilled >= nextFilled = Just (thisIndex,thisFilled)
   | thisFilled <  nextFilled = nextRow
     where thisFilled             = length $ filter (/= Nothing) row
           nextRow                = bestRow rows (thisIndex + 1)
           (nextIndex,nextFilled) = fromMaybe (-1,-1) nextRow