设计模式在编程中有多重要?


19

我是一名大学生,我刚刚开始学习设计模式,并努力了解它们的目的。我尝试研究它们,但是我发现的所有资源似乎都是以学术而非专业的方式谈论它们。

他们的目的是什么,对学习重要吗?


7
他们很适合面试!
2011年

5
设计模式只是解决问题的一种命名的,通常重复出现的方式。通常,它们是由语言缺陷引起的。
乔恩·普迪

7
理解设计模式的目的需要理解它们所解决的问题。了解这些问题需要有艰苦的实践经验:)
MattDavey 2011年

Answers:


36

设计模式非常适合快速传达您的意图-每个人都知道工厂是什么。

要做的事情真的,真的,真的很糟糕,那就是开始尝试使您的代码适合于模式,或者根据模式来分离职责,诸如此类。说“此对象工厂” 一回事,而说“此对象应专门是工厂”是另一回事。


1
因此,您全都支持模式,但它们并非真正针对您的代码。是的,它们很好地传达了想法,但是当您在实际代码中看到模式时,它们甚至更好。
Newtopian 2011年

3
为什么要投票?这实际上是恕我直言的最佳答案。编码是常识,有时您可以快速使用非常适合解决问题的模式。但是,一旦人们开始到处虐待他们,那将变成一团糟。
编码器

1
每个代码都包含一些模式,即使您不知道它也是如此。您正在谈论的设计模式只是重新组合并命名一组广泛使用和有用的模式。当您了解它们时,您可以更自觉地思考它们。如果您将其中一个类称为“ ControlDispenser”,则可能没人会知道它应该做什么。但是,如果您知道工厂模式,则将其称为“ ControlFactory”,其他人将立即理解。
Olivier Jacot-Descombes

4
如果它有其他目的,那应该是另一类……关注点分离。
Nate

2
@Nate:目的之一可能是几种模式。一类没有理由只涉及一种模式。模式不是“原子”责任。单一职责可能需要几种模式。
DeadMG

26

从维基百科上有关“ 设计模式”的文章:

讲模式的有用之处在于,有一个通用的术语来讨论设计师已经一遍又一遍的情况。

长期以来,我们在软件工程方面遇到了一个严重的问题:您雇用了一个项目的新手,无论他们对编程语言的了解程度如何,都需要花费数月的时间来了解您的工作情况。项目才能使他们富有成效。在硬件工程中,他们很久以前解决了这个问题:他们有一个通用的术语,称为“示意图”。您雇用了一名硬件工程师,在早上给他们硬件项目的原理图,让他们研究它们,直到晚上,在需要称呼这一天之前,他们可以拿起焊锡枪并提高生产率。我们一直在努力想办法使之变得更好。编程语言的标准化是一种方法。标准库(现今的类库)已经成为另一种方式。但是最重​​要的方法之一可能是设计模式。那么,它们重要吗?你打赌!


3
将软件开发与电气工程进行比较,就如同将土星火箭与自行车相提并论一样准确。两种运输方式(从A点到B点)都完全不同,且不兼容。
jer

3
@jer嗯,您的类比很差。他们俩都是工程学科。即使它们的相似之处到此结束,但按照定义,它们仍然有很多共同点。我们不希望将它们等同起来,但是一个可以从另一个中学到很多东西。
Mike Nakis 2011年

6
@Mike:有根本的区别:电气电路由硬物理极限的限制。软件系统受到人类智力模糊界限的限制。
凯文·克莱恩

3
首先,我没有说没有太大的差异。其次,您的陈述也不正确。软件确实遵守硬约束,这些约束是由语言的语法设置的。并且人类智力可以互连电子组件的排列的数量也是无限的。但是,我再次不想将两者等同,甚至不是说有很多相似之处。我只是说,一个人可以向另一个人学习很多东西
Mike Nakis 2011年

3
由于软件全部与设计有关,因此类似的电气工程类比将是对放大器电路中“电流镜”和“负反馈”的讨论。这些不是原理图上的分立组件,而是满足特定目的的多个组件的排列。在不知道组件用途的情况下知道如何连接组件将使新手无法进行新设计。(即,这是在理解方面的进步。)
rwong 2011年

9

模式的存在确实有两个不同的实质性原因。

第一个已经被很好地解释了:模式的使用可以润滑开发人员之间的通信。如果您和我俩都明白,当我说“观察者”时,我是在谈论非常具体的代码结构,那么我可以非常快速地描述使用该模式的一些代码是如何工作的。另一种方法是完整描述解决方案,这既耗时又容易出错。(“好吧,我创建了这个纯虚拟类,它描述了消费者对象并与之建立了接口,然后我创建了一个类,其中维护了活动消费者的列表,...”)

模式的第二个好处是它们是常见问题形式的现成解决方案形式。如果您知道自己的模式,并且例如遇到一个问题,那么您需要找到一种很好的方法来将信息从(可能是多个)生产者对象获取到多个消费者对象,而又不会在类之间引入不必要的耦合,您将认识到“是观察员的工作!” 您将立即知道如何解决您的问题。

这些好处也确实彼此增强。它们使您可以快速解决某些常见的问题类别,然后在完成后就可以非常快速地传达解决问题的方式。

将此与“不存在”模式的世界进行对比。您遇到了这些问题之一,这些问题通常不是琐碎的设计问题,并且花费了大量时间来提出一个好的解决方案(顺便说一下,这很可能看起来很像适当的模式)。然后,您的同事出现,并且很想知道您如何解决该问题,并且花了一个小时讨论如何以及为什么。

所有这些都与警告有关,这似乎很明显:不要试图将问题变成不合适的模式。如果该模式不适合该问题,那么解决方案将最终陷入困境,并且您将失去模式所带来的减少工作量的好处。此外,由于您的工作将不再适合您的同事对模式含义的理解,因此您将失去沟通好处的成本。实际上,您可能会增加通信成本,超出无模式的成本,因为对模式的滥用会给您的同事对解决方案的错误理解,这比根本没有理解还差。


2
误以为设计模式是现成的解决方案。它们是“ PATTERNS”,并不总是转换为代码。
马丁·约克

嗯,模式总是会转换成代码,这几乎是给定的-问题是它们可能并不总是适合您拥有的代码,拥有的架构或您正在使用的约束。即仅仅是因为某种模式可能适合,并不一定意味着您可以使用它。一个人可能会假设这就是您的意思(但我不喜欢做假设)。
Murph

5

模式是关于思想和概念的重用,以及关于建立一个共同/一致的平台来交流它们的模式。

我们都同意(!),从理论上讲,代码重用是一件好事-但事实证明,重做比实际想做要难(在某些方面,这种情况正在发生变化,但这始终是一个挑战。 )。但是实际上,我们要重用的很多事情是一种处理方式,使用某种模板来构造特定问题的解决方案-这些就是模式。因此,您遇到这样的情况:您说解决问题X的好方法是使用模式Y,我们知道模式Y的元素是a,b和c,然后我们就开始了。因为模式已被广泛理解,所以您不必深入解释这是通信的好处。

模式的有趣之处在于,语言和框架正在不断发展,以为通用模式提供更好的支持,其最终结果是,我们获得了越来越多的代码重用(越来越多的乐高积木!),因为我们构建应用程序的方式(通过实现模式) )便于重用。


4

设计模式只是建立任何软件解决方案的基础。由于以下原因,它们很重要:

  1. 它们与语言无关。一旦知道适合给定问题/体系结构/任务的设计模式,就可以用任何多范式语言(例如C#,Java或Python)来实现它,在大多数情况下解决方案都是相同的,适应语法。这意味着您可以将自己的经验从一种语言编程转换为其他语言,只要您停留在同一问题域内(甚至跨域)即可。

  2. 尽管设计模式确实与编程范例绑定在一起,这意味着面向对象编程的设计模式(最著名的设计模式,也称为“四人帮”模式)。模式使您能够理解该范式最适合什么,并帮助您超越语法。例如,我已经看到了很多用C#和Java实现的方法,人们只是在Basic或Fortran中以编程的方式进行编程-他们有解决问题的完美命令,他们使用OOP来呈现此解决方案-无需继承,没有多态性,所有方法都是公开的等。设计模式可以帮助您了解这些概念,并了解它们在现实生活中的工作方式。同样适用于其他范例中的设计模式,例如函数式编程。

  3. 模式通常是表示思想的一种便捷方法,并且从体系结构进入计算机科学。一旦了解了某个“模式”背后的思想,就可以轻松地在其他问题中识别出该模式,并使用该模式来解决(可能稍作修改以更好地解决您的问题)。有很多不同的模式:在企业软件集成源代码测试等中。只需在计算机科学书籍中查找模式即可。

  4. 除了通过学习模式来获取良好实践之外,您还可以通过学习反模式轻松地学习如何避免代码中的愚蠢错误。有很多书籍以反模式的形式展现了不同领域中的常见错误,它们既有趣又具有教育意义。顺便说一下,我喜欢这些反模式的名字!


2

您可以将模式视为解决您和其他开发人员理解的问题的行之有效的方法。例如,问题在于创建数据的排序列表,然后您可以选择使用链接列表,或将数据放入向量中并进行排序。您可能会理解这两个选项,因为您可能已经知道链接列表模式或装入和排序向量模式。您可能知道每种方法的利弊,而无需查看实现以了解发生了什么。


1

我认为您是编程的入门者,不建议您及早学习设计模式。学习和理解设计模式需要基于软件开发的经验。您应该更多地练习编码,然后发现哪种编码风格不好,然后学习设计模式来改进设计。


1

设计模式的有用性取决于您选择的语言。您选择的语言越强大,就越不需要理解和实现设计模式。设计模式可能表明您的语言很烂,缺少内置功能。

Joe Gregorio 很好地谈论了Python中缺少设计模式的问题


感谢您提供有关Python中缺乏设计模式的链接。编辑:糟糕!该视频已从该位置删除!!:(
Saurabh Patil 2014年

0

设计模式是解决软件开发中常见问题的解决方案。对于某些问题,总会有不止一种解决方案,而设计模式可以通过为这些常见问题提供一套好的解决方案来帮助您确定哪种解决方案是最佳的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.