文档章节

读书笔记-编写可读代码的艺术[中]

FansUnion
 FansUnion
发布于 2015/05/03 01:30
字数 1208
阅读 2
收藏 0

观点:程序员之间的互相尊重体现在他所写的代码中。他们对工作的尊重也体现在那里。代码最重要的读者不是编译器,解释器或电脑,而是人。写出的代码能让人快速理解、轻松维护、容易扩展的程序员才是专业的程序员。

《编写可读代码的艺术》一书,专注于如何编写可读性更好的代码。

本文概要总结了这本书的第2部分内容。

第2部分 简化循环和逻辑

7.把控制流变得易读

关键思想:把条件、循环以及其它对控制流的改变做得越“自然”越好。运用一种方式使读者不用停下来重读你的代码。

7.1条件语句中参数的顺序

if(age >20){
}
比if(20 < age){
}
更易读。

if(name == null){
}
比
if(null == name){
}



在中文和英文等自然语言中(“如果你的年龄大于20”)更常见,更符合一般用法。
即比较的左侧,它的值倾向于不断变化,比较的右侧,它的值倾向于稳定。

7.2if/else语句块的顺序

if(a== b){
  //case one
}else{
  //case two
}
也可以写成
if(a != b){
  //case one
}else{
  //case two
}


之前你可能没想太多,但在有些情况下有理由相信其中一种顺序比另一种好:
a.首先处理正逻辑而不是负逻辑的情况。例如,if(debug)而不是if(!debug)。
b.先处理简单的情况。这种方式可能还会使得if和else在屏幕之内都可见,这很好。
c.先处理有趣的或者是可疑的情况。

下面所示是负逻辑更简单并且更有趣的一种情况,那么会先处理它

if (not the same  username){
  //case one
}else{
  //case two
}


7.3三目运算符
它对于可读性的影响是富有争议的。拥护者认为这种方式可以只写一行而不用写成多行,反对者则说
这可能会造成阅读的混乱而且很难用调试器来调试。

关键思想:相对于追求最小化代码行数,一个更好的度量方法是最小化人们理解它所需的时间。
建议:默认情况下都用if/else。三目运算符?:只有在最简单的情况下使用。

7.4避免do/while循环

do{

}while(condition);


do/while循环的奇怪之处是一个代码块是否会执行是由其后的一个条件决定的。通常来讲,逻辑条件
应该出现在它们“保护”的代码之前,这是if,while和for语句的工作方式。
因为你通常会从前向后来读代码,这使得do/while循环有点不自然了。

7.5从函数中提前返回

public boolean contains(String str,String substr){
  if(str==null || substr==null){
    return false;
  }
    
   if(substr.equals("")){
    return true;
    }
    
  ...
}


7.6最小化嵌套

if(userResult==SUCCESS){
  if(permissionResult != SUCCESS){
   reply.writeErrors("error reading permission");
   reply.done();
   return;
  }
  reply.writeErrors("");
}else{
  reply.writeErrors(userResult);
}
reply.done();


可以通过提前返回,来减少嵌套。


8.拆分超长的表达式
8.1用做解释的变量
 

if(line.split(",")[0].name=="root"){
 
 }
 
 增加一个解释变量
 String username = line.split(",")[0].name;
 if(name=="root"){
 }



 
8.2总结变量
即使一个表达式不需要变量(因为你可以看出它的含义),把它装入一个新变量中仍然有用。
我们把它叫做总结变量,因为它的目的是用一个短很多的名字来代替一大块代码,这个名字会
更容易思管理和思考。

if(request.user.id == document.user.id){
 //user can edit this document
}

if(request.user.id != document.user.id){
 //document is read only
}


这里的表达式“request.user.id==document.user.id”看上去可能并不长,但它包含
5个变量,所以需要多花点时间来想一想如何处理它。

这段代码中的主要概念是:“该用户拥有此文档吗?”这个概念可以通过增加一个总结变量来表达得更清楚。

final boolean userOwnDocument = (request.user.id==document.user.id);
if(userOwnDocument){...
}
if(!userOwnDocument){...
}



9.变量与可读性

关于变量的3个问题
a.变量越多,就越难全部跟踪它们的动向。
b.变量的作用域越大,就需要跟踪它的动向更久。
c.变量改变得越频繁,就越难以跟踪它的当前值。

9.1减少变量

没有价值的临时变量
now = datatime.time();
rootMessage.lastVisitTime=now;

减少控制流变量
boolean done=false;
if(condition && !done){
  if(...){
    done=true;
    continue;
  }
}

可以改为
if(condition){
  if(...){
    break;
  }
}


9.2缩小变量的作用域

把定义向下移
int a=0;
int b=0;
int c=0;

//handle a
//handle b
//handle c

改为
int a=0;
//handle a

int b=0
//handle b

全局变量改为局部变量。



9.3只写一次的变量更好
 

public static final int MAX_AGE=140;


原文链接:http://FansUnion.cn/articles/1903

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
《编写可读代码的艺术》读书笔记

最近常常来这个网站看看源码,看看博客,觉得只是从中获益,却没有做出自己的一些贡献,最近正好在读《The Art of Readable Code》这本书,就顺便把自己的读书笔记分享一下,大家多多批评指正...

爱编程的花栗鼠
2012/11/08
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
敏捷教练成长记:平安夜中第八周

这是第八周,也是平安夜,愿大家平安。 上周计划完成情况 1、敏捷方面读不少于50页的书或者文章。 - 读了修改代码的艺术,暂未输出读书笔记。 - 完成《家长学校读本(一年级)》阅读,并输出...

通爸
2017/12/24
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins的配置

1 修改jenkins的根目录,默认地在C:\Documents and Settings\AAA\.jenkins 。 .jenkins ├─jobs │ └─JavaHelloWorld │ ├─builds │ │ ├─2011-11-03_16-48-17 │ │ ├─2011-11-0......

shzwork
27分钟前
1
0
使用 spring 的 IOC 解决程序耦合

工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时...

骚年锦时
32分钟前
1
0
group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
今天
3
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
今天
4
0
java 序列化和反序列化

1. 概述 序列恢复为Java对象的过程。 对象的序列化主要有两 首先我们介绍下序列化和反序列化的概念: 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。...

edison_kwok
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部