第一章;整洁代码
第二章:有意义的命名
- 名副其实,看名称能够理解意识,减少注释补充说明
- 做有意义的区分
第三章:函数
- 短小:if语句,else语句,while语句,其中的代码块应该只有一行
- 只做一件事:如果函数只是做了该函数下的同一抽象层上的事情,则函数只做了一件事。编写函数为了把一些大一些概念拆分为另一个逻辑层次的一系列步骤
- 向下原则:每个函数后面都跟着位于下一个抽象层级的函
public Money caluatePay(Employee e) throws InvalidEmployeeType {
swicth(e.getType()) {
case COMMISSIONED:
return caluateCommissionPay(e);
case HOUR:
return caluateHourPay(e);
default:
throw new InvalidEmployeeType(e.getType());
}
}
public abstract class Employee {
public abstract boolean isPayDay();
public abstract Money caluatePay();
public abstract deliverPay(Money pay);
}
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord employeeRecord) throws InvalidEmployeeType;
}
public EmployeeImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord employeeRecord) throws InvalidEmployeeType {
swicth(employeeRecord.getType()) {
case COMMISSIONED:
return new CommissonedEmployee(employeeRecord);
case HOUR:
return new HourEmployee(employeeRecord);
default:
throw new InvalidEmployeeType(employeeRecord.getType());
}
}
}
- 控制函数的参数个数,使用参数对象
- 抽离try/catch的主题函数
- 使用错误码代替异常常数
第四章:注释
- 注释用于弥补我们在代码标示意图时的失败。
- 尽量避免注释,时间越久可能偏离事实
第五章:格式
- 源文件的对顶部应该给出高层次的概念和算法,细节依次展开。
第六章:对象和数据结构
- 数据隐藏于抽象之后,暴露操作数据的函数;数据结构暴露其数据,没有提供有意义的函数
- 过程式函数便于在不改动既有数据结构情况下添加新函数,面向对象代码便于在不改动既有函数的情况下添加新类
- 模块不应该了解不所操作对象的内部情节
- 数据结构不会有任何操作
第七章:错误处理
- 可控异常违反了开放封闭原则,底层的修改会导致高层的函数签名
- 不要返回null
第八章:边界
第九章:测试
第十章:类
- 单一权责:只有一个修改的理由
- 具体类包含实现细节,抽象类只呈现概念
第十一章:系统
- 软件系统应该应将启动过程和启动过程后的运行时逻辑分离,在起始过程中构建应用对象,也会存在相互的依赖关系
第十二章:迭进
第十三章:并发编程
- 对象是过程的抽象,线程是调度的抽象
- 避免数据在多线程共享是避免在多线程间共享
- 线程安全包,java.til.concurrent