我正在研究模式和反模式。我对模式有一个清晰的概念,但我没有反模式。来自网络和维基百科的定义让我很困惑。

有人能用简单的话给我解释一下什么是反模式吗?目的是什么?他们做什么?这是好事还是坏事?


当前回答

这是制造混乱的常见方法。例如,god/厨房墨水类(做所有事情)。

其他回答

如果您确实希望学习反模式,请阅读《反模式》(ISBN-13: 978-0471197133)这本书。

在这篇文章中,他们定义“反模式是一种文学形式,它描述了一个问题的常见解决方案,该解决方案会产生明显的负面后果。”

因此,如果这是一种糟糕的编程实践,但并不常见——出现的频率非常有限,那么它就不符合AntiPattern定义中的“模式”部分。

任何对给定的软件开发环境弊大于利的设计模式都被认为是反模式。

有些反模式是明显的,有些则不是。例如,单例,尽管许多人认为这是一个很好的旧设计模式,但也有其他人不这么认为。

你可以检查问题单身有什么不好?为了更好地理解对它的不同意见。

模式是关于如何解决某个类的问题的想法。反模式是一种如何不解决问题的思想,因为实现这种思想将导致糟糕的设计。

举个例子:“模式”是使用一个函数来实现代码重用,“反模式”是使用复制-粘贴来实现相同的功能。两者都解决了同样的问题,但是使用函数通常会比复制粘贴更具有可读性和可维护性。

反模式是软件开发中被认为是糟糕编程实践的某些模式。

设计模式是解决常见问题的常用方法,已经形式化,通常被认为是一种很好的开发实践,与之相反,反模式是不可取的。

例如,在面向对象编程中,思想是将软件分割成称为对象的小块。面向对象编程中的反模式是一个上帝对象,它执行许多功能,最好将这些功能分离到不同的对象中。

例如:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

上面的例子有一个对象可以做所有事情。在面向对象编程中,最好为不同的对象定义明确的职责,以减少代码的耦合,最终更易于维护:

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

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

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

总的来说,有很多使用常用模式(设计模式)开发软件的好方法,但是也有一些开发和实现软件的方法可能会导致问题。被认为是糟糕的软件开发实践的模式是反模式。

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