Clean Code 读书笔记四
- 能用代表表述的就不要用注释
- 减少注释,把精力放在代码上,让代码说话,而不是注释
- 不要写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 读书笔记四相关推荐
- Clean Code读书笔记
Clean Code读书笔记 一.整洁代码 如何做到整洁 怎么做 为什么 代码逻辑直接了当 便于理解 有意义的命名 便于理解 减少依赖关系 便于维护 分层战略完善错误 缺陷难以隐藏 有单元测试和验收测 ...
- 代码整洁之道 Clean Code 读书笔记
目录 代码整洁之道 Clean Code 第一章 整洁代码 第二 三章 命名与函数 第四 五章注释与格式 第六章 对象和数据结构 第七章 错误处理 第八章 边界 第九章 单元测试 第十章 类 第十一章 ...
- Clean Code 读书笔记三——方法(函数)
文章目录 clean code 之方法(函数) clean code 之方法(函数) 短小 ,再短小,更短小 20行最佳 只做一件事 准确说来每个方法应该是只做抽象概念上的的一件事 只做一件事的方法是 ...
- 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)
<关键对话--注意观察,如何判断对话氛围是否安全>读书笔记(四) 在对话过程中,既要关注对话内容(即讨论的主题),也要观察对话气氛(即参与者的反应).越早意识到你和对方退出了对话机制,就越 ...
- 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法
<编程之美>读书笔记(四):卖书折扣问题的贪心解法 每次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话, ...
- 3d游戏设计读书笔记四
3d游戏设计读书笔记四 一.基本操作演练[建议做] 下载 Fantasy Skybox FREE, 构建自己的游戏场景 a. 在AssetStore中搜索Fantasy Skybox FREE并下载. ...
- 《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
来源:http://www.cnblogs.com/edisonchou/p/3809839.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- 《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件
前面两篇文章介绍了淘宝的发展历程.Java时代的变迁和淘宝开始创新技术: <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源 &l ...
- 《李元芳履职记》读书笔记四 (完结)
决策不能拍脑袋 管理者不仅仅依靠"拍脑袋"进行决策,而是要用科学的方法加以指导: (决策流程) 工作分派就该这样做 管理者在分派下属工作时,不能"随性",而应该 ...
- 读书笔记四 高级光照PBR
微表面模型参考资料:https://blog.uwa4d.com/archives/Study_PBR.html 更精确的微表面模型GGX参考资料:https://blog.uwa4d.com/arc ...
最新文章
- EntLib 3.1学习笔记(6) : Security Application Block
- 单继承--多态性 多继承--二义性 ambiguous
- 《Nature》挑战进化DNA突变理论!
- 0基础学python-如何从零基础自学Python?
- Expected a key while parsing a block mapping. assets: ^
- 数据中心机房应该如何布线,机柜布线方法详解!
- pythorch基本信息查询
- 【机器视觉】 dev_set_shape算子
- 在Eclipse中运行hadoop程序
- php替换不区分大小写_PHP大小写问题:函数名和类名不区分,变量名区分
- XAMPP 无法启动解决
- nginx 非80、443端口跳转到80、443
- JMeter 做接口性能测试,YYDS!
- 四、处理表单数据 (基础教程4)
- QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等
- 产品经理会用到的常用术语大全
- 几种常见的概率统计谬误
- 飞卡日常进度之山外上位机的二值化模式和灰度模式
- 为什么要用频谱分析仪测量频谱?
- c7000一键root,三星c7000拆机教程
热门文章
- Neutron IPAM源码分析
- linux btrfs文件系统,btrfs 文件系统
- unix 创建html文件路径,Btrfs 创建目录和文件的操作
- 6个不可多得的黑科技网站!
- 大数据与云计算学习:Python网络数据采集
- HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
- 非相参积累 matlab,非相参积累增益,比相参积累增益更难计算?
- BI工具和数据中台有什么区别?
- java课程综合实训报告_Java ME综合实训报告
- 面渣逆袭:HashMap追魂二十三问