代码整洁之道核心记要

  • 0. 简介
  • 1. 前言
  • 2. 详解
    • 1. 命名
    • 2. 函数
    • 3. 对象与数据结构
  • 感悟

代码整洁之道是鲍勃大叔的经典作品。这本书主要介绍鲍勃大叔的整洁代码的方法,如何写出好代码,如何将糟糕代码改成好代码。在阅读这本书后,我将该本书的内容整理如下。

0. 简介

代码整洁之道共有三部分组成:

  1. 介绍编写整洁代码的原则、模式和实践
  2. 几个复杂性不断增加的案例研究
  3. 案例研究中的启示和灵感

本篇笔记为第一部分,其核心内容如下图所示,在后续的笔记中,我将详细补充部分说明。

1. 前言

整洁代码就像是一种艺术品一样,拥有设计优雅、逻辑清晰等等优点。它可以使得阅读代码的程序员感到赏心悦目。
知易行难,会读简洁代码并不代表着会写简洁代码。本书主要介绍鲍勃大叔在编写简洁代码时的一些经验。每个人编写简洁代码的设计思路并非完全相同,但却有迹可循,参考这本书的方法,可以更快领悟简洁代码的精髓。

2. 详解

详解部分为上图的补充说明,帮助理解、记忆上图

1. 命名

  1. 读的出来的名称,不能使用俗语,俚语等命名。
  2. 如果在接口和实现中选择一个编码,建议选择实现,如接口为ShapeFactory,那么实现可以为ShapeFactoryImp。
  3. 使用解决方案领域名称,比如计算机领域的术语,算法名。比如命名为AccountVisitor就是访问者的意思。如果没有计算机领域名称,可以使用业务领域的专业名称。

2. 函数

  1. 每个函数都处在一个抽象层级上,比如getHtml()属于较高层级,PathParser.render(pagePath)处于中间抽象层级,而.append("\n")则位于较低抽象层级。
  2. 若函数参数为参数列表,即数量可变的参数
  3. 指令是控制程序的代码,询问是判断属性是否存在的情况,这两种代码最好分隔开,使用if语句先询问,再控制。
  4. 并不从一开始就按照规则写函数,往往在刚开始写函数时,都冗长而复杂。有太多缩进和嵌套循环,有过长的参数列表,名称是随意取的,也会有重复的代码。在配上一套单元测试后,再慢慢打磨这些代码,根据规则慢慢修改,同时保证测试通过。最后一句规则组装这些代码。

3. 对象与数据结构

  1. 数据抽象是指将数据结构抽象为一个接口,没有过多取值器和赋值器暴露具体数据,而是使用一些抽象形态表述数据。
  2. 隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象!类并不简单地用取值器和赋值器将其变量推向外间,而是曝露抽象接口,以便用户无需了解数据的实现就能操作数据本体。
  3. 以下两个例子展示了对象与数据结构之间的差异。对象把数据隐藏于抽象之后,曝露操作数据的函数。数据结构曝露其数据,没有提供有意义的函数。
  • 过程式形状代码
public class Square {public boint 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();
}
  • 多态式形状(面向对象式)
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;}
}

从上述代码段中可以看出,过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类过程式代码难以添加新数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类。
可以总结为,在任何一个复杂系统中,都会有需要添加新数据类型而不是新函数的时候。这时,对象和面向对象就比较适合。另一方面,也会有想要添加新函数而不是数据类型的时候。在这种情况下,过程式代码和数据结构更合适。

  1. 得墨忒耳定律
    得墨忒耳律(The Law of Demeter)认为,模块不应了解它所操作对象的内部情形。更准确地说是,类C的方法f只应该调用以下对象的方法:
    ·C
    ·由f创建的对象;
    ·作为参数传递给f的对象;
    ·由C的实体变量持有的对象。
    方法不应调用由任何函数返回的对象的方法。换言之,只跟朋友谈话,不与陌生人谈话。
    如果有代码存在连串调用,通常都是肮脏的代码,比如:final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();。这个代码可以切分为:
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

这些代码是否违反得墨忒耳律,取决于ctxtOptionsScratchDir是对象还是数据结构。如果是对象,则它们的内部结构应当隐藏而不曝露,而有关其内部细节的知识就明显违反了得墨忒耳律。如果ctxtOptionsScratchDir只是数据结构,没有任何行为,则它们自然会曝露其内部结构,得墨忒耳律也就不适用了。
如果这些代码一半是数据结构,一半是对象,会增大添加新函数和新数据结构的难度,应尽量避免这种结构。
假如ctxtOptionsScratchDir是对象,那么如何实现上述方法?通过分析发现,上述方法是为了取得临时目录的绝对路径,然后是创建制定名称的临时文件,所以可以直接让ctxt来做:

BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);

这样就隐藏了内部结构,防止当前函数违反得墨忒耳定律。

感悟

  1. 命名
    命名是一件非常重要的事情,好的命名能准确描述每一个变量的作用及意义。一个好的名字,即为变量、函数、参数、类和封包最好的注释,可以让人一目了然。所以在取名字时需要仔细斟酌、考虑。

  2. 函数
    每个coder都会写函数,但不是每一个coder都能写好函数。若要编写好一个函数,不仅仅需要一个好的名称,更需要定义好函数的功能,入参以及异常处理。一个好的函数仅仅实现一个功能,一个好的函数代表一个抽象层级,一个好的函数最多一个入参。我们也许无法一次将函数写好,却可以通过无数次重构改善函数,使得函数尽可能完美。

  3. 对象与数据结构
    面向对象编程与面向过程编程的思想完全不同,前者利于扩充新类,后者利于扩充函数。在具体应用时,应该分情况使用。
    对象曝露行为,隐藏数据。便于添加新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为。数据结构曝露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。

代码整洁之道核心记要(一)相关推荐

  1. 重读【代码整洁之道】

    一.前言 [代码整洁之道]很经典,但也有些过时,翻译上也有些啰嗦,但总体上是好书.通过对本书核心内容的摘抄,结合自己的经验,整理了一些精简的点,这样你就省的去啃那本400多页的书了. 软件质量 = 架 ...

  2. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  3. 代码整洁之道(Clean Code)- 读书笔记

    Sorry, 许久未更新文章了,主要因为刚刚换了一家新公司,忙于组建团队(建设.招聘.流程.框架等)与熟悉公司业务,还有领导给的其他工作等等,实在是没有时间更新了.最近在和团队分享Bob大叔的< ...

  4. 《代码整洁之道》目录—导读

    版权声明 代码整洁之道 Authorized translation from the English language edition, entitled Clean Code: A Handboo ...

  5. 《代码整洁之道》细节之中自有天地,整洁成就卓越代码 读书笔记

    <代码整洁之道>细节之中自有天地,整洁成就卓越代码 读书笔记 There are only two hard things in Computer Science: cache inval ...

  6. 代码整洁之道:程序员的职业素养 读书笔记

    代码整洁之道:程序员的职业素养 作者:(美)罗伯特 C. 马丁(Robert C. Martin) 译者:余晟,章显洲 这是一本风趣幽默的关于程序员的故事书,这本书让我在专业技术之外,了解了更多程序员 ...

  7. 代码整洁之道 万字总结+个人项目经验

    软件工程作为一门学科,他们的目的是为了多人合作可以写出好的代码,同时也是为了我们的代码能够更方便的修改和维护,如果我们对某种架构设计有想不通的地方,不妨在这个方向思考一下 我们不可能了解一个大型系统的 ...

  8. 代码整洁之道(一)最佳实践小结

    摘要: Any fool can write code that a computer can understand. Good programmers write code that humans ...

  9. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

最新文章

  1. 资源 | 做一款炫酷的机器人需要哪些学习资源(机器人资源Awesome系列)
  2. 3W 字的 Spring Boot 超详细总结
  3. BMC Biology:香港城市大学孙燕妮组发表高准确度预测病毒宿主的工具
  4. 我早年在Google学到的10条经验
  5. ABAP开发常用的表
  6. vue中什么样的数据可以是在视图中显示
  7. ForkJoinPool 学习示例
  8. linux远程桌面MacOS,如何在Linux或macOS中使用远程桌面连接到Windows 10 | MOS86
  9. 3.手动搭建Maven项目
  10. 力扣-1022. 从根到叶的二进制数之和
  11. linux暗黑2黑屏,如何在Ubuntu 20.04中启用全局暗黑模式
  12. FPGA复位电路设计学习分析
  13. 怎样转换WPS格式,WPS怎么转换PPT格式
  14. matlab julia分形图,Mandelbrot集和Julia集的分形图之matlab实现
  15. SpringMVC中的文件上传与下载,json转换,及三大框架的整合
  16. Java并发编程(一)—— FutureTask超详细教程
  17. 启动注销服务器,window server 2012系统服务器桌面重启关机注销的几种方法
  18. 什么是TCP-IP攻击?
  19. 超酷的摄像头魔法特效软件:ArcSoft Magic Visual Effects
  20. java基础综合练习(嗖嗖移动)

热门文章

  1. xerosploit中间人攻击软件安装及简易使用
  2. python编程 “sitka_weather_07-2014” 等数据集
  3. Opencv读取多张图片
  4. IoT 恶意软件攻击剖析
  5. 小技巧 | 关于问卷星如何粘贴复制
  6. Android 底层知识拾零
  7. 大一统视角理解扩散模型
  8. 基于java+SSM+jsp的酒店管理系统(附源码)
  9. 雷军武大演讲:永是珞珈一少年 留下人生最重要回忆
  10. Google AIY视觉套件登陆香港!Gravitylink引力互联商城开启预售!