对于变量的命名规则,向来是争吵不休的。曾经有匈牙利命名法,驼峰命名法等等层出不穷。同时我们也看到,即使统一规定了某种变量命名方法,也往往出现变量名含义不清导致歧义的问题。
而无论是何种命名法,大多都只规定了命名的形式,而对命名的内容这一笔带过。
我认为,无论使用何种命名的形式,都应该遵循以下三个命名基本原则:
-
功能性
- 不应重复声明在父级声明的功能
- 约定俗成的除外
-
消歧义
- 消歧义范围仅限作用域有重叠的
- 消歧义词语应该对应(
Async
对应Sync
等) - 消歧义时尽量不使用
Not
-
最简
-
不得违反前两条原则
-
添加的消歧义词语应该最简
-
我们用这样一段代码作为示例进行讲解:
namespace Notepad
{
public class NotepadConfig
{
string[] mainConfig;
public void ClearConfig( )
{
for (int cnt = 0; cnt < mainConfig.Length; cnt ++)
mainConfig[cnt] = "";
}
public void ClearConfigToNull( )
{
mainConfig = null;
}
}
}
这一段 C# 代码,乍看命名上问题不大,实则存在着严重的命名问题。
第 3 行中:
NotepadConfig
是管理配置的类,而非配置类本身。不符合功能性原则。应用Configer
代替Config
;Notepad
命名空间中(目前)不存在其他的类。符合消歧义原则;NotepadConfig
已存在于Notepad
命名空间下。不符合最简原则。应删去Notepad
;- 综上所述应改为
Configer
类。
第 5 行中:
mainConfig
表明了其作用。符合功能性原则;- 没有与
mainConfig
处于同一作用域的变量,符合消歧义原则。 - 没有与
mainConfig
相对的其他储存配置的字段。不符合最简原则。删掉main
; - 综上所述应改为
config
字段。
第 6 行与第 11 行:
ClearConfig(ToNull)
表明了其作用。符合功能性原则;ClearConfig
没有对应消歧义词,因添加ToEmpty
;ClearConfig(ToNull)
已存在于Config
类下。不符合最简原则。应删去Config
;- 综上所述应改为
ClearToEmpty
和ClearToNull
方法。
第 8 行:
- 在循环体内使用
i
作为计数器是约定俗称的,可以不遵守功能性原则。
按三原则修改后的代码如下:
namespace Notepad
{
public class Configer
{
string[] config;
public void ClearToEmpty( )
{
for (int i = 0; i < config.Length; i ++)
config[i] = "";
}
public void ClearToNull( )
{
config = null;
}
}
}
对比这两段代码,我们不难发现:
- 功能性原则让我们在调用和调试时无需确认其真实功能;
- 消歧义原则避免了错误的调用(这在调试时是极难发现的);
- 最简原则保证不会出现过长的代码行,进一步提升了理解和维护代码的速度。