前面一篇我们讲了把信息塞到到名字中,现在本章关注命名另外一个陷阱:歧义!
在命名的时候,扪心自问,这样的命名会引起歧义吗?
1:避免容易引起歧义的单词
People.Filter("year<='2011'");
告诉我,你看到这个方法的时候,猜测的结果是筛选掉2011之前的数据,还是筛选出2011之前的数据?
2:使用min和max表示(包含)极限
比如下面的代码用来检测购物车的容量不能超过10个
int Const CART_CAPCITY_LIMIT=10; if(CartItemlList.Count()>=CART_CAPCITY_LIMIT) Debug.Log("cart full")
你能一阵见血的看出代码问题出在哪了吗?
购物车商品在10个的时候,程序竟然提示已满!
int Const CART_MAX_ITEM=10; if(CartItemlList.Count()>CART_MAX_ITEM) Debug.Log("cart full")
经过我们的改动,上面程序表达的意思是,购物车商品超过限制,就提示。不易产生歧义
一旦开发组里面形成了这种命名规范,排查类似隐藏的错误将会变得容易
3:使用fisrt和last来表示(包含)范围
比如我们要统计年收入
void SumDurationIncome(int startYear,int stopYear)
SumDurationIncome(2011,2013) 的统计涵盖2013年吗?可能你就要切回源码去看了。
那么这样呢?
void SumDurationIncome(int firstYear,int lastYear)
我们就能很明白了,从2011年到2013年,都纳入统计范围。
4:使用exclusive来描述(不包含)范围
英语里面,很难找到明确描述不包含的单词,所以,为了不发生歧义,我们使用exclusive来描述不包含的范围,比如
void SumDurationIncome(int firstYear,int exclusiveLastYear)
就很明确的表示,统计我的收入阶段,从制定年份开始,到截止年份之前
5:让布尔值“名副其实”
比如下面的命名
bool readPassword = true;
我们猜测这个变量时干啥用的?
- 我们需要读密码(isNeedReadPassword)
- 我们已经读了密码(isPasswordBeenReaded)
为了能描述这个布尔值的创建意图,我们可能需要加上 is(是否)、can(能否)、has(拥有)、should(应该)等前缀,来明确语义
另外,避免使用反义名词
bool isDisableEncrypt = false;
上面的代码就是允许用户加密啊,为毛还得转个弯呢。。,下面是它的原意。。
bool isEnableEnctypt = true;
6:符合使用者的预期
在我们印象里面,属性大概是这样的
public int Salary { get; set; }
如果属性的实际情况是这样
Public int Salary { get{循环1000次,从中取出平均值,返回}; set; }
在不知情的情况下,我们频繁调用这个Salary可能就掉坑里面去了。。
所以这时我们取名就要暗示:这个方法会很耗费性能,你使用的时候,最好弄个变量存储起来,不要频繁调用。
//计算薪水 int ComputeAVGSalary();