【问题标题】:Thoughts on variable/function naming conventions关于变量/函数命名约定的思考
【发布时间】:2009-10-01 19:11:57
【问题描述】:

我一生都在编码。我主要编写 Perl,但也编写了一些 Java、PHP、C、C++。我什至尝试过 Emacs Lisp,并且偶尔会编写 shell 脚本。然而,我从来没有真正参与过这个主题来获得任何专业知识——其他事情对我来说有更高的优先级。我不认为自己真正精通任何语言,除了 Perl,还有我现在正在学习的 Haskell。

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

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

这是 Haskell 代码,但意思应该很清楚。 (它的确切含义并不那么重要,所以如果您愿意,只需跳过代码并继续阅读。)

-- 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

我无法决定变量名。该功能很好地完成了任务,但还不够清晰。确定解决方案后,我花了 15 分钟来命名和重命名变量。我应该选择 curIndex,nextIndex ||索引,下一个索引 || ind、indN 等?在我决定完成 15 分钟后,我意识到这个功能根本不需要:我找到了一个更好的解决方案来解决我的问题。 BOOM 我浪费了很多时间,只是简单地清理代码对任何人都没有用,尤其是对我来说。或者至少感觉是这样的。

这件事发生在我身上不止一次,而且非常令人沮丧,主要是因为它让我感到愚蠢。你对这个话题有什么看法?这是你经历过的事情,是我做事方式有问题还是只是不可避免的事情?

是否有“完美”的变量名称,或者如果它们至少不会混淆您的代码,它是否“可以”?​​p>

谢谢,

斯蒂芬·康加斯

【问题讨论】:

  • 与不清理并保留它相比,清理坏代码然后将其丢弃所浪费的时间可能更少。我希望和我一起工作的人和你一样担心变量命名。

标签: coding-style


【解决方案1】:

阅读 Robert C. Martin 的《清洁代码》一书

他详细介绍的一件事是命名。变量和函数名称应尽可能准确。如果你需要注释来描述它,要么是函数做的太多,要么名称可以更清晰。

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

好书,一分钱一分货

【讨论】:

  • +1 - 变量名和函数名本身应该是 cmets。也就是说,最好遵循一些毫无意义但已确立的命名实践(例如 ijk 用于控制循环),因为该领域的每个人都希望事物已经以这种方式命名。
  • 一般来说,再次从书中,变量的范围越短,它的名字就可以越短。因此,循环中的控制变量可以是 1 个字符......这是一种成熟的做法,这是预期的。
【解决方案2】:

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

代码的清晰度很好。

【讨论】:

    【解决方案3】:

    我认为这是心理上的,我一直认为我的变量等对除我之外的任何人都是不可读的,即使我总是将 cmets 放在我的代码中。

    每当我不得不阅读其他人的代码时,我都非常惊讶我可以轻松阅读他们的代码而无需阅读每条评论,当他们如此清晰地阅读我的代码时,完全相同的事情发生了我正在做干得好;)

    我认为只要你的 cmets 有意义并且实际描述了一个方法的作用,你应该使用什么变量就可以了。

    一个提示是始终确保您的 cmets 是最新的。我见过太多次代码,其中方法的 cmets 没有改变,但方法代码却......这可能非常混乱!

    【讨论】:

    • 但是如果你的变量事先有描述性的名字,那些 cmets 是不必要的。例如。如果您看到一个名为“email”的变量,它是什么?它是个人电子邮件地址吗?或者它是一个布尔值,表示他们是否想要接收电子邮件?或者一个布尔值,指示他们是否有电子邮件地址。如果它被命名为 hasEmail 或 emailAddress,我们会更加确定。即使您有评论,我也真的不想向上滚动到定义来找到答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多