什么是设计模式以及它如何使编程生产力受益?

时间:2010-07-03 22:32:15

标签: language-agnostic design-patterns

我一直在阅读各种编程风格,比如XP(首先编写测试),并且遇到了一本只有设计模式的Java书,看起来像伪代码。

这些设计模式用于什么?在编程环境中设计apttern是指什么是它的应用程序?它是否像用于构建特定于域的应用程序的蓝图一样?

6 个答案:

答案 0 :(得分:6)

设计模式是描述常见问题解决方案的方法。它们不是特定的代码,通常可以以不同的方式实现。

如果以工程学为例,设计模式可能是“一个轮子”。可能有很多不同类型的车轮,但总的来说“车轮”保持不变。

在软件开发中,有类似的想法“正常工作”以解决一个常见问题,如果你告诉另一个开发人员你使用了“工厂”,他大致知道你的意思,就像工程师大致知道你是什么一样“意思是”轮子“。

因此,设计模式是澄清开发人员之间沟通并充当可重用想法的一种方式。它们有点像更抽象的编程解决方案的库,它们大多数与您使用的实际语言无关。

答案 1 :(得分:4)

设计模式是解决常见设计问题的通用可重用解决方案。实际上,我们可以概括为:模式是一个普遍存在的问题的可重用解决方案。不仅有设计模式,还有编码模式(虽然我们不称之为,我们称之为成语),架构模式,用户体验模式,过程模式等。

然而,这个定义存在一个小问题:在编程中,我们称通常可重用的解决方案来解决 Program 常见问题。所以,换句话说,如果你有一个反复出现的问题,你就编写一个程序,只有当不能编写程序时,然后才需要一个模式。< / p>

所以,另一个定义是:模式是一个你无法编写的程序,因为你的编程语言太弱而无法表达它。

因此,一般来说,在尝试使用Pattern之前,应该尝试使用更好的编程语言。然而,编程语言设计完全取决于权衡:设计一种能够同样表达所有问题的编程语言是根本不可能的。因此,在代码中使用一些设计模式是完全没问题的,但是你不应该有很多这样的设计模式,你肯定不应该在你的核心业务逻辑中有任何模式。这表明您选择了错误的编程语言,没有任何模式可以解决这个问题。

这是一个例子:在汇编编程中,在程序的不同部分之间共享一个参数化的行为是一个常见的设计问题。并且有一种设计模式可以解决这个问题:它被称为子程序。但是在不同的语言中,实际上在几乎所有现代语言中,子程序(有时称为过程,函数,方法,例程,子)都内置在语言中。他们不是模式,他们只是在那里,甚至没有人再考虑他们。所以,如果你的代码中只有一个或两个子程序,那很好。但是如果你有很多,那么装配可能不是正确的选择。

其他一些示例:在基于原型的OO语言中,内置了Prototype Pattern。在具有多个dispatch的语言中,内置了访问者模式。在Ruby中,没有构造函数,您总是使用Factory Methods考虑此事。在基于委托的OO语言中,内置了Decorator模式。在具有高阶过程的语言中,内置了Iterator模式。在没有可变状态的语言中,Iterator模式实际上是 Antipattern

答案 2 :(得分:1)

当您将设计模式称为“蓝图”时,您已经做对了。

它们是解决问题的“标准”方式,可以适应您的环境。模式的完整描述应包括边/角情况,使您可以更直接地编写解决方案。

您仍然必须确保选择正确的模式来解决您的问题,并且知道它适用的时间和地点,或许更重要的是,它不适用的地方。

这不是为您编写代码的“银弹”。

答案 3 :(得分:1)

是的,但是在较小的级别上,它们不是整个应用程序的蓝图,而是构建应用程序时通常遇到的问题。

例如,当您要根据字符串创建不同对象的实例时。您可能会尝试一系列ifs,稍后会注意到通过语言的反射功能进行的低效尝试,然后注意这是不灵活的,并提出了一个关联列表,它映射字符串不同的函数创建不同类的实例。

这个最终的解决方案效果很好而且非常优雅,所以当你在未来遇到类似的问题而不先尝试所有的死胡同时,你会使用类似的技巧。恭喜你,你刚刚发明了一种设计模式。

1994年,“四人帮”(Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides)有了收集这些经常出现的模式并将其发布在一本名为“设计模式”的书中的想法。

了解这些模式的好处当然是,您可以为您使用的技术命名(使其更容易与更高级别的其他人讨论类设计)以及其他程序员意识到设计模式将类似地命名它们的构造(因此你将在它们的代码中识别它们。)

答案 4 :(得分:0)

以您用作示例的测试驱动开发实际上并不是“设计模式”。

设计模式是构建程序以解决常见但抽象问题的方法。一个典型的例子是Factory模式。如果要封装(即防止调用者搞乱)对象创建的各个方面,可以使用Factory来处理创建新对象的过程。

你可能想要为“四人帮”进行谷歌搜索,他们编写了关于设计模式的教科书(找到了here)。

答案 5 :(得分:0)

正如大家所说,他们实际上是“蓝色 - 打印”来解决常见问题。许多开发人员每天都使用它们,而不知道他们使用的是定义的“模式”,因为其中很多都是“有意义的”

不幸的是,很多人会因为了解这些模式而受益,但却不知道他们的存在。

查看GOF deffinitions的以下链接

http://www.dofactory.com/Patterns/Patterns.aspx

然后研究Martin Fowlers Enterprise模式以及Bob Martin的SOLID主体(虽然这些模式本身不是模式,但它们是一个很好的基础。