每当我听到反模式时,我都会想起另一个术语,即。设计气味。
“设计异味是设计中的某些结构,表明违反了基本设计原则并对设计质量产生负面影响”。(摘自“软件设计异味的重构:管理技术债务”)
有许多基于违反设计原则的设计气味:
抽象气味
缺少抽象:当使用数据块或编码字符串而不是创建类或接口时,就会产生这种味道。
命令式抽象:当一个操作变成一个类时,就会产生这种味道。
不完整的抽象:当抽象不完全支持互补或相互关联的方法时,就会产生这种味道。
多方面抽象:当一个抽象有多个职责分配给它时,就会产生这种味道。
不必要的抽象:当在软件设计中引入实际上不需要(因此可以避免)的抽象时,就会出现这种气味。
未使用的抽象:当抽象未使用(未直接使用或无法访问)时,就会产生这种气味。
重复抽象:当两个或多个抽象具有相同的名称或相同的实现或两者兼有时,就会产生这种气味。
封装气味
封装缺陷:当一个或多个抽象成员的声明可访问性比实际要求的更宽松时,就会出现这种气味。
泄漏封装:当抽象通过其公共接口“暴露”或“泄漏”实现细节时,就会产生这种味道。
缺少封装:当实现变体未封装在抽象或层次结构中时,就会出现这种气味。
未利用的封装:当客户端代码使用显式类型检查(使用链式 if-else 或 switch 语句检查对象类型)而不是利用已封装类型的变化时,就会出现这种气味在一个层次结构中。
模块化的味道
破碎的模块化:当理想情况下应该本地化到单个抽象中的数据和/或方法被分离并分布在多个抽象中时,就会产生这种味道。
模块化不足:当存在尚未完全分解的抽象时,就会产生这种味道,而进一步分解可能会减小其大小、实现复杂性或两者兼而有之。
循环依赖模块化:当两个或多个抽象直接或间接相互依赖(在抽象之间创建紧密耦合)时,就会产生这种味道。
Hub-Like Modularization:当一个抽象与大量其他抽象具有依赖关系(传入和传出)时,就会产生这种味道。
层次结构的味道
缺少层次结构: 当代码段使用条件逻辑(通常与“标记类型”结合使用)来显式管理行为变化时,就会产生这种气味,其中层次结构可能已被创建并用于封装这些变化。
不必要的层次结构:当整个继承层次结构是不必要的时,就会产生这种味道,表明对特定设计上下文不必要地应用了继承。
未分解的层次结构:当层次结构中的类型之间存在不必要的重复时,就会产生这种气味。
宽层次结构:当继承层次结构“太”宽表明可能缺少中间类型时,就会产生这种气味。
推测层次结构:当层次结构中的一种或多种类型以推测方式提供时(即基于想象的需求而不是实际需求),就会产生这种气味。
深层次结构:当继承层次结构“过分”深时,就会产生这种味道。
Rebellious Hierarchy:当子类型拒绝其超类型提供的方法时,就会产生这种气味。
Broken Hierarchy:当超类型和它的子类型在概念上不共享“IS-A”关系导致可替换性中断时,就会产生这种气味。
多路径层次结构:当子类型直接或间接继承自超类型导致层次结构中不必要的继承路径时,就会产生这种气味。
循环层次结构:当层次结构中的超类型依赖于它的任何子类型时,就会产生这种气味。
上面的定义和分类在"Refactoring for software design smells: Managing technical debt"中有描述。更多相关资源可以在here找到。