如何学习设计模式?[关闭]


352

我已经阅读了约4-5本书有关设计模式的书籍,但是我仍然不觉得自己已经接近设计模式的中级水平了吗?

我应该如何学习设计模式?

有没有关于设计模式的好书?

我知道这只能凭经验来完成,但是必须有某种方法来掌握这些吗?


6
学习设计模式的最好方法是通过做一个项目。当您在项目中看到模式时,您会知道何时使用它们,这是一篇通过项目代码
Shivprasad Koirala


从这里你可以了解它,play.google.com/store/apps/...
Keyur Thumar

可能迟了,但仍可能会帮助某人。.尝试geeksforgeeks.org/software-design-patterns理解可以在何处使用的基本知识和场景。帮助我了解每种模式的基础和目的
zeetit

另请参见,Pluralsight:pluralsight.com/courses/patterns-library
ssmith,

Answers:


206

最好的方法是开始使用它们进行编码。设计模式是一个很棒的概念,仅阅读它们就很难应用。在网上找到一些示例实现并围绕它们进行构建。

数据和对象工厂页面是一个很好的资源。它们介绍了这些模式,并为您提供了概念性和现实性的示例。他们的参考资料也很棒。


11
究竟!我一直很高兴软件属于“计算机科学”范畴。我可以看到有关硬件的争论,但是软件构成了非常不精确的科学!
约瑟夫·费里斯

可悲的是这种资源不再可用:(。

5
@NielsW上升,也许只是暂时下降。
uthomas 2014年

211

我读了三本书,但在阅读OReilly的Head First Design Patterns之前,仍然不太了解模式。这本书使我大开眼界,而且讲得很好。

替代文字


14
一开始阅读一本看起来像这样的“严肃”书有点奇怪,但是当我不断阅读时,我注意到我实际上是在理解改变的概念。绝对值得一读。
蒂姆·惠特科姆

18
我绝对认为这是学习设计模式的最佳书。在您对GoF有了更好的了解之后,应该将其用作参考。
比尔蜥蜴

您提到您读过三本书。.您也读过这本书吗?amazon.com/…如果是,您怎么看?
sivabudh

11
2006年,我在法国南特的一次会议上认识了Erich Gamma(GoF之一),他说这本书的销量超过了GoF :)
Fuhrmanator 2012年

1
看完本书,OO变得有意义。@SimpleFellow GoF书很乏味。没有设计模式的先验知识,它会让您立即入睡。但是,它是一本不错参考书,应与EAA的DDD和P一起成为任何专业人士图书馆的一部分。
mbx

93

我的两分钱就这么老的问题

有人已经提到过,练习和重构。我相信学习模式的正确顺序是这样的:

  1. 学习测试驱动开发(TDD)
  2. 学习重构
  3. 学习模式

大多数人忽略1,许多人相信自己可以做到2,几乎每个人都直言不讳地提出3。

对我来说,提高软件技能的关键是学习TDD。这可能会花费很长时间且痛苦又缓慢,但是首先编写测试无疑会让您对代码有所考虑。如果一个班级需要太多样板或容易中断,您会很快注意到难闻的气味

TDD的主要好处是您不必担心重构代码,而迫使您编写高度独立且具有凝聚力的类。如果没有一套好的测试,那么触摸没有损坏的东西就太痛苦了。有了安全网,您将真正冒险进行代码的大幅更改。那是您可以真正开始从实践中学习的时刻。

现在到了必须阅读有关模式的书的地步,我认为,这完全是在浪费时间来进行过多的尝试。在注意到我做了类似的事情之后,我才真正很好地理解了模式,或者可以将其应用于现有代码。没有安全测试或重构的习惯,我会等到一个新项目。在全新项目中使用模式的问题是您看不到它们如何影响或更改工作代码。我只在将代码重构为其中一种后才了解一种软件模式,而从来没有在代码中引入新的软件模式。


您能推荐一些主要用于C ++的TDD和重构书籍
吗?anand

2
如果您使用C ++,则在查找高质量内容时会遇到很多问题。此外,C ++并不是您想学习测试的语言,因为从技术上讲,C ++缺乏反思,仅凭这一点就很难构建好的测试工具。它仍然是可行的,但是在C ++中,TDD的社区,论坛,讨论和人数很少。我已经做了很多工作,但是尽管它有很多优点,但它不是一种测试友好的语言。
SystematicFrank


35

练习,练习,练习。

您可以读到多年演奏大提琴的知识,但仍然无法向乐器鞠躬,也无法制作听起来像音乐的东西。

设计模式最好是公认的高级问题。仅当您具有必要的经验才能认识到它们有用时,这一点才有意义。认识到它们是有用的,这是件好事,但是除非您看到它们将适用或已经应用的情况,否则几乎不可能理解它们的真正价值。

当您识别他人代码中的设计模式,或在设计阶段发现与模式非常合适的问题时,它们就会变得有用。然后检查正式模式,检查问题,确定它们之间的差异,以及对模式和问题的解释。

确实与编码相同;K&R可能是C的“圣经”,但是要从头到尾地反复阅读它并不能提供一种实践经验。经验无可替代。


5
+1。我认为许多新手很快就会进入设计模式,并开始设计围绕抽象工厂,单例对象,观察者,访客等构建的系统,而这些都是直接来自本书。结果往往是费力的,没有充分利用该语言,甚至从基本的耦合/内聚的角度来看也没有很好的设计(当设计模式实施不佳时,后者尤其会遭受苦难)。需要经验来确定适合的设计模式,甚至还要决定如何以特定的语言最合适地实现它们。
stinky472

25

练习练习。我认为4到5本书甚至是过多的阅读练习,没有一定的练习量。我相信,做到这一点的最佳方法是开始使用这些模式来重构您当前的项目。或者,如果您没有正在从事的项目,则可以按照自己的方式做,然后尝试将其重构为模式

如果您没有经历过他们解决的问题,就无法完全欣赏它们。并且请记住,它们不是灵丹妙药-您不需要记住它们,也很难立即应用它们。我的两分钱


15

问自己以下问题:

他们在做什么?

他们会解耦/耦合什么?

什么时候应该使用它们?

什么时候不应该使用它们?

缺少哪些语言功能会使其消失?

使用它会招致什么技术债务?

有没有更简单的方法来完成工作?


14
最后问问自己,从哪里可以得到上述所有问题的答案
Jatin Dhoot 2015年

@JatinDhoot通过思考..
gtrak 2015年

8

我发现很难理解或理解某些模式的好处,直到一个人理解了它们所解决的问题以及另一种(更糟糕的)问题的解决方式。

除了GOF和POSA书籍以外,我还没有真正阅读过书籍,因此无法给您其他建议。确实,您只需要了解问题域,我认为许多经验不足的开发人员可能无法欣赏模式的好处。这对他们来说是微不足道的。当人们不得不首先与较差的选择抗争时,拥抱,理解和欣赏好的解决方案就容易得多。

祝好运


+1了解他们打算解决的问题。面临的挑战是亲眼目睹问题(在具有个人重要性的真实项目中)。书中太多示例问题已被简化。我喜欢《 Head First Design Patterns》一书的原因之一是,它们显示了天真的解决方案所存在的一些问题,以及这些解决方案的不稳定性。然后,他们展示出图案及其清洁程度。例如,请查看该书中的Decorator。
Fuhrmanator 2012年

8

给出了很多很好的例子。我想添加一个:

误用它们。您不需要故意这样做,当您尝试将其应用到最初的“设计模式”拟合中时就会发生。在这段时间内,您将看到的每个问题似乎都恰好适合一种设计模式。通常,由于某种原因,所有问题似乎都适合于相同的设计模式(Singelton是最主要的选择)。

然后您将应用该模式,它将很好。几个月后,您将需要更改代码中的某些内容,并发现使用该特定模式并不是那么聪明,因为您将自己编码成一个角落,并且需要再次进行重构。

当然,这并不是一个可以在21天内学习的答案,但是以我的经验,它最有可能使您对该问题有深刻的了解。


7

您是否阅读过Allan Shalloway撰写的“ Design Patterns Explained”。

本书与其他设计模式书非常不同,因为它不是模式的目录,而是主要提出了一种分解问题空间的方法,该问题空间可轻松映射到模式。

问题可以分解为两个部分:常见的事物和变化的事物。完成此操作后,我们会将常见的事物映射到接口,并将不同的事物映射到实现。本质上,许多模式都属于该“模式”。

例如,在策略模式中,共同的事物表示为策略的上下文,可变部分表示为具体策略。

与其他样式书相比,我发现这本书极具启发性,而其他样式书对我来说与阅读电话簿一样令人兴奋。


6

您是否尝试过《四人帮》书?

设计模式:可重用的面向对象软件的元素


7
我不会推荐这本书作为“大开眼界”的书:)
地球

73
我会推荐它作为一本令人印象深刻的书。就寝前几页的书和您的失眠将成为过去。
多纳尔

2
我在阅读本书的第二天中午睡着后来到这里。搜索“了解设计模式”。找到了帖子。找到了上面的评论。让我开心。同意他人,这是令人
大跌眼镜的


4

我领导了一些设计模式讨论小组(我们的网站),并且阅读了5到6种模式书籍。我建议从《 Head First设计模式》一书开始,然后参加或开始一个讨论小组。《 Head First》一开始可能看起来有点像Hasboro,但是大多数人在阅读一两章后都喜欢它。

使用出色的资源-Joshua Kereivisky的“设计模式学习指南”进行模式排序并帮助您的讨论组。根据经验,我建议对订购进行的一项更改是将策略放在首位。当今大多数开发人员都经历过某种关于工厂的好坏的经历,因此从工厂开始可能会引起很多关于模式的对话和困惑,这往往会导致人们专注于学习和学习模式的知识,这在当时非常重要首次见面。


3

我推荐HeadFirst DesignPattern。仅仅阅读本书还不够,在吸收了概念之后,您需要找出脑海中出现的许多问题的答案,并尝试找出可以在其中使用这些模式的实际应用程序。我也一样,开始问问题,即使那些问题看起来很愚蠢。


2

我的建议是将其中一些实施起来并分析它们的一些实现。例如,在.Net中,如果您查看数据适配器,就会有适配器模式的使用,如果稍微深入研究一下框架,还会有其他几种模式。



2

设计模式只是工具-类似于库函数。如果您知道它们在那里以及它们的近似功能,则可以在需要时将它们从书中挖出来。

设计模式没有什么神奇的,任何优秀的程序员在任何书籍问世之前,都会自己弄清楚其中的90%。在大多数情况下,我认为这些书在简单地定义各种模式的名称方面最有用,因此我们可以更轻松地讨论它们。


2

我学习设计模式的方法是编写许多非常糟糕的软件。我12岁那年,我不知道是好是坏。我只是写了很多意大利面条代码。在接下来的十年左右的时间里,我从错误中吸取了教训。我发现了行得通的东西,没有行事的。我独立地发明了大多数常见的设计模式,所以当我第一次听到什么是设计模式时,我很兴奋地了解到它们,然后非常失望,因为这只是我已经凭直觉知道的东西的名称的集合。(有关十年内自学C ++的笑话实际上不是笑话)

故事的寓意:编写大量代码。正如其他人所说的,练习,练习,练习。我认为,除非您了解您当前的设计为什么不好,并寻求一种更好的方法,否则您将不知道在何处应用各种设计模式。设计模式书应该为您提供完善的解决方案和与其他开发人员讨论的通用术语,而不是针对您不了解的问题的粘贴解决方案。


2

读取设计模式,对它们进行编码的想法并不能真正帮助IMO。阅读这些书时1.寻找特定设计模式可以解决的基本问题,从创建模式开始是您的最佳选择。2.我确信您过去已经编写了代码,分析您是否遇到了设计模式旨在提供解决方案的相同问题。3.尝试重新设计/重构代码,或者重新开始。

关于资源,您可以检查这些

  1. www.dofactory.com
  2. 设计模式:Erich Gamma,Richard Helm,Ralph Johnson和John M. Vlissides的可重用的面向对象软件的元素(Addison-Wesley专业计算系列)
  3. Martin Fowler的企业应用程序架构模式

1是快速入门,2将进行深入研究。.3将解释或应使您认为您在2中学到的东西适合企业软件。

我的2分钱


1

我认为研究设计模式也很困难。您必须了解有关OOP的更多信息以及中型到大型应用程序开发的一些经验。对我来说,我作为一组开发人员进行研究以进行讨论。我们遵循了《设计模式学习指南》,他们已经完成了模式研究。有C#和JavaScript开发人员联合在一起。对我来说,花哨的是C#开发人员使用JavaScript编写代码,而JavaScript开发人员对C#代码执行相同的操作。离开会议后,我还会在家研究和阅读几本书以进行审查。更好地理解和记忆的更好方法是在http://tech.wowkhmer.com/category/Design-Patterns.aspx中使用C#和JavaScript的示例进行博客撰写。

我建议在进入每种设计模式之前先了解模式的名称。另外,如果有人知道这个概念,请仅解释并举一个例子,不仅限于编程,还包括阅读领域。

例如:

工厂方法:

阅读世界:我只给$ 5,$ 10或$ 20的钱,它就会在不知道如何生产披萨的情况下把披萨送回去,我只是依靠投入的钱得到一个小,中或大的披萨,这样我就可以吃东西或做任何事情。

编程:客户端只需将参数值$ 5,$ 10或$ 20传递给工厂方法,它将返回Pizza对象。因此,客户端可以使用该对象而无需了解其处理方式。

我不确定这是否可以帮助您。这取决于参加会议的人员的知识水平。


答案中的第二个链接已死。

1

我认为您需要研究一下您作为开发人员遇到的一些问题,由于又一次设计更改,您不得不第十次修改代码后才拔掉头发。您可能有一个项目列表,您觉得那里有很多返工和痛苦。

从该列表中,您可以得出设计模式要解决的方案。曾经有一段时间您需要对不同的数据集执行相同的一系列操作吗?您是否需要能够为应用程序提供将来的功能,但又希望避免为现有类重新编写所有逻辑?从这些场景开始,然后返回到模式目录及其应解决的各自问题。您可能会发现GoF与您的项目库之间存在一些匹配。


1

对于初学者,一旦我们熟悉所有模式,就可以采用Head First Design模式,然后尝试将实时对象可视化为这些模式。

本书将帮助您理解基本概念,除非您在现实世界中得以实施,否则无法成为设计模式的大师

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.