[如何书写优雅的代码]有意义的命名

[如何书写优雅的代码]有意义的命名

好的命名让人更容易理解和修改代码,但要让命名做到“名副其实”说起来简单,做好却很难,好的命名已经回复了很多大问题,比如这些类、函数、变量为什么存在、做了什么事、应该怎么用,如果名称还需要注释来补充,那就不算“名副其实”。

在起名字的时候,除了最基本的:类名或对象名应该是名词、名词短语,方法名应该是动词、动词短语外,还需要注意以下原则:

1.避免误导

程序员必须避免留下掩藏代码本意的错误线索。
例如,hp、aix、sco都不应该用作变量名,因为它们都是unix平台的专有名称,如果代码跑在别的系统里,这些变量名就会让人很困惑。
尽量别用List、Map、Vector等在编程语言里有特殊意义的量词做变量名,因为从英文角度看List和Group虽然都是类似的,都表示一组,但从代码角度List给人更多遐想空间,除非这个变量真的是List。
提防使用不同之处很小的名称,比如XYZControllerForEffecientHandingOfStrings和XYZControllerForEffecientStorageStrings,以及字母l和字母O,看起来像0的也让人摸不着头脑。

2.做有意义的区分

不要使用类似a[0]/a[1]这种没有任何线索的变量。
废话也是另一种没意义的区分,比如Info、Data、a、an、the这类量词,因为当你看到ProductInfo和ProductData时,你并不能区分其差别。
同理,Variable不应该出现在变量名里,Table也不应该出现在表名里。再设想下,NameString会比Name要好吗?CustomerObject的类名会比Customer类名要好吗?

3.使用读得出来的名称

这个不用多说了吧,每次和别人讨论代码的时候,如果遇到单词界的“畸形儿”时,读着都卡嗓子。

4.使用可搜索的名称

单字母名称和数字常量除了意义难懂以外,还难以检索、查阅。比如想搜索MAX_CLASS_PER_STUDENT要比找单纯的一个数字7要简单。
一般来说,一个变量名称的长度应该和其作用域相对应。

5.每一个抽象概念定一个词

代码中比较类似的概念用相同的单词来表示,在搜索会大大减少绞尽脑汁想怎么搜索的苦恼,比如“获取”这个概念,可以用fetch/get/retrieve等表示,如果不统一,你如何记得哪个方法里的获取用的是get,哪个方法的获取用的是fetch呢?
另外类似语义却用不用单词表示时,还会让人比较困惑这两者之间是否有区别。比如一堆代码里有xxController、xxManager和xxDriver时,就会令人困惑:这几个控制器有啥区别吗?

6.别用双关语

避免将统一单词用于不同目的,或者统一术语用于不同概念。
比如当有个方法名里有add,它的功能是将俩个值连接起来,那么这里的add就是连接的意思了;此时又新增一个方法,功能是把某个个体放到集群里去,那该给这个新方法命名add吗?最好不要这样做,因为add就附带了不同的语义:即表示连接又表示追加,最好使用append或者insert去区分。

7.添加有意义的语境

语境的意义是,当你看到一个变量或者方法的时候,你大致知道它隶属某种更大的概念。比如,变量state、addrState、Address.state,当你在代码里看到这三个孤零零的变量的时候,你能够知道的是,后两个变量是某个地址的状态,但第一个变量就不能自我说明。
所以,除了给变量/方法名加前缀,还可以通过创建类,来给读者一些有用的指示。
但物极必反,适当地给命名加上前缀,只要短名称足够清晰,就比长名称要好。

本文内容属于个人学习笔记,主要信息来源书籍《代码整洁之道》/《Clean Code》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值