代码简洁之道
规范代码书写,提高代码可读性和便于维护修改,节约维护成本。
读了《代码简洁之道》一书总结笔记。
1.有意义的命名
在给文件或代码命名时做到名副其实,取一个不需要注释的名字。
java命名规则:项目名全部用英文小写。
包名一般用域名反写表示。
类名所以单词首字母大写表示,类名不应该是动词。
变量名,方法名用驼峰命名法即第一个单词全小写,后面单词首字母大写。方法名应该是单词或者动词短语。
常量用全大小字母和单词之间下划线隔开表示。
避免使用容易误导的词,以及几个高度相似的词。
使用可以读出来的名称。
使用便于搜索的名称。
2.函数
函数要求短小。
函数应该只做一件事。
每个函数一个抽象层级。
自顶向下读代码:向下规则。
switch语句如果只出现一次而且隐藏在某个继承关系中,系统其他部分看不见。
使用具有描述性的名称。
函数参数尽量做到最少。
无副作用。
分隔指令与询问。
使用异常替代返回错误码。
结构化编程。
3.注释
注释不能美化糟糕的代码。
好的注释:法律信息,提供信息的注释,对意图的解释,阐释,警告,TODO注释,放大一些看起来不合理之物的重要性,共用API中的Javadoc。
4.格式
垂直格式
团队规则
5.对象和数据结构
数据抽象。
数据,对象的反对称性。
得墨忒耳律:模块不应该了解它所操作对象的内部情形。
准确的说,类C的方法f只应该调用以下对象的方法:
- C;
- 由f创建的对象;
- 作为参数传递给f的对象;
- 由C的实体变量持有的对象;
数据传送对象(DTO):最为精炼的数据结构,是只有一个公共变量,没有函数的类。
6.错误处理
使用异常而非返回码。
先写try-catch-finally语句。
使用未检异常。
给出异常发生的环境说明。
依调用者需要定义异常类。
定义常规流程。
别返回和传递null值。
7.边界
当我们购买使用第三方程序包或使用开放源代码,或者其他团队打造的组件或子系统,将代码整合到自己代码中时需要保持软件边界整洁。
浏览和学习边界。
学习log4j。
学习性测试。
使用尚不存在的代码。
8.单元测试
TDD三定律
- 第一定律:在编写不能通过单元测试前,不可编写生产代码。
- 第二定律:只可编写刚好无法通过的单元测试,不能编译也算不通过。
- 第三定律:只可编写刚好足以通过当前失败测试的生产代码。
每个测试一个断言。
5条规则:F(快速).I(独立).R(可重复).S(自足验证).T(及时)
9.类
类的组织:封装
类应该短小。
单一权责原则(SRP):认为类和模块应该有且只有一条加以修改的理由。
保持内聚性就会得到许多短小的类。
为了修改而组织。
10.系统
将系统的构造与使用分开。
分解main
工厂
依赖注入
扩容。
Java代理
纯Java AOP框架
AspectJ语言
测试驱动系统架构。
优化决策。
明智使用添加了可论证价值的标准。
系统需要领域特定语言。
11.迭进
简单设计:
- 运行所有测试。
- 不可重复,重构。
- 表达程序员的意图。
- 尽可能减少类和方法的数量。
12.并发编程
并发是一种解耦策略。
解耦目的与时机可以明显改进应用程序的吞吐量和结构。
并发防御原则:
- 单一权责原则。
- 推论:限制数据作用域。
- 推论:使用数据副本
- 推论:线程应该尽可能独立
了解Java库。
了解执行模型:生产者,读者,宴席哲学家。
警惕同步方法之间的依赖。
保持同步区域微小。
测试线程代码:将伪失败看作可能的线程问题,先使非线程可工作,编写可插拔的线程代码,编写可调整的线程代码,运行多于处理器数量的线程,在不同平台上运行,装置试错代码,硬编码,自动化。