zoukankan      html  css  js  c++  java
  • clean code笔记

    第一章-整洁代码

    代码不会消失

    糟糕的代码

    我们都深受烂代码的伤害,但是我们为什么要制造烂代码呢?
    我们都说过,以后再来处理代码中的丑陋。但是勒布兰法则:稍后等于永不(Later equals never)

    混乱的代价

    结果就是生产力不断下降

    老代码无力维护,只能开发一套新的。花时间保持代码质量不知关乎效率,而且关乎生存。

    需求的改变可能背离了最初的设计,这是烂代码产生的时机,也是重构的最好时机。

    制造混乱无助于赶上期限,只会拖慢。保持代码整洁才是唯一的办法。

    怎么写出整洁的代码?需要遵循大量的小技巧,刻苦习得“整洁感”。

    什么是整洁的代码---优雅的,逻辑清楚的,只做好一件事。给人写的,可测试的,可修改的。没有重复代码。

    读代码的时间:写代码的时间=10:1

    军规:时时保持代码整洁。如果每次签入的代码比签出的要干净,那么代码就不会腐坏。

    设计原则:PPP-原则、模式、实践。单一职责,依赖倒置,开闭原则等

    第二章-有意义的命名

    命名随处可见:变量、方法、类、包等等

    名副其实

    避免误导

    做有意义的区分

    避免a1,a2这样的命名

    能读的出来

    使用可搜索的名称

    避免使用编码

    例如这样前缀btnAbc
    实现前加前缀I,也是不优雅的

    避免思维映射

    i,j,k一般用来命名循环变量,不宜它用

    类名当用名词

    方法明当是动词或动词短语

    别开玩笑,严肃

    对应每个概念,用一个词

    Manager还是controller

    拒绝用双关语

    使用解决方案领域名词,次之使用问题领域的名词

    添加语境

    code---不如appCode

    第三章--函数

    好的函数该怎么写?

    短小

    越小越好,不多于20行为佳
    嵌套不要多于一到两层,易于理解

    只做一件事

    如果函数只是做了其函数名下的同一抽象层的步骤,则函数还是只做了一件事

    每个函数一个抽象层级

    每个函数后面也跟着同一抽象层级的步骤

    switch语句--天生就要干多件事

    用多态来解决

    使用描述性的名称

    函数参数

    最好是没有,越少越好,不要超过3个
    参数多了对编写测试用例的难度加大

    一元函数的普遍形式

    问关于这个参数的某个问题
    或者操作这个参数,比如做转换之类

    标识参数丑陋不堪

    向函数传如bool,意味着函数要干不止一件事

    多元函数理解困难

    参数多于3个就该封装对象了

    分隔指令和询问

    使用异常代替返回错误码

    抽离try/catch代码块

    把错误处理当成一件事

    避免error.java

    新增异常,所有相关的类都要重新编译
    使用异常就不会发生这样的事

    别重复

    重复是一些邪恶的根源

    打磨和重构

    和写文章一样,写完函数后依据前面的原则进行修改

    第四章--注释

    别给糟糕的代码添加注释,重构吧。

    • 不说废话
    • 不误导
    • 不得不写的时候才写

    第五章--格式

    代码尺寸,一个java文件200到500行

    向报纸学习

    源文件顶部给出最高层次的概念和算法
    细节逐一展开

    垂直方向分隔---空白行

    垂直方向聚集

    相似的定义集中

    关系相近的概念放在一起

    函数调用者放在被调用者的上方

    水平方向保持短小

    水平方向相关性弱的用空格分隔

    缩进--符合规范

    团队定义

    第六章--对象和数据结构

    数据抽象

    隐藏实现,用户无需了解数据的实现就能操作数据

    对象和数据结构

    过程式代码便于不修改数据结构而添加新函数,面向对象代码便于不修改函数而增加新类。

    德墨忒尔律

    方法不调用任何函数返回的对象的方法。换言之,只和朋友谈话,不和陌生人谈话。

    数据传送对象

    只有公共变量,没有函数--如javabean

    小结

    灵活添加新数据类型时,使用对象;灵活添加行为时,使用数据类型和过程。

    第七章--错误处理

    使用异常而非错误码

    先写try-catch-finally语句

    try里面的内容像是事务,维护该范围的事务特征

    使用不可控异常

    按照调用者的需要来定义异常类

    别返回null,避免传递null

    小结

    异常处理要独立于主逻辑之外

    第八章--边界

    使用第三方代码

    如果使用类似Map这样的边界借口,就把它保留在近亲类中。

    对第三方代码写测试

    使用上不存在的代码

    使用适配器

    小结

    在使用我们控制不了的代码时,要格外小心。确保未来的修改不会太大。

    第九章--单元测试

    TDD

    三条定律:
    编写不能通过的测试代码前,不写生产代码
    只可编写刚好无法通过的单元测试,不能编译也不算通过
    只可编写刚好通过当前失败测试的生产代码

    保持测试整洁

    应该和生产代码同样重要

    测试带来一切

    可扩展、可维护、可复用

    整洁的测试

    分为3步:构造数据、操作数据、检验操作

    每个测试一个断言

    FIRST原则

    快速、独立、可重复、自足验证、及时

    第十章--类

    类的组织

    要封装

    类要保持短小

    无法准确命名的时候,就表示权责太多了

    单一职责原则

    内聚

    类中的每一个变量都被每一个方法使用,则具有最高的内聚性
    保持函数和参数列表的短小策略,有时会导致实体变量增加;这是应该尝试将变量和方法分拆到多个类中。

    为了修改而组织

    第十一章--系统

    如何在更高的抽象层级--系统层级上保持整洁

    将系统的构造和使用分开

    起始过程和运行时逻辑分离

    分解main

    将全部构造过程搬到main中,main函数创建所有的对象,再传递给应用

    使用工厂

    隔离构造细节

    依赖注入

    控制反转将第二责权拿出来,转移到另一个专注于此的对象中,从而遵循了单一职责原则

    扩容

    面向方面编程,Java相关机制

    Java代理

    待深入

    纯Java AOP框架

    待深入

    AspactJ切面

    测试驱动系统架构

    使用POJO编写业务逻辑,在代码层面与架构关注面分离开,就有可能用测试来驱动架构。

    最佳的系统架构由模块化的关注面领域组成,每个关注面均用JAVA对象构成。不同领域之间用不具有侵害性的方面工具整合起来。

    优化决策

    拥有模块化关注面的POJO系统提供的敏捷能力,允许我们基于最新的知识做出决策。

    系统需要DSL

    DSL领域特定语言允许所有抽象层级和应用程序中的所有领域,都使用POJO来表达。

    第十二章--跌进

    通过跌进设计达到整洁目的

    kent back四原则

    运行所有测试

    设计的系统是否达到预期,需要通过验证。不能被测试的系统,不应部署

    重构

    修改代码就会导致新的问题,测试消除了这样的恐惧。

    不可重复

    重复是拥有良好设计的大敌。
    模板方法模式是一种移除高层级重复有效的办法。

    表达力

    作者把代码写的越清晰,其他人花在读懂代码上的时间越少,从而减少缺陷,缩小维护成本。

    尽可能少的类和方法

    前面的几点更为重要

    第十三章--并发编程

    为什么要并发

    是一种解耦策略,帮助我们把何时、做什么事情分开。
    一些中肯的说法:
    并发是很复杂的,即便很简单的系统
    并发会在性能和编写代码增加一些开销
    常常需要对设计策略进行根本性修改

    并发防御原则

    单一职责原则--分离并发代码和非并发代码

    限制数据的作用域

    使用synchronized

    使用数据副本

    线程尽可能的独立、

    了解java线程安全集

    了解执行模型

    • 限定资源
    • 互斥
    • 线程饥饿
    • 死锁
    • 活锁

    线程模型:

    • 生产者消费者模型
    • 读者作者模型
    • 宴席哲学家

    避免使用一个同步对象的多个方法

    测试线程代码

    频繁运行,发现错误
    自动化测试

    第十四章--逐步改进

    通过重构一个冲虚讲解了何时需要改进、如何逐步改进

    第十五章--JUnit框架

    通过重构junit的一个类来展示了cleancode的方法,也证明了优秀的代码也能更好。

    第十六章--重构serialDate

    第十七章--味道和启发

  • 相关阅读:
    css 中 overflow: hidden清楚浮动的真正原因
    Get、Post请求中文乱码问题有效解决方法
    安装PostgreSQL和卸载PostgreSQL
    PostgresSql日期字段比较大小
    关于多线程编程的一点思考
    Python 虚拟环境 pyenv、venv(pyvenv)、virtualenv之间的区别
    python常用命令
    python中各种文件打开模式a w r
    python-安装
    day1-安装配置
  • 原文地址:https://www.cnblogs.com/morninglight/p/6285932.html
Copyright © 2011-2022 走看看