不知道你们还记不记得《家有儿女》里有这么一段经典台词:“我叫夏雪”,“我叫夏雨”,“我叫夏冰雹”。java
刘星本身给本身起的名字承包了我全部笑点。但仔细想一想这名字取的居然还挺不错,不但有意义,还和夏雨夏雪的名字相呼应。程序员
回到主题,在咱们的代码里,命名是随处可见的,好比给包命名,给类命名,方法名,参数名,变量名等等。那么什么样的命名才算是好的命名呢。这就是咱们今天要讨论的。安全
名副其实微信
首先仍是要强调这一点,我读过的糟糕的代码有一个共同的特色,那就是代码中存在大量随意的,无心义的命名。好比:表示消耗多少小时的变量命名为h,同做用域中还有一个想要表示“小时”相关的变量直接命名为h1,一个List类型的变量就命名为list。读这种代码不会使人开心,同时写这种代码的程序员的人身安全是没法保证的。编辑器
public List<String> getThem() {
List<String> list = new ArrayList<>();
for (String key : keys) {
if (theMap.get(key) == 1) {
list.add(key);
}
}
return list;
}
读一下上面这段代码,能看出有什么问题吗?或者说看完有人明白这段代码要作什么吗?学习
我先来讲一下个人问题:fetch
list里存的是什么flex
常量”1“的意义是什么spa
这几个问题可能只有写这段代码的人才能解释(没错,就是我写的)。因此我来给你们解释一下,不过我不想一一回答上面的问题,我把代码重写一遍,看看还会不会有这样的问题。.net
public List<String> getPaidOrderIds() {
List<String> paidOrderIds = new ArrayList<>();
for (String orderId : orderIds) {
if (orderStatus.get(orderId) == OrderConstatn.PAID) {
paidOrderIds.add(orderId);
}
}
return paidOrderIds;
}
怎么样,上面的问题都清楚了吗,若是不清楚能够私下和我联系,我会给你推荐一个很是好的英语学习软件。
这就是名副其实的重要性。
避免误导
命名过程当中要注意的第二点就是要避免名称对别人产生误导,例如上面代码中paidOrderIds这个变量,若是咱们命名成paidOrderIdList呢,看起来彷佛没什么问题,可是若是这个变量是Set类型或者其余类型呢?命名为xxxList还合适吗,别人读代码的时候会下意识的认为这是个List类型的变量(尽可能避免名称中出现类型的名字)。
另外一点容易产生误导的是数字和字母相像的状况,好比,我命名一个变量叫作O1,在编辑器里就很难分辨是O1仍是01,若是我写一个这样的表达式
O0=l1;
估计别人会觉得我发明了什么新的语言吧。
第三点是要避免区别较小的两个名称,好比XYZContinentController和XYZCentinentController这样的命名,对于读代码的人来讲简直就是灾难,对于写代码的人来讲也存在很大的风险。(为何不是灾难?由于大部分人都是Ctrl+C/Ctrl+V的,这样就减少一些出错的概率。看来善用Ctrl+C/Ctrl+V仍是颇有必要的)
作有意义的区分
编译器要求咱们在同一个区域内不能重复命名。那么有的程序员就会写出a1,a2,a3……这样的命名,这看起来很烂,谁也不知道它们有什么区别。再举过来一个栗子,一个包中有两个类,Product和ProductInfo,这时让你查一下商品名称,你知道要去哪一个类里找吗?事实证实,这样的命名与a1,a2,a3之流别无二致。
既然要作区分,为何不作些有意义的区分呢,一个类叫作Product,表示商品信息,另外一个叫作ProductStocks表示商品的库存信息。这样是否是更清晰一点呢,固然,我这里只是举个栗子,实际上可能不须要这样定义。
别随意使用简写
不要随意使用简写,除非是你们都知道的简写。好比美国的命名写成US,你们均可以理解,而若是generateCode写成genCode就使人费解了。
使用能够被搜索的名称
像咱们在一开始的那段代码,为何要把常量“1”写成OrderConstatn.PAID,不只是为了可读,也是为了可搜索,试想,若是你要找这段代码,去搜索数字1,会有多少结果?搜索PAID呢?亲自试过以后相信你会回来点赞的。
类名和方法名
类名和方法名也要遵循上面的规范,除此以外,它们还有各自的规范:、
方法名应该是动词,好比,saveXXX、deleteXXX
要专注
假如你在不一样的类中,分别定义了方法getXXX、fetchXXX和findXXX,我要调用的时候怎么知道某个类中应该使用哪一种方法?因此,为何不都用getXXX的形式呢?这样不管是对写代码的人仍是对调用的人来讲都是莫大的喜讯。
适当添加语境
当你一些变量:firstName、lastName、street、houseNumber、city、state、zipcode。咱们能够很轻易的判断出,他们组合在一块儿表示一个地址。那么把state单独拿出来呢?你还能知道它是什么意思吗?这时,咱们能够把变量命名为addrState、addrFirstName……这样即使单独看某个变量,也会理解它要表达什么。固然更好的方法是定义一个名为Address的类,把这些变量放到类中,事实上咱们也都是这样作的。
固然,有时候也不能添加一些无心义的语境。咱们要开发一个“画图”的应用,那在每一个类名前加Drawing可不是什么好主意。
结语
命名并不能算是什么技术,而是一种写代码的习惯,但这种习惯有可能会决定你做为一名程序员给人的第一印象。因此,养成一个好的命名习惯,也是对本身形象的维护。同时还能让本身的生命安全更有保障(避免被同事……

本文分享自微信公众号 - 代码洁癖患者(Jackeyzhe2018)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。