A Compound Name Is a Code Smell

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

你是否像 textLengthtable_namecurrent-user-email 这样命名变量?这三个都是由多个词组成的复合名称。尽管它们看起来比 namelengthemail 更具描述性,但我强烈建议避免使用它们。我认为,一个比名词更复杂的变量名是一种代码异味。为什么呢?因为当变量的范围非常大且复杂,以至于简单的名词听起来会产生歧义时,我们通常会给它一个复合名称。而一个大而复杂的范围是一个明显的代码异味。

变量的范围是它可见的位置,比如一个方法。看看这个 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

sixnines availability badge   GitHub stars