本文与咱们聊一聊编程中十分要害的一个点,怎样更好的对代码命名。
一、导言
《代码整齐之道》这本书提出了一个观念:代码质量与其整齐度成正比,洁净的代码,既在质量上牢靠,也为后期保护、晋级奠定了杰出基础。书中介绍的规矩均来自作者多年的实践经验,包含从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资学习的价值。
但咱们知道,许多时分,抱负很饱满,实际很骨感,也知道人在江湖,情不自禁。由于项目的紧迫性,需求的多样性,咱们无法时时刻刻都写出整齐的代码,坚持自己输出的都是高质量、高雅的代码。
但若咱们了解了代码整齐之道的精华,咱们会知道怎样让自己的代码愈加高雅、整齐、易读、易扩展,知道真实整齐的代码应该是怎样样的,或许就会逐渐养成继续输出整齐代码的习气。
而且或许你会发现,若你一向坚持输出整齐代码的习气,长时刻来看,会让你的全体功率和代码质量大大提高。
二、本文触及知识点思想导图
先放出这篇文章所触及内容知识点的一张思想导图,就开端正文。咱们若是疲于阅览文章正文,直接看这张图,也是能够Get到本文的首要知识点的大约。
三、高质量代码的命名规律
1 当之无愧
当之无愧说起来形似很简单,但真实做起来,好像没那么简单。选个好姓名要花一些时刻,但其实选好姓名之后省下来的时刻,要比之前选姓名时花掉的时刻多得多。
咱们一旦发现有更好的称号时,就应该换掉之前的旧称号,这样做读你代码的人(包含你自己),都会很高兴。
一个好的变量、函数或类的称号应该现已几乎答复了一切的大问题。它应该告知你,这个称号所代表的内容,为什么会存在,做了什么事情,应该怎样用等。
假设一个称号需求注释来弥补才能让咱们了解其真实意义,那其实就不算是当之无愧。(并不是说不需求注释,恰如其分的注释是程序员让自己代码如虎添翼的好办法,关于注释的一些留意事项,稍后会有文章专门触及。)
举个栗子:
以下的这句代码里的d就不算是个好命名。称号d什么都没说,它没引起咱们对时刻消逝的感觉,更甭说单位是天了:
[cpp] view plain copy print?
int d; // elapsed time in days||经过了几天时刻
咱们应该挑选这样的指明晰计量目标和计量单位的称号:
[cpp] view plain copy print?
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
2 防止形成误导
咱们应该防止留下躲藏代码原意的过错头绪,也应该防止运用与原意相悖的词。例如,别用accountList来指一组账号,除非它真的是List类型,用accountGroup、bunchOfAccounts,或许直接用accounts,都是更好的挑选。
尽量防范长得太像的称号。想差异XYZControllerForEfficientHandlingOfStrings和XYZControllerForEfficientStorageOfStrings,会花费咱们太多的时刻。由于这两个词,实在太类似了。
以相同的办法拼写出相同的概念才是信息,拼写前后不一致便是误导。
3 尽量做有意义的差异
1.尽量防止运用数字系列命名(a1、a2…….aN)。这样的称号纯属误导,由于许多时分彻底没有供给正确的信息,没有供给导向作者目的的头绪。
2.废话是另一种没有意义的差异。假设咱们有一个Product类,还有一个ProductInfo或ProductData类,那么他们的称号虽然不同,但意思却无差异。这儿的Info、Data就像a、an和the相同,是意义含糊的废话。
留意,只需表现出有意义的差异,运用a、the这样的前缀就没错。例如,将a用在域内变量,把the用于函数参数。
4 尽量运用读得出来的称号
咱们要运用读得出来的称号。假设称号读不出来,评论的时分就会不便利且很为难,乃至让旁人觉得很蠢。
例如,变量称号是beeceearrthreecee,评论的时分读起来几乎像没吃药。
5 尽量运用可查找的称号
单字母和数字常量有个问题,便是很难再一大篇文字中找出来。
找MAX_CLASSED_PER_STUDENT很简单,但想找数字7,就很费事。
相同,字母e也不是个便于查找的好变量名。由于作为英文中最常用的字母,在每个程序、每段代码中都有或许呈现。
称号长短应与其效果域巨细相对应,若变量或常量或许在代码中多处运用,应赋予其以便于查找的称号。
举个栗子,比较如下两段代码:
[cpp] view plain copy print?
for (int j=0; j<34; j++)
{
s += (t[j]*4)/5;
}
和
[cpp] view plain copy print?
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j=0; j < NUMBER_OF_TASKS; j++)
{
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
按整齐代码的要求来评判,榜首段代码会让读者不知所云,第二段代码比榜首段好太多。第二段代码中,sum并非特别有用的称号,但至少他查找得到。选用能表达目的的称号,形似拉长了函数代码,但要想想看,WORK_DAYS_PER_WEEK要比数字5好找得多,而列表中也只剩下了表现咱们目的的称号。
6 取名不要绕弯子
咱们取名的时分要防止思想映射,不应当让读者在脑中把你的称号翻译为他们熟知的称号,也便是说取名不要绕弯子,而是要直白,开门见山。
在大都情况下,单字母不是个好的命名挑选,除非是在效果域小、没有称号抵触的当地,比方循环。循环计数器天然有或许被命名为i,j或k(最好别用字母l),这是由于传统上咱们惯用单字母称号做循环计数器。
程序员一般都是聪明人,聪明人有时会凭借脑筋急转弯夸耀其聪明。而聪明程序员和专业程序员之间的差异在于,专业程序员了解,清晰便是王道。专业的程序员善用其能,能编写出其他人能了解的代码。
7 类名尽量用名词
类名尽量用名词或名词短语,比方Customer, WikiPage,Account, 或 AddressParser。
类名最好不要是动词。
8 办法名尽量用动词
办法名尽量用动词或动词短语。比方postPayment, deletePage, 或许save。
特点拜访器、修改器和断语应该依据其value来命名,并依据规范加上get、set和is前缀。
举个栗子,这儿的getName、setName等命名都很OK:
[cpp] view plain copy print?
string name = employee.getName();
customer.setName("mike");
if (paycheck.isPosted())…
而重载结构器时,运用描绘了参数的静态工厂办法名。如:
[cpp] view plain copy print?
Complex fulcrumPoint =Complex.FromRealNumber(666.0);
一般好于:
[cpp] view plain copy print?
Complex fulcrumPoint = new Complex(666.0);
咱们也能够考虑将相应的结构器设置为private,强制运用这种命名手法。
9 每个概念对应一词,并一以贯之
咱们需给每个概念选一个词,而且一以贯之。
例如,运用fetch、retrieve和get来给在多个类中的同种办法命名,你怎样记得住哪个类中是哪个办法呢?
相同,在同一堆代码中混用controller、manager,driver,就会令人困惑。DeviceManager和Protocol-Controller之间有何底子差异?为什么不全用controller或许manager?他们都是Driver吗?这就会让读者认为这两个目标是不同的类型,也分属不同的类。
所以,关于那些会用到你代码的程序员,一以贯之的命名法几乎便是天降福音。
10 通俗易懂
咱们应极力写出易于了解的变量名,把代码写得让他人能一望而知,而不用让人去十分吃力地去揣摩其意义。咱们想要那种大众化的作者尽责地写清楚的通俗易懂的畅销书风格,而不是那种学者学院风的不流畅论文写作风格。
11 纵情运用解决计划范畴专业术语
记住,只需程序员才会读你写的代码。所以,虽然去用那些计算机科学(Computer Science,CS)范畴的专业术语、算法名、形式名、数学术语。
关于了解拜访者(Visitor)形式的程序来说,称号AccountVisitor赋有意义。给技能性的事物取个恰如其分的技能性称号,一般便是最靠谱的做法。
12 增加有意义的语境
很少有称号是能够自我阐明的。所以,咱们需求用有杰出命名的类,函数或称号空间来放置称号,给读者供给语境。若没能供给放置的当地,还能够给称号增加前缀。
举个栗子,假设咱们有名为firstName、lastName、street、houseNumber、city、state和zipcode的变量。当他们搁一块儿的时分,的确是构成了一个地址。不过,假设只是在某个办法中看到一个孤零零的state呢?咱们会揣度这个变量是地址的一部分吗?
咱们能够增加前缀addrFirstName、addrLastName、addrState等,以此供给语境。至少,读者能够知道这些变量是某个更大变量的一部分。当然,更好的计划是创立名为Address的类。这样,即便是编译器也会知道这些变量是隶属于某个更大的概念了。
别的,只需短称号满足好,对意义的表达满足铲除,就要比长称号更适宜。增加有意义的语境甚好,别给称号增加不用要的语境。
四、小结
其实,取一个好姓名最难的当地在于需求杰出的描绘技巧和共有的文化背景。与其说这是一种技能、商业或办理问题,还不如说这是一种教育问题。
无妨试试上面列出的这十二条规矩与关键,看看你的代码可读性是否有所提高。而假设你是在保护他人的代码,或许是在重构,效果应该会是马到成功的。
五、本文触及知识点提炼收拾
文章最初部分现已用思想导图的办法展示了本文的知识点,这边再贴出一个文字列表版,便利咱们收拾:
关键一:要当之无愧。一个好的变量、函数或类的称号应该现已答复了一切的大问题。一个好称号能够大约告知你这个称号所代表的内容,为什么会存在,做了什么事情,应该怎样用等。
关键二:要防止误导。咱们应该防止留下躲藏代码原意的过错头绪,也应该防止运用与原意相悖的词。
关键三:尽量做有意义的差异。尽量防止运用数字系列命名(a1、a2…….aN)和没有意义的差异。
关键四:尽量运用读得出来的称号。如称号读不出来,评论的时分会不便利且很为难。
关键五:尽量运用可查找的称号。称号长短应与其效果域巨细相对应,若变量或常量或许在代码中多处运用,应赋予其以便于查找的称号。
关键六:取名不要绕弯子。取名要直白,要开门见山,清晰便是王道。
关键七:类名尽量用名词。类名尽量用名词或名词短语,最好不要是动词。
关键八:办法名尽量用动词。办法名尽量用动词或动词短语。
关键九:每个概念对应一词,并一以贯之。关于那些会用到你代码的程序员,一以贯之的命名法几乎便是天降福音。
关键十:通俗易懂。应极力写出易于了解的变量名,要把代码写得让他人能一望而知,而不用让人去十分吃力地去揣摩其意义。
关键十一:纵情运用解决计划范畴专业术语。虽然去用那些计算机科学范畴的专业术语、算法名、形式名、数学术语。
关键十二:要增加有意义的语境。需求用有杰出命名的类,函数或称号空间来放置称号,给读者供给语境。若没能供给放置的当地,还能够给称号增加前缀。