整洁代码的理解

前段时间看了《代码整洁之道》这本书,书中的一些观点讲的很不错,这些观点很容易让人对号入座,也很容易让人知道自己写的代码是否漂亮、是否整洁。通过这篇文章记录下读后感和书中的一些观点。

为什么要整洁代码

  • 很多时候我们修复bug或开发新功能时都会先看看周边的相关代码(开发过程中经常碰到前面写的代码到后面就忘了,回看代码是常事),如果想要bug或新功能写的轻松那自然就要求代码阅读也轻松。不整洁的代码阅读起来会轻松吗。
  • 相信很多人都不愿意去接手别人写的二手代码,为什么呢,因为很多人写的代码质量很一般,让其他的人阅读他的代码很是困难。所以整洁的代码也能帮助其他人轻松的理解自己的代码。

整洁代码核心思想

如何在意代码
这跟生活是一个道理,当你真正在意某件事情的时候,在意到什么程度,事情在意程度不一样,对事情的处理态度和方式也不一样。所以只有你真正的在意你写的代码,你才会去关注代码的质量,写出整洁漂亮的代码。

我有一个Android开发的QQ群,经常在群里听到有人说公司领导不在乎代码质量和实现过程,只关注结果,所以他们也不关注自己写的代码是否漂亮是否整洁,只求赶快完成功能交差。我相信有很多这样的程序员都是这样,只追求功能实现,从来不管代码写的怎么样,因为他们不注重自己写的代码怎么样,他们只看重自己能不能在规定时间内向领导交差。

天敌:后面再优化

很多程序员都有一个习惯,经常会说:先实现目前的功能,等后面有时间了再来优化代码。其实大家也知道结果了,基本上大部分的人后面都不会去做什么代码优化,前面的说辞也变成了说说而已。

所以写代码的时候如果当时能写出更好的代码就当时一次性写好,不要想着以后再去优化,这基本是不可能的了。时间长了就会在不知不觉中养成习惯,如果每次都想着以后再优化,那每次写代码基本上都不会去关注代码的质量,相反每次编码都尽自己最大努力去写好,时间长了你的代码质量和要求自然就上去了。

什么样的代码是整洁代码

  • 代码逻辑一目了然,很清楚方法、类、模块做的是什么事情
  • 整洁的代码只专注于做好一件事(不论是方法、类还是模块),处理的事情多了,自然就会让逻辑变的复杂
  • 让代码块小,小块的代码便于阅读和理解
  • 尽量减少依赖,让代码便于维护
  • 性能调至最优,省得引诱做没规矩的优化,搞出一堆混乱代码来
  • 依据某种分层战略完善错误处理代码

如何写出整洁代码

减少重复代码

当代码中一段代码多次出现的时候,就表示某种想法没有在代码中得到良好的体现。所以减少重复代码以提高代码表达力,尽早构建简单抽象。

使用异常代替错误码

错误码通常是枚举或者是常量,而这样的错误码就像磁铁一样,导致所有用到这些错误码类都需要导入引用它,一旦错误码需要修改就需要修改所有的这些类。而使用异常则不会存在这些问题,新异常可以从异常类里直接派生出来,而不需要修改已有代码。

有意义的命名

命名要名副其实

选一个好的名称是比较耗费时间的,但是一旦选对了名称那省下的时间是很可观的。类名、变量名、方法名应该就可以答复大部分的问题,例如它做了什么事,怎么做。如果名称需要注释来补充,那就不算名副其实。

避免误导
  1. 例如:字母l和数字1,字母o和数字0,这两种就很容易让人傻傻分不清
  2. 不要使用外形太像的命名方式,比如:ControllerForEfficientHandlingOfStrings和ControllerForEfficientStorageOfStrings,这种名称很长又只有细微差别的命名方式很容易迷惑
  3. 不要使用有特殊意义的字符串来命名。
    做有意义的区分
    1
    2
    3
    4
    5
    public static void copyChars(char a1[], char a2[]) {
    for(int i = 0; i < a1.length; a1++) {
    a2[i] = a1[i];
    }
    }

上面的代码虽然很简单,但是命名方式还是很有问题的,如果把参数名分别改为source和destination对整个方法的实现来说就要清晰很多

使用读得出来的名称

命名的时候尽量使用大众熟知的单词,不要使用自造词、拼音单词混用或是自己偷懒将单词进行简写之类,这样的命名只会增加代码的阅读负担,让人看的云里雾里。

使用可搜索的名称

在阅读代码的过程中常用的功能就是搜索,所以一个方便搜索的名称还是很重要的。
比如一个字符串最大长度只允许为7,代码中有好几个地方需要做这种判断,但是经常就有人偷懒直接使用数字7进行判断,那在代码搜索的时候是搜索7容易还是搜索MAX_LENGTH_SEVEN容易,答案很明显了。

对于搜索来说,长名称胜于短名称,搜得到的名称胜于用自造编码代写的名称。

类名、函数名
  1. 类是对一类具有共同特征的事物的抽象,所以类和对象名应该是名称或名词短语,而不应该是动词
  2. 方法通常是完成了一件什么事,所以方法名应当是动词或动词短语。
函数

让函数表达其意图,该给函数赋予哪些属性,好让读者一看就知道函数是什么样的程序

  1. 函数第一规则就是要短小、尽量的短小
    • 很多人在看别人的代码的时候一旦遇上很长的函数,心理就开始打退堂鼓了,为什么呢?其实很重要的一个原因就是因为长函数的实现逻辑都弄的比较复杂,而且这个函数可能做了好几件事,阅读起来会让人很吃力。而短小的函数一眼看上去逻辑就比较清晰简单,至少阅读的人心理上就要好受很多。
  2. 函数只做一件事
    • 每个函数应该只做一件事,如果一个函数实现里做了多件事,那势必会让这个函数变的比较长。
  3. 函数参数尽量少
  4. 输出参数比输入更难以理解,尽量以返回值作为输出
    • 很多人在方法实现的时候喜欢将List作为方法参数输入而方法返回类型为void(在Android开发中尤其多),然后在方法实现里修改List的元素,后面直接用这个List作为修改后的List。这种写法稍不注意就会引发bug,而且不容易被发现。
  5. 不要用标记参数(boolean)
    • 使用标记参数会增加函数的理解度和复杂度。一旦使用标记参数,就意味着你的函数实现里其实是做了两件不同的事。
  6. 将多个参数封装成一个类
    • 如果一个函数有多个参数的话,就需要考虑将这些参数封装成一个类,使用对象作为参数输入了。
  7. 不要在函数中做函数名以外的事情
  8. 抽离try-catch代码块
    • 处理错误异常也是一件事,所以要抽离
  9. 将被调用函数的实现直接定义在调用者的下方
    • 使用这种方式方便阅读,避免阅读过程中来回的代码切换。
    • 在web开发中jslint有条规则是将方法安装字母顺序进行排序,我个人不太认可这种方式,我认为将被调用函数的实现直接定义在调用者的下方这种方式比较好。

避免急于求成

编码的时候先按照思路实现,然后再斟酌打磨,按照规则打磨出整洁的代码。要想一次就写出完美的代码是不太可能的。先按思路实现,等你实现完可能就会发现有更好的实现方式,或者是更好的命名,这时慢慢的斟酌,慢慢的修改。


原创文章,转载请出处注明。

下面是我的个人公众号,欢迎关注交流

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×