为什么存在异味的代码会加重认知负荷
代码异味: 结构不理想的代码。
代码异味 | 解释 | 级别 |
---|---|---|
过长的方法 | 方法不宜包括执行不同计算的代码 | 方法 |
过长的参数列表 | 方法不宜包括太多参数 | 方法 |
负责的Switch语句 | 程序不宜使用复杂的Switch语句,考虑用多态来替换Switch语句可以简化 | 方法 |
异曲同工的类 | 不宜使用两个初看不同、但字段和方法其实相似的类 | 类 |
基本类型偏执 | 避免在类中过度使用基本类 | 类 |
不完美的程序类库 | 应该在程序类库而不是随机类中添加方法 | 类 |
过大的类 | 类包括的方法和字段不宜过多,否则难以判断类所代表的抽象 | 类 |
冗赘类 | 类包括的方法和字段不宜过少 | 类 |
纯数据类 | 类不宜只包括数据,还应该包括方法 | 类 |
临时字段 | 类不宜包括不必要的临时字段 | 类 |
数据泥团 | 应该把经常组合使用的数据存储在独立的类或结构中 | 类 |
发散式变化 | 通常情况下,代码修改应该在局部进行,最好限制在一个类内。如果必须在不同的位置做出许多不同的调整,则表明代码结构存在问题 | 代码库 |
依恋情结 | 如果B类从A类中引用了大量方法,则表明这些方法更适合放在B类里,应该把他们从A类移至B类 | 代码库 |
狎昵关系 | 类与类之间的联系不宜过多 | 代码库 |
重复的代码(代码克隆) | 代码库的多个不同位置不宜出现相同或极为相似的代码 | 代码库 |
注释 | 注释应该用于描述代码存在的原因为不是代码的作用 | 代码库 |
过长的消息链 | 避免使用过长的消息链(多层嵌套调用) | 代码库 |
中间人 | 如果某个类将自身的许多方法委托给其他类,则应该重新考虑这个类是否有存在的必要 | 代码库 |
平行继承体系 | 如果为一个类创建子类的同时还要为另一个类创建子类,则表明两个类的功能可能应该放在一个类型里 | 代码库 |
被拒绝的遗赠 | 如果类继承了没有使用的行为,则表明继承可能并无必要 | 代码库 |
霰弹式修改 | 通常情况下,代码修改应该在一个类内进行。如果必须在不同位置做出许多小的调整,则表明代码结构出存在问题 | 代码库 |
夸夸其谈的通用性 | 避免为“以防万一”而向代码库中添加功能,只添加需要用到的功能 | 代码库 |
与方法有关的代码异味
如果方法包括多行代码并提供多种功能,那么表明存在“过长的方法”异味或“上帝方法”异味;如果方法传入太多参数,则表明存在“过长的参数列表”异味。
与类有关的代码异味
代码异味既可能与方法有关,也可能与类有关,过大的类就是一例。
与代码库有关的代码异味
除了方法层面和类层面的代码异味,整个代码也可能存在异味。如果代码库的不同位置出现相同或极为相似的代码,那么表明存在“重复的代码(代码克隆)”异味。
代码异味的影响
有异味不一定说明代码错误,但有异味的代码往往更容易出错。
代码异味对认知的负面影响
- 导致工作记忆过载的异味:过长的参数列表和复杂的switch语句
- 阻碍有效分块异味:过大的类和过长的方法
- 导致分块错误的异味:重复的代码
低质量的标识符对认知负荷的影响
代码异味指受到结构反模式影响的代码,即代码本省没有错误,但构造方式不理想。
代码中还可能存在概念反模式,即代码结构正确,但标识符具有误导性。
采用语言反模式来描述这类代码问题。
6种语言反模式 |
---|
方法声明的功能多于方法实现的功能 |
方法声明的功能少于方法实现的功能 |
方法声明的功能不符合方法实现的功能 |
标识符描述的内容多于实体包含的内容 |
标识符描述的内容少于实体包含的内容 |
标识符描述的内容不符合实体包含的内容 |