29

设计模式在现实世界中的渗透率如何?你是在日常工作中使用它们——与你的同事讨论如何以及在哪里应用它们——还是它们更多地是一个学术概念?

他们真的为你的工作提供了实际价值吗?或者它们只是人们谈论听起来很聪明的东西?

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

4

15 回答 15

54

任何编写良好的大型程序都会使用设计模式,即使它们没有被命名或识别为这样。这就是设计模式,重复自然发生的设计。如果您正在与丑陋的 API 交互,您可能会发现自己实现了一个Facade来清理它。如果您有需要解耦的组件之间的消息传递,您可能会发现自己使用Observer. 如果您有几种可互换的算法,您最终可能会使用Strategy.

了解设计模式是值得的,因为您更有可能识别它们,然后更快地集中在一个干净的解决方案上。然而,即使你根本不知道它们,你最终还是会创建它们(如果你是一个体面的程序员)。

当然,如果您使用的是现代语言,您可能会被迫在某些事情上使用它们,因为它们已被纳入标准库。

于 2008-08-14T19:54:09.633 回答
10

在我看来,“你使用设计模式吗?”这个问题本身就有一点缺陷,因为答案普遍是肯定的。

让我解释一下,我们,程序员和设计师,都在使用设计模式……只是我们并不总是意识到这一点。我知道这听起来很陈词滥调,但你不去寻找模式,模式会来找你。你设计的东西,它可能看起来像一个现有的模式,你这样命名它是为了让每个人都能理解你在说什么,并且你的设计决策背后的理由更有说服力,因为知道它之前已经被讨论过,令人作呕

我个人使用模式作为交流工具。就是这样。它们不是设计解决方案,它们不是最佳实践,它们不是工具箱中的工具。

不要误会我的意思,如果您是初学者,有关模式的书籍将向您展示如何“使用”他们的模式而不是另一个有缺陷的设计来最好地解决解决方案。你可能会从练习中学到东西。但是,您必须意识到,这并不意味着每种情况都需要相应的模式来解决它。每种情况都有一个怪癖,这将要求您考虑替代方案并做出没有完美答案的艰难决定。这就是设计。

然而,反模式是完全不同的类别。您实际上积极避免反模式。这就是为什么命名反模式如此有争议的原因。

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

于 2008-08-14T20:16:55.733 回答
4

是的。如果使用得当,设计模式会很精彩。正如您所提到的,我现在在我的所有 Web 项目中都使用模型-视图-控制器 (MVC)。这是 Web 空间中非常常见的模式,它使服务器端代码更加清晰和组织良好。

除此之外,还有一些其他可能有用的模式:

  • MVVM(模型-视图-视图模型):类似于 MVC 的模式;用于 WPF 和 Silverlight 应用程序。

  • 组合:非常适合需要使用对象层次结构的情况。

  • Singleton:比使用全局变量更优雅地存储真正需要单个实例的项目。正如你所提到的,一个简单的模式,但它确实有它的用途。

值得注意的是,设计模式还可以突出语言功能的缺乏和/或语言的缺陷。例如,迭代器现在作为新语言的一部分内置。

一般来说,设计模式非常有用,但你不应该在任何地方都使用它们;正是它们非常适合您的需求。

于 2010-02-14T14:03:20.153 回答
3

我尝试,是的。它们确实有助于代码的可维护性和可读性。但是,有些人确实滥用它们,通常(据我所见)通过强迫系统进入不存在的模式。

于 2008-08-14T19:41:40.330 回答
3

如果适用,我会尝试使用模式。我认为看到开发人员仅仅为了它而在代码中实现设计模式有点令人难过。但是,对于正确的任务,设计模式可能非常有用和强大。

于 2008-08-14T19:46:04.597 回答
2

在“现实世界”中使用了许多超越简单的设计模式。很好的例子 Stackoverflow 使用模型视图控制器模式。我在我的雇主的项目中多次使用 Class Factories,我也看到许多已经编写好的项目也在使用它们。

我并不是说每个设计模式都在使用,但很多都在使用。

于 2008-08-14T19:42:32.840 回答
2

是的,我们这样做了,这通常发生在我们开始设计某些东西然后有人注意到它类似于现有模式时。然后我们看一下它,看看它如何帮助我们实现目标。

我们还使用没有记录但在大量设计中出现的模式。

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

于 2008-08-14T19:44:40.667 回答
2

是的,工厂、责任链、命令、代理、访问者和观察者等都在我每天使用的代码库中使用。就 MVC 而言,这个网站似乎很好地使用了它,开发人员在最新的播客中说不出足够多的好话。

于 2008-08-14T19:44:48.467 回答
1

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

于 2008-08-14T19:47:18.010 回答
1

MVC 是众所周知的,所以是的,我们经常使用设计模式。现在,如果您询问 Gang of Four 模式,我会使用几种模式,因为其他维护人员会知道设计以及我们在代码中的工作目标。虽然有几个对于我们所做的事情仍然相当模糊,所以如果我使用一个,我就无法获得使用模式的全部好处。

它们是否重要,是的,因为它为您提供了一种以快速有效且普遍接受的方式谈论软件设计的方法。你能做更好的定制解决方案吗,是的(排序)?

最初的 GoF 模式是从生产代码中提取的,因此他们对已经在野外使用的内容进行了分类。它们不是纯粹的,甚至主要是学术的东西。

于 2008-08-14T19:47:20.880 回答
1

我发现 MVC 模式对于隔离您的模型逻辑非常有用,它可以被重用或在没有太多麻烦的情况下工作。它还有助于解耦你的类并使单元测试更容易。我最近写过它(是的,无耻的插件在这里......)

此外,我最近使用来自基类的工厂模式使用LINQ生成并返回我即时需要的正确 DataContext 类。

在尝试将两种不同的技术粘合在一起时使用桥接器(例如Mac 上的Cocoa 和 Ruby )

然而,我发现,每当我实现一个模式时,都是因为我事先就知道它。因为我发现我必须稍微修改原始模式以适应我的需要,所以通常会考虑一些额外的想法。

你只需要小心不要成为建筑宇航员

于 2008-08-14T19:50:15.007 回答
1

是的,设计模式在现实世界中大量使用——而且每天都被我共事的许多人使用。

在我看来,设计模式提供的最大价值在于它们为您提供了一种通用的高级语言,可以将软件设计传达给其他程序员。

例如,与其将您的新类描述为“基于某种输入标准组合创建其他几个类之一的实用程序”,您可以简单地说它是一个“抽象工厂”,每个人都会立即理解您在说什么。

于 2008-08-27T17:50:05.980 回答
1

是的,设计模式或抽象模式是我生活的一部分,我在哪里看,我就开始看到它们。因此,我被他们包围了。但是,如您所知,知之甚少是一件危险的事情。因此,我强烈推荐你阅读 GoF 的书。

关于设计模式的主要问题之一,大多数开发人员只是不明白,或者不相信它们。大多数时候,他们争论的是变量、循环或开关。但是,我坚信,如果你不会说模式语言,你的软件就不会走得太远,你会发现自己陷入了维护的噩梦。

如您所知,反模式也是危险的事情,当您对设计模式缺乏专业知识时就会发生这种情况。并且重构反模式更加困难。作为关于这个问题的推荐书籍,请阅读“AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis”。

于 2010-03-30T11:56:41.200 回答
1

是的。

我们甚至在我目前的工作中使用它们:使用 COBOL 和 PL/I 进行大型机编码。

到目前为止,我已经看到了 Adaptor、Visitor、Facade、Module、Observer 以及非常接近 Composite 和 Iterator 的东西。由于语言的性质,它主要使用结构模式。此外,我并不总是确定使用它们的人是否有意识地这样做:D

于 2012-10-19T08:45:20.830 回答
0

我绝对使用设计模式。在这一点上,我认为 MVC 作为一种设计模式是理所当然的。我使用它们的主要原因是我足够谦虚,知道我可能不是第一个遇到特定问题的人。我很少开始一段代码知道我将使用哪种模式;我不断地观察代码,看它是否自然地发展成现有的模式。

我也很喜欢Martin Fowler 的 企业应用架构模式。当一个问题或任务出现时,我会翻到相关部分(它主要是一本参考书)并阅读一些模式概述。一旦我对一般问题和现有解决方案有了更好的了解,我就会开始通过其他人的经验看到我的代码可能会采取的长期路径。我最终会做出更好的决定。

设计模式肯定在我所有的“面向未来”的想法中发挥了重要作用。

于 2008-08-14T21:50:32.910 回答