编写可阅读代码的艺术-(1~3)

五 26th, 2013

读书笔记 P1~P36

1. 代码应易于理解

1.1 可读性的基本标准:

     代码的写法应该使别人理解它需要的时间最少

1.2 代码短并不是易理解的标准,2者基本没有关系:如下面2段功能一致的代码

    assert(!(bucket = FindBucket(key)) || !bucket -> IsOccupied())

    和

    bucket = FindBucket(key);

    if (bucket != null)

        assert(!bucket -> IsOccupied())

第一部分:表面层次的改进

名称,注释,代码风格

2. 信息装入到名称中

2.1 选择专业的词

     GetPage   <  FetchPage    DownloadPage 

     Class BinaryTree{

        int Size();

     }

     Size()  <   NumNodes()  < Height()

2.2 找到更有表现力的词

    核心思想:清晰和精准比装可爱好

    send < deliver   dispatch   route  

    find < search   locate

    start< launch   begin   open

    make < create  build  set up  add  new 

2.3 避免使用 tmp  retval这种泛泛的名字

    在交换算法中,tmp作为临时变量存在还是有意义的!

    

2.4 循环迭代器

    1. i,j,k ,it,iter 一般都可以作为索引或者循环迭代器。

    2. 多重循环,可以根据具体需求,修改为 club_i ,member_i,user_i 或者简化为  ci,mi,ui

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

    核心思想: 给变量,函数,类命名的时候,要把它描述得更具体而不是更抽象

    例子: –run_locally(本地运行)

    本意使程序输出更多的调试信息,但会运行得更慢。一般用于在本机上测试,但当运行在服务器上,性能很重要的时候,一般不会使用这个标记;

    带来的问题:

    1. 新成员不明白真正含义,可能认为是在本地运行的标记

    2. 偶尔我们需要在远程服务器上查看调试信息,使用这个看上去比较滑稽

    3. 有时我们在本地运行性能测试,不需要日志信息,所以不能使用–run_locally

    这种情况下,extra_logging这个意义会更好一点

    

2.6 为名字附带更多信息

    16进制的id   String  id  < String hex_id

2.7 带单位的值

    如果是有度量的,最好是带上单位值:var  start  < var start_ms    =  (new Date()).getTime()

    

2.8 附带其他重要属性

    纯文本格式密码          password   <   plaintext_password

    已转换为utf8的html      html       <   html_utf8

    核心思想:如果这个一个需要理解的关键信息,那么就放到名字里

    

2.9 名字应该有多长

    核心思想:在选择好名字的时候,一个隐含的约束就是,名字不能太长

    

2.10 在小的作用域里可以使用短的名字

    作用域小的标示符(对多少行其它代码可见)不用带上过多的信息:

    if (debug){

    Map<String,int> m;

    LookUpNameNumber(&m);

    }

    m 虽然没有包含更多的信息,但是读者已经掌握理解这段代码的所有信息。

    

2.11 输入长名称,已经不是问题

    基本上,常用的编辑器都已经有自动补全的功能,输入已经不是什么问题了。

2.12 首字母缩略词和缩写

    程序员常用:eval  代替 evaluation, doc 代替document   ,str 代替 string

    使用项目缩写开头不是一个好的方式,BEManager,对新员工会有误解。

2.13 丢掉没有用处的词

    ConvertToString   <    ToString()

2.14 利用名字的格式来传递信息

    比如遵循一些规范,类名 开头大写,变量  小写开头……

    每种语言不一样,如C++有Google开源开发规范

    

2.15 其它格式规范

    由公司或者团队所做出的一些开发规范或者约定。

总结:

   核心就是把信息塞进名子里,让读者通过名字就能获取大量的信息。

   

3. 不会误解的名字

   核心思想:小心有歧义的名字

   

3.1 推荐用max,min来(包含)极限

3.2 推荐用first,last来表示包含的范围

3.3 推荐用begin,end来表示包含/排除范围

3.4 布尔值命名

    通常加上has,is,can,should这样的词,可以把布尔值变得明确

    bool read_password = true; 存在二义性

    修改为

    bool need_password = true;

3.5 与使用者的期望相匹配

    不要使用那种让大家有先入为主的名字。

    如,java中,get是一个轻量级的访问器,返回内部成员变量。如果你的代码中需要一个方法遍历所有经过的数据,并同时计算值的方法,getMean()显然会

    让大家误解,所以最好的方式是用computerMean()来表示

总结:

   核心就是不会误解的名字是最好的名字。





除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/51995

订阅本站:http://www.wangyuxiong.com/feed

分类: 读书笔记         标签:
目前还没有任何评论.

无觅相关文章插件,快速提升流量