# 整洁代码经典实例(Clean Code Cookbook) - Maximiliano Contieri
## 关注声明的行为,而不是执行的过程
### 避免过程式代码中的空行
- ❌避免通过空行分隔过程式代码块,在每个代码块上编写注释
- ✅将代码块切分为函数,以函数名作为功能声明,再以无空行的方式调用这些函数
### 使用有意义的实体名称
- ✅在复杂字符串(如正则表达式)中使用有意义的命名字符串片段进行拼接❌而非一股脑写出
- ✅立即数或者不平凡的设计决策,最好使用命名常量或有意义函数名,❌而非仅依赖注释
- ❌避免使用`input`/`output`/`data`/`result(res)`/`ret`/`flag`等无行为指示的名称
### 面向对象
- ✅暴露对象的行为(方法)而非数据和结构
- ✅确保对象的本质定义永恒不变(从构造后到析构前行为逻辑统一一致)
- ✅确保对象的职责明确,❌不负责处理多余行为,也不依赖其他对象来完成应该仅由其自身完成的行为
- ❌避免缺失抽象带来的重复代码段
### 有意义的过程控制
- ✅报错中可以添加对特定规则的强调声明,❌而非只展示错误本身(如`index out of range`→`index should in [0, maxn]`)
- ✅使用对象式或函数式迭代或生成器,❌而非下标循环(基于下标数字的处理除外)
- ✅对于复杂布尔判断,分发责任(使用多态方法/使用责任链)或使用状态管理机制,❌而非无限制的if/case
- ✅对于参数有交集的不同函数,其传参顺序应符合一致规律;对于参数过多的函数,将相关参数分组为对象以简化参数数量
- ✅使用版本历史管理代码变更,❌而非原地注释代码
## 减少歧义和错义
- ❌尽可能避免副作用
- ❌尽可能避免双重否定(如`!disabled)
- ✅对于可枚举数据,在支持的语言中定义枚举值或常量,❌而非字符串
## 避免过度设计和过早优化
- ✅专注于已知或已能预测的实际任务本身,适度放弃可维护性(如一次性编程)和可扩展性(如原型验证)
- ❌避免只有一个子类的类,和只有一种实现的接口(依赖反转除外)
- ❌不要同时开发新功能和重构旧功能,✅重构就是重构
## 快速失败原则
- ✅开启所有值得验证的前提条件、后置条件的断言