代码洁癖系列(二):命名的艺术

不知道你们还记不记得《家有儿女》里有这么一段经典台词:“我叫夏雪”,“我叫夏雨”,“我叫夏冰雹”。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


 getThem是get什么?



list里存的是什么flex



 keys指的是什么,为何遍历它



常量”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呢?亲自试过以后相信你会回来点赞的。


类名和方法名

类名和方法名也要遵循上面的规范,除此以外,它们还有各自的规范:、


   类名不该该是动词,避免使用Data、Info这样的词汇



  方法名应该是动词,好比,saveXXX、deleteXXX


要专注

假如你在不一样的类中,分别定义了方法getXXX、fetchXXX和findXXX,我要调用的时候怎么知道某个类中应该使用哪一种方法?因此,为何不都用getXXX的形式呢?这样不管是对写代码的人仍是对调用的人来讲都是莫大的喜讯。

适当添加语境

当你一些变量:firstName、lastName、street、houseNumber、city、state、zipcode。咱们能够很轻易的判断出,他们组合在一块儿表示一个地址。那么把state单独拿出来呢?你还能知道它是什么意思吗?这时,咱们能够把变量命名为addrState、addrFirstName……这样即使单独看某个变量,也会理解它要表达什么。固然更好的方法是定义一个名为Address的类,把这些变量放到类中,事实上咱们也都是这样作的。


固然,有时候也不能添加一些无心义的语境。咱们要开发一个“画图”的应用,那在每一个类名前加Drawing可不是什么好主意。


结语

命名并不能算是什么技术,而是一种写代码的习惯,但这种习惯有可能会决定你做为一名程序员给人的第一印象。因此,养成一个好的命名习惯,也是对本身形象的维护。同时还能让本身的生命安全更有保障(避免被同事……

END
往期精彩回顾
代码洁癖系列(一):什么是整洁代码



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

相关文章
相关标签/搜索