你是否使用设计模式?

29

设计模式在现实世界中的普及程度如何?你在日常工作中是否使用它们 - 与同事讨论如何以及在哪里应用它们 - 还是它们更多地仅是学术概念?

它们实际上为您的工作提供了实际价值吗?还是它们只是人们谈论时显得聪明的东西?

注:出于这个问题的目的,忽略像 Singleton 这样的“简单”设计模式。我谈论的是设计您的代码以便您可以利用 Model View Controller 等模式。

15个回答

55
任何一款良好编写的大型程序都会使用设计模式,即使它们没有被命名或认可为这样的模式。这就是设计模式的含义,即重复而自然地出现的设计。如果你需要与一个丑陋的API进行接口交互,你可能会发现自己要实现一个外观模式来整理代码;如果你需要解耦组件之间的消息传递,你可能会使用观察者模式;如果你有几个可互换的算法,你可能会使用策略模式。
了解设计模式是值得的,因为你更可能能够识别它们,并更快地找到一个干净的解决方案。然而,即使你完全不知道它们,你最终也会创建它们(如果你是一个合格的程序员)。
当然,如果你使用一种现代语言,你可能会被迫使用它们做一些事情,因为它们已经被集成到标准库中了。

10

在我看来,问题:“你是否使用设计模式?”,单独提出来有点缺陷,因为普遍的答案是“是”。

让我解释一下,我们程序员和设计师都使用设计模式...我们只是不总是意识到它。我知道这听起来很陈词滥调,但你不会去寻找模式,而是模式会找上门来。你设计东西,它可能看起来像一个现有的模式,你以那种方式命名它,以便每个人都明白你在说什么,你的设计决策背后的基本原理更加强大,因为已经在之前被广泛讨论过。

我个人将模式用作沟通工具。就是这样。它们不是设计解决方案,也不是最佳实践,也不是工具箱中的工具。

别误解我的意思,如果你是初学者,有关模式的书籍将向你展示如何“使用”他们的模式而不是其他错误的设计来解决问题。你可能会从这个练习中学到东西。然而,你必须认识到,这并不意味着每种情况都需要相应的模式来解决。每种情况都有一些怪癖,在那里需要你思考替代方案,并做出没有完美答案的困难决定。那就是设计。

然而,反面模式是完全不同的一类。你实际上希望积极避免反面模式。这就是为什么反面模式如此有争议的原因。

回到你最初的问题:
“我使用设计模式吗?” 是!
“我是否积极倾向于设计模式?” 不是。


4
是的,适当使用设计模式确实很好。正如您所提到的,我现在将Model-View-Controller(MVC)用于所有Web项目中。这是Web领域中非常常见的一种模式,可以使服务器端代码更加清晰和组织有序。
除此之外,以下是一些其他可能有用的模式:
- MVVM(Model-View-ViewModel):与MVC类似的模式;用于WPF和Silverlight应用程序。 - 组合:非常适合需要使用对象层次结构的情况。 - 单例:比使用全局变量更优雅,用于存储真正需要单个实例的项目。正如您所提到的,这是一个简单的模式,但它确实有其用途。
值得注意的是,设计模式也可以突出语言功能的缺乏和/或语言的不足之处。例如,迭代器现在作为较新语言的一部分内置。
总的来说,设计模式非常有用,但您不应该到处使用它们;只有在它们符合您的需求时才使用它们。

3

我确实尝试过使用它们。它们确实有助于维护代码的可读性和可维护性。然而,有些人会滥用它们,通常是通过强制将系统强行套入一个不存在的模式。


3

我会在适当的时候使用设计模式。我认为看到开发人员仅仅为了炫技而在代码中实现设计模式是有点悲哀的。但对于正确的任务,设计模式可以非常有用和强大。


但如果你不试着使用它,如何能熟悉它呢?第一次可能会有些不顺利,但随着时间的推移,你会开始适当地使用它们。换句话说,没有失败怎么能成功呢? - BinaryButterfly
当然你应该进行实验,但不要使用生产代码。这就是我所说的。 - Patrik Svensson
但是,生产代码不是真正的测试吗?你所做的是否实际有效并且运行良好? - Steven Evers

2

除了简单的设计模式外,还有许多在“现实世界”中使用的设计模式。Stackoverflow使用了模型-视图-控制器(MVC)模式作为良好的示例。我在雇主的项目中多次使用了类工厂,并且我已经看到许多已编写的项目也在使用它们。

我并不是说每个设计模式都被使用,但是许多设计模式确实被使用了。


2

是的,我们会使用设计模式,通常发生在我们开始设计某个东西时,有人注意到它类似于一个现有的模式。然后我们会查看它并看看它如何帮助我们实现目标。

我们还会使用未记录的模式,这些模式是从大量设计中出现的。

请注意,我们并不经常使用它们。


2

是的,我的日常工作中会使用Factory、Chain of Responsibility、Command、Proxy、Visitor和Observer等技术。至于MVC方面,这个网站似乎使用得很好,在最新的播客中,开发人员对它赞不绝口。


1

是的,设计模式或抽象模式是我的生活的一部分,无论我看到哪里,我都开始看到它们。因此,我被它们包围着。但是,正如你所知道的,一知半解是很危险的。因此,我强烈建议您阅读GoF书籍。

关于设计模式的主要问题之一是,大多数开发人员只是不理解这个概念,或者不相信它们的作用。而且大多数时候他们会争论变量、循环或开关等问题。但是,我坚信如果你不会说出模式语言,你的软件将无法走得远,你会发现自己处于维护噩梦中。

正如你所知道的,反模式也是很危险的事情,当你对设计模式缺乏专业知识时就会发生。而重构反模式则更加困难。关于这个问题的推荐书籍是《反模式:重构软件、架构和危机项目》。


1
是的,我使用了很多众所周知的设计模式,但后来发现自己构建了一些使用了“命名”设计模式的软件。大多数优雅、可重用的设计可以称为“模式”。这有点像舞步一样。我们都知道华尔兹和两步舞,但并非每个人都知道“碰撞和滑行”的名字,尽管大多数人都会做这个动作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接