The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
你是否像 textLength
、table_name
或 current-user-email
这样命名变量?这三个都是由多个词组成的复合名称。尽管它们看起来比 name
、length
或 email
更具描述性,但我强烈建议避免使用它们。我认为,一个比名词更复杂的变量名是一种代码异味。为什么呢?因为当变量的范围非常大且复杂,以至于简单的名词听起来会产生歧义时,我们通常会给它一个复合名称。而一个大而复杂的范围是一个明显的代码异味。
变量的范围是它可见的位置,比如一个方法。看看这个 Ruby 类:
可见,变量csvFileName
的作用域是initialize()
方法,该方法是CSV
类的构造函数。为什么它需要一个由三个单词组成的复合名称?明明已经很清楚,CSV
类的单参数构造函数期望一个逗号分隔值文件的名称。我会将其重命名为file
。
接下来,@fileName
的作用域是整个CSV
类。将类中的一个变量重命名为@file
不会引起任何混淆。我们仍然清楚我们正在处理的是哪个文件。csvLine
变量也是同样的情况。很明显,我们正在处理CSV行。csv
前缀只是多余的。以下是我对该类的重构建议:
现在看起来清楚简明。
如果你不能执行这样的重构,那意味着你的范围过大和/或过复杂。一个理想的方法应该处理多达五个变量,一个理想的类应该封装多达五个属性。
如果我们有五个变量,难道我们找不到五个名词来给它们命名吗?
亚当和夏娃没有姓氏。他们在伊甸园是独一无二的,正如旧约中的许多其他人物一样。为了解决歧义,后来发明了姓和中间名。为了保持你的方法和类干净和稳固,并防止歧义,请尽量给你的变量和方法以独一无二的单词命名,就像亚当和夏娃被你知道是谁命名一样。
另外,多余的变量也是有害的。
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-18 at 05:08