什么是反模式?

g.r*_*ion 175 ooad design-patterns terminology anti-patterns

我正在研究模式和反模式.我对模式有一个清晰的认识,但我没有反模式.网络和维基百科的定义让我很困惑.

任何人都可以用简单的词语向我解释反模式是什么?什么目的?他们在做什么?这是坏事还是好事?

coo*_*ird 218

反模式是软件开发中被认为是错误的编程实践的某些模式.

设计模式相反,设计模式是已经形式化并且通常被认为是良好开发实践的常见问题的常见方法,反模式是相反的并且是不期望的.

例如,在面向对象的编程中,想法是将软件分成称为对象的小块.面向对象编程中的反模式是一个上帝对象,它执行许多功能,可以更好地分成不同的对象.

例如:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}
Run Code Online (Sandbox Code Playgroud)

上面的例子有一个完成所有事情的对象.在面向对象的编程中,最好对不同的对象具有明确定义的职责,以使代码保持较少耦合并最终更易于维护:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,有很好的方法来开发具有常用模式(设计模式)的软件,但也有开发和实施软件的方法可能导致问题.被认为是不良软件开发实践的模式是反模式.

  • 除了GodObject之外的任何其他反模式的例子? (9认同)
  • 单例是否可以被视为反模式,因为它使得并行模拟和运行测试变得更加困难(因为所有测试都使用和改变相同的单例,从而导致不一致)? (2认同)
  • @lostsoul29,这取决于程序的最终目的是否是并行测试的能力......(在您提到的特定情况下:这是一个应该纠正或记录的可重入问题)。Singleton *是*一种模式,应该用于它所擅长的领域。 (2认同)

小智 50

每当我听到反模式时,我都会记得另一个词.设计气味.

"设计气味是设计中的某些结构,表明违反了基本设计原则,并对设计质量产生了负面影响".(摘自"软件设计的重构嗅觉:管理技术债务")

根据违反设计原则分类的设计气味很多:

抽象气味

缺少抽象:当使用数据块或编码字符串而不是创建类或接口时,会出现这种气味.

势在必行的抽象:当一个操作变成一个类时,会产生这种气味.

不完全抽象:当抽象不完全支持互补或相互关联的方法时,会产生这种气味.

多方抽象:当抽象分配了多个职责时,会产生这种气味.

不必要的抽象:当在软件设计中引入实际上不需要(因此可以避免)的抽象时,就会出现这种气味.

未使用的抽象:当抽象未被使用时(未直接使用或不可访问),会出现这种气味.

重复抽象:当两个或多个抽象具有相同的名称或相同的实现或两者时,会产生这种气味.

封装气味

缺陷封装:当一个或多个抽象成员的声明可访问性比实际需要更宽松时,就会出现这种气味.

漏洞封装:当抽象通过其公共接口"暴露"或"泄漏"实现细节时,就会产生这种气味.

缺少封装:当实现变体未封装在抽象或层次结构中时,会出现这种气味.

Unexploited Encapsulation:当客户端代码使用显式类型检查(使用链式if-else或switch语句检查对象的类型)而不是利用已经封装在层次结构中的类型的变化时,会出现这种气味.

模块化气味

破碎的模块化:当理想地应该已经局部化为单个抽象的数据和/或方法被分离并分布在多个抽象上时,会产生这种气味.

模块化不足:当存在尚未完全分解的抽象时,会产生这种气味,并且进一步的分解可能会减小其大小,实现复杂性或两者兼而有之.

循环相关的模块化:当两个或多个抽象直接或间接相互依赖时(在抽象之间产生紧密耦合),就会产生这种气味.

类似集线器的模块化:当抽象具有大量其他抽象的依赖(传入和传出)时,就会出现这种气味.

层次气味

缺少层次结构:当代码段使用条件逻辑(通常与"标记类型"结合)来明确管理可能已创建层次结构并用于封装这些变体的行为变化时,会出现这种气味.

不必要的层次结构:当整个继承层次结构不必要时,会出现这种气味,表明继承已经不必要地应用于特定的设计上下文.

无法生成的层次结构:当层次结构中的类型之间存在不必要的重复时,就会出现这种气味.

宽层次结构:当继承层次结构"太宽"时,会出现这种气味,表明可能缺少中间类型.

推测层次结构:推测性地提供层次结构中的一种或多种类型时(即,基于想象的需求而不是实际需求),会出现这种气味.

深层次结构:当继承层次结构"过度"深时,会出现这种气味.

叛逆的层次结构:当一个子类型拒绝其超类型提供的方法时,会出现这种气味.

破碎的层次结构:当超类型及其子类型在概念上不共享"IS-A"关系导致破坏的可替代性时,就会产生这种气味.

多路径层次结构:当子类型直接或间接地从超类型继承而导致层次结构中不必要的继承路径时,就会出现这种气味.

循环层次结构:当层次结构中的超类型依赖于其任何子类型时,就会出现这种气味.


上面的定义和分类在"Refactoring for software design smells:Managing technical debt "中描述.这里可以找到一些更相关的资源.


sha*_*oth 34

模式是如何解决某个类问题的想法.反模式是如何不解决它的想法,因为实现这个想法会导致糟糕的设计.

一个例子:"模式"将使用函数进行代码重用,"反模式"将使用复制粘贴.两者都解决了同样的问题,但使用函数通常会导致代码比复制粘贴更易读和可维护.


Ral*_*ach 17

反模式是一种不解决问题的方法.但还有更多内容:它也是一种在尝试解决问题时经常可见的方式.


kma*_*rsh 10

如果您真的想学习AntiPatterns,请阅读AntiPatterns一书(ISBN-13:978-0471197133).

在其中,他们定义"AntiPattern是一种文学形式,它描述了一个常见的问题解决方案,产生明显的负面后果."

因此,如果它是一个糟糕的编程实践但不是一个普通的 - 仅限于一个应用程序,一个公司或一个程序员,它不符合AntiPattern定义的"模式"部分.


Rob*_*uld 9

制造混乱的常见方法.例如,像god/kitchensink类(做所有事情).


小智 6

就像设计模式一样,反模式也是一种模板和解决某个问题的可重复方式,但是以非最佳和无效的方式.


xxm*_*jia 6

一个反模式是一个的补充设计模式.反模式是在特定情况下不应使用的模板解决方案.


Ed *_*kes 5

有趣的是,解决问题的一种方法既可以是模式,也可以是反模式.Singleton就是最好的例子.它将出现在两组文献中.


Tus*_*har 5

今天,软件工程研究人员和从业者经常交替使用“反模式”和“气味”这两个术语。但是,它们在概念上并不相同。维基百科的反模式条目指出,反模式与不良实践或不良想法的区别至少有两个因素。反模式是

“一种常用的过程、结构或行动模式,尽管最初似乎是对问题的适当和有效的反应,但通常会产生比有益结果更多的不良后果。”

它清楚地表明选择反模式是因为相信它是所提出问题的良好解决方案(作为模式);然而,它带来的负债多于收益。另一方面,气味只是一种不良做法,会对软件系统的质量产生负面影响。例如,Singleton 是一种反模式,而 God 类(或 Insufficient Modularization)是一种设计气味。