• 能用代表表述的就不要用注释
  • 减少注释,把精力放在代码上,让代码说话,而不是注释
  • 不要写add by的注释,用svn 、git管理组件就可以了**
  • 代码中不要保留注释的代码
    例如:
//Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))

//Or this?if (employee.isEligibleForFullBenefits())
  • 不是每个方法或变量上都必须有注释或javadoc
  • 如果一个方法中调用了很多其他私有方法,应该按照调用的自然顺序,放置被调用的方法。

  • 数据抽象:
    看如下两段代码:

public class Point {public double x;public double y;
}
public interface Point {double getX();double getY();void setCartesian(double x, double y);double getR();double getTheta();void setPolar(double r, double theta);
}

看到这个代码你当然想到,某个属性的private修饰符声明,public修饰符get、set方法。那么为什么我们不去把类的熟悉直接用public 修饰,而是写它的set、get方法?

因为,get\set方法是这个类的接口概念,它屏蔽了底层细节,通过这个接口获取想要暴漏的内容。这样的代码更有解耦、良好的封装性。

好了,我们看看如上两段代码。其实道理一样,我们屏蔽了底层具体实现,对外只提供接口。隐藏数据,暴漏操作!

  • the law of demeter
    方法中不能调用别的方法的返回结果(比如结果是个对象)的方法。
    如下面的代码违法了 这个规定。
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

应该切分为:

Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

如果opts 、scratchDir 、outputDir 只是数据结构,那块代码没有问题,数据结构可以暴漏其内部细节。但如果是对象,则就违反了 demeter规则,如果是对象,我们为什么要知道 scratchDir 、outputDir 这些细节呢?我们直接获取结果,隐藏这些具体实现。

比如这些代码后续代码是:

String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);

那么直接封装底层实现:用ctx对象获取最终的BufferedOutputStream

//这才是一个对象(ctxt)该做的事情
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
  • 通常我们定义的***Dto是 原始数据与数据库的交互传输的数据结构,不能把它理解为通常的对象,因为它不能包含对象的业务逻辑。

  • 对象和数据的反对称性
    看如下代码:

//Procedural Shape
public class Square {public Point topLeft;public double side;
}
public class Rectangle {public Point topLeft;public double height;public double width;
}
public class Circle {public Point center;public double radius;
}
public class Geometry {public final double PI = 3.141592653589793;public double area(Object shape) throws NoSuchShapeException {if (shape instanceof Square) {Square s = (Square) shape;return s.side * s.side;} else if (shape instanceof Rectangle) {Rectangle r = (Rectangle) shape;return r.height * r.width;} else if (shape instanceof Circle) {Circle c = (Circle) shape;return PI * c.radius * c.radius;}throw new NoSuchShapeException();}
}

上边的代码很明显是面向过程的,面积的计算并没有放入对象的行为中。这样的代码如果要增加一个getPerimeter()方法,只要在Geometry .java里增加这个方法,不会影响其他 形状 类,以及依赖他们的其他类。但是如果要新增一个类型,那么在Geometry .java里所有的函数都要改变(假设所有函数都按照类型分类)。

然后,如果使用oo方式设计代码会有相反的结论:

//Polymorphic Shapes
public class Square implements Shape {private Point topLeft;private double side;public double area() {return side * side;}
}
public class Rectangle implements Shape {private Point topLeft;private double height;private double width;public double area() {return height * width;}
}
public class Circle implements Shape {private Point center;private double radius;public final double PI = 3.141592653589793;public double area() {return PI * radius * radius;}
}

我们扩展一个新的类型,很方便,只要增加一个新的类就可以。但是如果要新增一种 Shape的行为,那必须要修改每一个类(也就是说每个形状类中按各自需要实现方法)。

Clean Code 读书笔记四相关推荐

  1. Clean Code读书笔记

    Clean Code读书笔记 一.整洁代码 如何做到整洁 怎么做 为什么 代码逻辑直接了当 便于理解 有意义的命名 便于理解 减少依赖关系 便于维护 分层战略完善错误 缺陷难以隐藏 有单元测试和验收测 ...

  2. 代码整洁之道 Clean Code 读书笔记

    目录 代码整洁之道 Clean Code 第一章 整洁代码 第二 三章 命名与函数 第四 五章注释与格式 第六章 对象和数据结构 第七章 错误处理 第八章 边界 第九章 单元测试 第十章 类 第十一章 ...

  3. Clean Code 读书笔记三——方法(函数)

    文章目录 clean code 之方法(函数) clean code 之方法(函数) 短小 ,再短小,更短小 20行最佳 只做一件事 准确说来每个方法应该是只做抽象概念上的的一件事 只做一件事的方法是 ...

  4. 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)

    <关键对话--注意观察,如何判断对话氛围是否安全>读书笔记(四) 在对话过程中,既要关注对话内容(即讨论的主题),也要观察对话气氛(即参与者的反应).越早意识到你和对方退出了对话机制,就越 ...

  5. 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...

  6. 3d游戏设计读书笔记四

    3d游戏设计读书笔记四 一.基本操作演练[建议做] 下载 Fantasy Skybox FREE, 构建自己的游戏场景 a. 在AssetStore中搜索Fantasy Skybox FREE并下载. ...

  7. 《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

    来源:http://www.cnblogs.com/edisonchou/p/3809839.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...

  8. 《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件

    前面两篇文章介绍了淘宝的发展历程.Java时代的变迁和淘宝开始创新技术:              <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源              &l ...

  9. 《李元芳履职记》读书笔记四 (完结)

    决策不能拍脑袋 管理者不仅仅依靠"拍脑袋"进行决策,而是要用科学的方法加以指导: (决策流程) 工作分派就该这样做 管理者在分派下属工作时,不能"随性",而应该 ...

  10. 读书笔记四 高级光照PBR

    微表面模型参考资料:https://blog.uwa4d.com/archives/Study_PBR.html 更精确的微表面模型GGX参考资料:https://blog.uwa4d.com/arc ...

最新文章

  1. EntLib 3.1学习笔记(6) : Security Application Block
  2. 单继承--多态性 多继承--二义性 ambiguous
  3. 《Nature》挑战进化DNA突变理论!
  4. 0基础学python-如何从零基础自学Python?
  5. Expected a key while parsing a block mapping. assets: ^
  6. 数据中心机房应该如何布线,机柜布线方法详解!
  7. pythorch基本信息查询
  8. 【机器视觉】 dev_set_shape算子
  9. 在Eclipse中运行hadoop程序
  10. php替换不区分大小写_PHP大小写问题:函数名和类名不区分,变量名区分
  11. XAMPP 无法启动解决
  12. nginx 非80、443端口跳转到80、443
  13. JMeter 做接口性能测试,YYDS!
  14. 四、处理表单数据 (基础教程4)
  15. QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等
  16. 产品经理会用到的常用术语大全
  17. 几种常见的概率统计谬误
  18. 飞卡日常进度之山外上位机的二值化模式和灰度模式
  19. 为什么要用频谱分析仪测量频谱?
  20. c7000一键root,三星c7000拆机教程

热门文章

  1. Neutron IPAM源码分析
  2. linux btrfs文件系统,btrfs 文件系统
  3. unix 创建html文件路径,Btrfs 创建目录和文件的操作
  4. 6个不可多得的黑科技网站!
  5. 大数据与云计算学习:Python网络数据采集
  6. HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
  7. 非相参积累 matlab,非相参积累增益,比相参积累增益更难计算?
  8. BI工具和数据中台有什么区别?
  9. java课程综合实训报告_Java ME综合实训报告
  10. 面渣逆袭:HashMap追魂二十三问