文章目录

  • 为什么看这本书?
  • 整洁代码
    • 有意义的命名
    • 函数
    • 注释
    • 格式
    • 对象和数据结构
    • 错误处理
    • 系统
  • 启发与味道
    • 注释
    • 环境
    • 函数
    • 一般性问题
    • java
    • 名称
    • 测试
  • 总结

为什么看这本书?

  • 如这本书的名字意思,写出整洁的代码。整洁的代码,对以后的自己维护之前写的代码更加方便。代码混乱会导致难以维护,bug越修越多。

个人认为整洁的代码,就是别人没有改进的余地。
具体来说就是:

  1. 能够通过所有的测试
  2. 没有重复代码
  3. 体现系统中的全部设计理念
  4. 包括尽量少的实体,比如类、方法、函数等

整洁代码

有意义的命名

  • 名副其实(有意义的命名,比如魔术数字)
  • 避免误导(相似长名变量)
  • 区分有意义的命名(意思相近的名称,比如Manager,Dirver)
  • 类名(名称作为类名)
  • 方法名(动词作为类名)

函数

  • 短小
  • 只做一件事(一个函数只做一件事,如果它做了二件事,把它拆分成二个函数)
  • 每个函数一个抽象层次(你的代码混乱,极大可能是你并没有很好的面向对象(抽象这个对象),函数的层次划分)
  • 使用描述性的名称
  • 函数参数,参数个数越少越好(0>1>2,超过3个你需要考虑下)
  • 无副作用
  • 分割指令和询问
  • 使用异常返回错误代码(?)
  • DRY (消除重复代码)
  • 结构化编程 一个入口一个出口
    做法:分解函数、修改名称、重复消除。保持测试通过

注释

理想情况,你的代码自我注释(即命名好,一看就知道表达的意思和功能,不需要额外的注释)

格式

代码格式关乎沟通。只要团队统一格式既可以了。

对象和数据结构

  • 避免数据结构和对象的混用
  • 对象暴露行为,隐藏数据
  • 面向对象,添加一个新对象方便,但是添加函数麻烦
  • 面向过程

错误处理

  • 使用异常而不是返回码(使用错误代码,会有比较多的if else判断,没有使用异常清楚)
  • 如果异常打断正常业务逻辑,可以使用特例模式
  • 不要返回null值
  • 传递null值,返回异常或者特例模式

  • 类应该短小
  • 单一职责原则(一个类只有一个需要修改的理由)
  • 内聚()
  • 隔离修改(使用抽象类,依赖倒置原则,依赖于抽象,不依赖于细节)

系统

  • 将系统的构造和使用分开()
  • 依赖注入或控制反转(构造和使用分离)

启发与味道

注释

  • 不恰当的注释。注释只应该与代码又换,设计的技术信息。不该有作者,修改日期
  • 废弃的注释(发现就删除掉)
  • 冗余注释(只描述的东西)
  • 糟糕的注释(注释要好好写,别画蛇添足,保持简洁,语法和拼写正确)
  • 注释掉的代码

环境

  • 需要多少步才能实现的构建
  • 需要多少步才能做到的测试

函数

  • 过多的参数(0>1>2>3,3个以上要避免)
  • 输出参数(违反直觉,处理:修改对象的状态)
  • 表示参数(输入参数有bool值)
  • 死函数(没有人调用的函数需要删除)

一般性问题

  • 一个源文件存在多种语言
  • 明显的行为未被实现(不考虑大小写等)
  • 不正确的边界行为(证明边界的情况, 别依赖直觉,编写测试)
  • 忽视安全(关闭编译器警告,关闭失败测试,过后处理)
  • 重复(重复(遗漏了抽象),不同模块的相同switch语句,使用多态来解决, 模板方法和策略模式消除算法重复)
  • 在错误的抽象层级上的代码
  • 基类依赖于派生类(基类对派生类一无所知)
  • 信息过多(提供的结构,函数扫,变量少)
  • 死代码(不执行的代码,删除)
  • 垂直分隔(变量和函数应该在靠近被使用的地方定义)
  • 前后不一致(一致性)
  • 混淆视听(没有用到的变量,不调用的函数,没有信息量的注释移除)
  • 人为耦合(不相互依赖的东西不该耦合,根源是将变量、常量、函数不恰当放在临时方便的位置)
  • 特性依恋(视情况而定)
  • 旋转算子参数(函数传入bool值, 有选择操作的参数,int,Enum等,使用多个函数,通常要由于向单个函数传递某些代码来选择函数行为)
  • 晦涩的意图(联排表达式。匈牙利语标记法。魔术数字)
  • 位置错误的权责(PI放在Math?Trigonometry?Circle,最小惊异原则,代码应该放在读者自然而期待它所在的地方,换位置思考)
  • 不恰当的静态方法(需要多态,静态函数使用确保没有机会打算让他有多态行为)
  • 使用解释性变量
  • 函数名称表达行为(day.add(5), 添加5天?5星期?5小时?,如果需要看文档知道要做什么,请修改更好的函数名称)
  • 理解算法
  • 把逻辑依赖改为物理依赖(依赖者模块不应该对被依赖者模块有假定,应当明确查询后者的全部信息)
  • 使用多态替代IF else / switch case
  • 遵循标准约定
  • 用命名常量代替魔术数字
  • 准确(明确自己为何要这么做)
  • 结构胜于约定(多态vs switch)
  • 封装条件
  • 避免否定性条件(if (!express))
  • 函数只该做一件事
  • 遮蔽时序耦合(使用创建序列暴露给时序耦合,每个函数产生下个函数的结果)
  • 封装边界条件
  • 函数应该只在一个抽象层级上
  • 在较高层级放置可配置数据(较低层级并不拥有这些常量值)
  • 避免传递浏览(火车失事, 协作者提供全部服务)

java

  • 通过使用通配符避免过长的导入清单(包导入
  • 不要继承常量
  • 常量 vs 枚举(不用担心越界)

名称

  • 采用描述性名称(取名不要太快)
  • 名称和抽象层级相符(不要取沟通实现的名称,取反映类或函数抽象层级的名称model(dial, disconnect) )
  • 尽可能使用标准命名法(装饰者模式, decorator)
  • 无歧义的名称
  • 较大作用范围选用较长名称(较小范围可以很短名称)
  • 名称应该说明副作用(getOos ,如果不存在,创建一个, =》createOrReturnOos)

测试

  • 测试不足(测到所有可能失败的东西)
  • 使用测试覆盖率
  • 别略过小测试(小测试易与编写,文档价值高于编写成本
  • 被忽略的测试就是对不确定事物的疑问(需求不明确)
  • 测试边界条件
  • 全面测试相近的缺陷(某个函数有一个缺陷,那个函数可能还有另外的缺陷)
  • 测试失败的模式有启发性(看到测试失败,啊哈)
  • 测试覆盖率的模式有启发性
  • 测试应该快速

总结

上面的那一系列清单大致很难说是完备的了,但是你遵循这些原则不应该是目标,清单是列不完的,它背后的那一套价值体系才是自己需要学习的,自己需要自我驱动

Clean Code总结相关推荐

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

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

  2. 聊聊clean code

    clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...

  3. 如何写一个好的方法-读Clean Code 有感

    针对方法,文中提到了几个规则,我认为比较有价值的几个列在下面. 1.      短小.好的方法是只做一件事情. 那么如何判断一个方法是做了一件事情呢?根据Clean Code的描述,是指的方法所作的事 ...

  4. 用重构指导Clean Code(二):依恋情结和switch语句

    书接上回,我们继续聊如何用重构指导Clean Code. 在Clean Code的3.4节中有这样一段代码(代码清单3-4).(第3章主要讲的是函数,而3.4节讨论的是switch语句.) publi ...

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

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

  6. PHP 代码简洁之道 ( PHP Clean Code)(第二部分)

    PHP 代码简洁之道 ( PHP Clean Code)(第一部分)​ 使用默认参数而不是使用短路运算或者是条件判断 不好的做法: 这是不太好的因为 $breweryName 可以是 NULL. fu ...

  7. Clean Code 笔记

    Why clean code matters 糟糕的代码现在看起来也许没什么要紧,但是过个两三年,就回发现,改起来困难重重. 维护一份干净的代码不仅仅是为了现在,也是为你的职业着想,想想要是在糟糕的代 ...

  8. 《Clean Code》代码的整洁之道(一)

    <代码整洁之道>:细节之中自有天地,整洁成就卓越代码 概述 软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认.<代 ...

  9. 代码整洁之道(clean code)序

    代码整洁之道(clean code)序 为什么要写出一手整洁的代码 我可以说是对自己coding水平要求比较高的那种类型,不是说代码能跑起来就ok了,总是希望自己的代码就像诗一样的优美,让人读起来赏心 ...

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

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

最新文章

  1. 并发工具类(二)同步屏障CyclicBarrier
  2. nignx的TCP和UDP调度(nginx反向代理)
  3. 酷派手机android版本,酷派大神的手机系统是什么?酷派大神能升级安卓4.3吗?...
  4. python动态类型的坑_python进阶教程之动态类型详解
  5. 重磅:为ES6系列设计的2套习题+答案解析
  6. php screw.so扩展下载,CentOS下安装php加解密工具php
  7. CSS3渐变——gradient
  8. Xbox One:未来的客厅主角
  9. ubuntu 安装docker_Docker学习笔记1 虚拟化历史及 Ubuntu环境下体验安装
  10. 华南理工计算机电路基础试题,华南理工大学计算机电路基础
  11. 信息学奥赛一本通 欧拉回路
  12. 益聚星荣:一文看懂,为什么有的投资人讨厌元宇宙,有的却爱死它了
  13. 三年两转型 打造大宗商品交易大数据生态圈
  14. 新浪短链接:15款最佳t.cn短网址在线生成工具
  15. 峰会回顾 | 阿里云与StarRocks合作、开放、共赢
  16. python爬取微信公众号_python使用webdriver爬取微信公众号
  17. Java并发编程与技术内幕:ConcurrentHashMap源码解析
  18. 【至简设计案例系列】基于FPGA的密码锁设计(altera版)
  19. python获取数组长度_Python返回数组(List)长度的方法
  20. AVKiller病毒的清除

热门文章

  1. 图灵取代瓦特上位英镑新钞,“罪犯”何以与英国女王并肩?
  2. android表单添加附件,Android的浏览器下无法表单提交附件
  3. NeoVIM安装与配置(Windos 10)
  4. 基于python数据分析(番外篇一:心智模型)
  5. [Cocos Creator] 获取龙骨动画dragonbones精确外边框
  6. buu [MRCTF2020]keyboard
  7. HTC Vive使用WebVR的方法以及启用后头显无画面的解决方法
  8. vscode vetur配置
  9. 新麦肯锡5步法:结构化战略思维整体框架!
  10. EventBus多次接收踩坑