《编写可读代码的艺术》---不会误解的名字
前面一篇我们讲了把信息塞到到名字中,现在本章关注命名另外一个陷阱:歧义!
在命名的时候,扪心自问,这样的命名会引起歧义吗?
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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端