【编写可读代码的艺术】读书小记 一 : 从书写代码改进

目录

1. 代码应该易于阅读和理解。

2.命名时提供额外的信息

3.使用不会被误解的名字

4.审美

5.该写什么样的注释

6.写出言简意赅的注释


最近花了几天的时间在工作闲暇之余通读完了《编写可读代码的艺术》这本书,在此做一些提炼归纳总结,以便于自己学习记忆。感觉良好得书写代码习惯和思维方式对我这种初级程序员来说尤其重要呀(?)

想起之前一年的项目,由于自己的经验问题,在一开始写功能时没有注意代码的结构和规范,导致中后期几次大的功能改动后,代码变得难以阅读并且容易导致自己或者他人的bug,实在是比较难受。

特别在一些需求变动大,工期紧,工作量大的项目中,尤其需要注意初期构建代码时的技巧,避免‘烂’代码。多花一些时间思考可能会避免之后无尽的坑。往往这些坑最后掉进去的是自己。


1. 代码应该易于阅读和理解。

代码书写应该遵守可读性基本定理,核心思想是代码的写法应当使别人理解它所需的时间最小化。有时候这里所指的‘别人’是几个月后的自己哈哈。俗话说程序员都是‘懒惰的’,一般我们在写代码时总是觉得代码越短越好,行数越少越好,这的确是一个正确的方向,但有时候越’短‘的代码会减慢其他人的阅读速度,三目运算符的使用就是一个很好的例子。

在精炼代码和让别人容易理解之间找到一个平衡点也许是一个不错的选择,不过达到这个目标需要一个长期的积累过程吧。

2.命名时提供额外的信息

  • 命名时选择专业的单词
def GetPage(url):

get这个单词无法得知获得某个界面的方式,若果改成 downloadPage 则能获知。

Stop();
Kill();

取名为stop意味着某种状态可以被resume,是一种比较轻量级的操作。相对应的,kill则是一个重量级的操作。

//
Start();
//
launch();
create();
open();
begin()

在程序的不同部分都有可能出现start方法,虽然start表意没有问题但可以替换为语义更加明确的单词。

if(right < left)
{
    tmp = right
    right = left
    left = tmp
}

在上面的例子中,tmp变量只有很短的生命周期,这个时候tmp这个变量的名字向读者传达了特定的消息,即这个变量没有其他指责不会被传递到其它函数或者更远的什么地方去。

与此相对应的,一些具有实在意义的并且作用域比较大的变量则不适合使用诸如tmp,ret这类名字。有时候可以使用ret_xxx,xxx代表该变量的实际含义比如文件类型什么的。

  • 避免泛泛的无意义的名字
for(int i = 0; i < clubs.size(); i++)
    for(int j = 0; j < clubs[i].members.size(); j++ )
        for(int k = 0; k < user.size(); k++)
            if(clubs[i].members[k] == user[j])
                dosth

在循环迭代中,避免使用i,j,  k这种名字。上面的例子中很难看出j,k两个变量使用错误,如果改成club_i,members_j,user_k

或者ci,mj,uk之类的则比较容易发现问题。

  • 用具体的名字代替抽象的名字

方法名参数名尽可能准确得描述它的作用或者定位。

  • 使用前缀或者后缀给名字附加更多信息

  • 注意命名的长度

既要注意长度不能太长也不能丢失掉关键信息,在小的作用域中可以使用更短的名字,同样的作用域大的可以使用更长的名字。缩写或者首字母缩略的命名方式会给阅读的人带来困扰,不建议使用。可以丢弃掉冗余的描述,例如

ConverttoString();



toString();

toString描述完全足够,convert可以去掉。

  • 利用名字的格式来表达含义

遵循一种规范,最好保证同一个项目中遵循同一个规范。

3.使用不会被误解的名字

  • Filter()方法

results = Database.all_object.filter("year <= 2019")

这里filter语义不明,无法看出是筛选还是剔除,最好换成更加明确的单词。

类似的具有二义性的单词也是需要斟酌使用。

  • 给bool值命名

最好和is,has,can或者should前缀相结合,使bool值更加明确。

  • 命名符合使用者的期望

用户可能期望get()或者size()是轻量级的方法。一些复杂度比较高的方法名字需要斟酌一下。

4.审美

  • 重新安排换行缩进,使代码看上去一致并且紧凑
  • 对于重复累赘的代码封装进方法
  • 注意使用列对齐
  • 对于逻辑上先后顺序无所谓的代码也可以把它们按照有意义的顺序排列起来
  • 声明按块组织起来 不要一股脑写在一起
  • 同上 代码块也可以按照结构分成’段落‘
  • 保持个人风格的一致

5.该写什么样的注释

  • 如果能从代码名字或者是一些很明显的函数不需要重复写注释。

p.s.如果注释只是为了解释函数名字的意义,不如通过修改函数名来完善它

  • 可以将自己对该段代码的见解写成注释

  • 可以给代码的瑕疵写注释

  • 可以给常量加注释
  • 站在读者的角度写注释,注释应当帮助读者避免一些坑,帮助读者理解结构

6.写出言简意赅的注释

  • 让注释保持紧凑
  • 避免使用不明确的代词,比如它,这个之类的。
  • 润色粗糙的句子
  • 精确的描述函数的行为
  • 可以用函数的输入输出的例子来说明函数的行为
  • 从更高的层次上声明函数的意图
  • 使用嵌入式注释(Fuc(/*arg = */...))来解释难以理解的参数
  • 使用含义丰富的词
发布了35 篇原创文章 · 获赞 5 · 访问量 431

猜你喜欢

转载自blog.csdn.net/qq_33776188/article/details/100933547