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

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

有没有关于设计模式的好书?必须掌握某种方法?

评论

学习设计模式的最好方法是通过做一个项目。当您在项目中看到模式时,您会知道何时使用它们,这是一篇文章,通过项目代码逐步讲授设计模式project.com/Articles/1009532/…
看看Antipatterns以及deviq.com/antipatterns

您可以从此处play.google.com/store/apps/…
了解
可能迟了,但仍可能会帮助某人。.尝试geeksforgeeks.org/software-design-patterns理解可以在何处使用的基本知识和方案。帮助我了解每种模式的基础和目的

另请参阅Pluralsight:pluralsight.com/courses/patterns-library

#1 楼

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

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

评论


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

–约瑟夫·弗里斯(Joseph Ferris)
08年11月24日在20:04

遗憾的是,该资源不再可用:(。

–user525192
2014年11月1日下午13:13

@NielsW上升,也许只是暂时下降。

– uthomas
2014年11月15日上午11:35

谢谢约瑟夫!这是您共享资源的更新链接:dofactory.com/net/design-patterns

–IT视频
9月22日12:33

这是更新的链接,以了解有关设计模式Trendydevx.com/…的更多信息。

– DSK
10月28日19:49

#2 楼

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



评论


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

–蒂姆·惠特科姆
08年11月24日在18:48

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

–比尔蜥蜴
08年11月24日在19:32

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

– sivabudh
09年4月15日在20:00

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

–负责人
2012年4月26日14:50

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

–mbx
17年7月21日在9:38

#3 楼

我对此类老问题的两分钱

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


学习测试驱动开发(TDD)
学习重构
学习模式

大多数人忽略1,许多人认为自己可以做到2,几乎每个人都直奔3。这可能会花费很长时间且痛苦又缓慢,但是首先编写测试无疑会让您对代码有很多思考。如果一个班级需要太多样板或容易中断,您会很快注意到难闻的气味

TDD的主要好处是您不必担心重构代码并迫使您编写高度独立的班级和凝聚力。如果没有一套好的测试,那么触摸没有损坏的东西就太痛苦了。有了安全网,您将真正冒险进行代码的大幅更改。那是您真正可以从实践中开始学习的时刻。在注意到我做了类似的事情之后,我才真正很好地理解了模式,或者可以将其应用于现有代码。没有安全测试或重构的习惯,我会等到一个新项目。在全新项目中使用模式的问题在于您看不到它们如何影响或更改工作代码。我只将代码重构为其中的一种软件模式,而从未在代码中引入新的软件模式。

评论


您能推荐一些有关TDD和重构的书籍吗(主要是C ++)

–anand
13年4月20日在3:57

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

–SystematicFrank
13年4月20日在9:37



#4 楼

Derek Banas为我非常喜欢的模式制作了youtube教程:

http://www.youtube.com/playlist?list=PLF206E906175C7E07

它们可能有点时间短,但他的时间安排和演讲使他们学习起来非常愉快。

#5 楼

练习,练习,练习。

你可以读到多年演奏大提琴的知识,但仍然无法屈服于乐器,无法制作听起来像音乐的东西。 >最好将设计模式视为一个高级问题;仅当您具有必要的经验才能认识到它们有用时,这一点才有意义。认识到它们是有用的,这是一个好习惯,但是除非您看到它们将适用或已经应用的情况,否则几乎不可能理解它们的真正价值。

它们何时会变得有用您在别人的代码中识别出设计模式,或者在设计阶段发现了一个非常适合模式的问题;然后检查正式模式,检查问题,确定它们之间的差值,以及对模式和问题的解释。 K&R可能是C的“圣经”,但是要从头到尾地反复阅读它并不能提供一种实践经验。经验无可替代。

评论


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

–stinky472
2011-3-31在2:47



#6 楼

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

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

#7 楼

问问自己以下问题:

它们是做什么的?

它们是如何解耦/耦合的? >
什么时候不应该使用它们?

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

使用它会给您带来哪些技术债务?
/>
是否有更简单的方法来完成工作?

评论


最后问问自己,从哪里获得上述所有问题的答案

–贾廷·杜特(Jatin Dhoot)
15年5月31日在15:39

@JatinDhoot通过思考..

–gtrak
15年10月19日在16:07

#8 楼

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

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

祝你好运

评论


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

–负责人
2012年4月26日下午14:58

#9 楼

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

误用它们。您不需要故意这样做,当您尝试将其应用到初始“设计模式”拟合中时就会发生。在这段时间内,您将看到的每个问题似乎都恰好适合一种设计模式。通常,由于某种原因,所有问题似乎都适合于相同的设计模式(Singelton是该设计模式的主要候选对象)。几个月后,您将需要更改代码中的某些内容,并发现使用该特定模式并不是那么明智,因为您将自己编码成一个角落,并且需要再次重构。

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

#10 楼

您是否已阅读Allan Shalloway的“ Design Patterns Explained”。问题空间可以轻松地映射到模式。

问题可以分解为两个部分:常见的事物和变化的事物。完成此操作后,我们会将常见的事物映射到接口,并将不同的事物映射到实现。本质上,许多模式都属于这种“模式”。 />
与其他模式书籍相比,我发现这本书极具启发性,而其他模式书籍对我来说与阅读电话簿一样令人兴奋。

#11 楼

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

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

评论


我不建议把这本书当成“大开眼界”的书:)

– Geo
08年11月24日在18:51

我会推荐它作为一本令人印象深刻的书。上床睡觉前的几页书和失眠已成为过去。

–Dónal
2010年5月11日上午8:16​​

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

– aimme
16-8-28在10:47



#12 楼

对于书籍,我建议您介绍“设计模式”和“优先设计”模式。要真正学习这些模式,您应该查看现有代码。查找您已经在使用什么模式。查看代码气味以及哪些模式可以解决它们。

#13 楼

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

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

#14 楼

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

#15 楼

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

#16 楼

我不了解最好的书,但纯粹主义者可能会说“设计模式:可重用的面向对象软件的元素”

就我个人而言,我喜欢O'Reilly出版的Head First Design Patterns 。它以对话的声音吸引了我。阅读时,我同时查看了源代码,以了解它是否适​​用于我所阅读的内容。如果可以,我进行了重构。这就是我学习责任链的方法。

练习-练习-练习。

#17 楼

设计模式只是工具-类似于库函数。如果您知道它们的存在以及它们的近似功能,则可以在需要时将它们从一本书中挖掘出来。在任何书问世之前都是自己的。在大多数情况下,我认为这些书对于简单地定义各种模式的名称最为有用,因此我们可以更轻松地进行讨论。

#18 楼

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

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

#19 楼

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

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


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

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

我的2美分...

#20 楼

我认为研究设计模式也很困难。您必须了解有关OOP的更多信息,以及有关中型到大型应用程序开发的一些经验。对我来说,我作为一组开发人员进行研究以进行讨论。我们遵循《设计模式学习指南》,他们已经完成了模式研究。有C#和JavaScript开发人员联合在一起。对我来说,花哨的是C#开发人员使用JavaScript编写代码,而JavaScript开发人员对C#代码执行相同的操作。离开会议后,我还会在家研究和阅读几本书以进行审查。更好地理解和记住的更好方法是在http://tech.wowkhmer.com/category/Design-Patterns.aspx中使用C#和JavaScript的示例进行博客撰写。我建议在进入每种设计模式之前先了解一下模式的名称。另外,如果有人知道这个概念,请仅解释并举一个例子,不仅限于编程,还包括阅读领域。例如,

工厂方法:

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

编程:客户端只需将参数值$ 5,$ 10或$ 20传递给工厂方法,它将返回Pizza对象。因此客户端可以在不知道对象如何处理的情况下使用该对象。我不确定这是否可以帮助您。这取决于参加会议的人员的知识水平。

评论


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

–庞
17年4月27日在6:58

#21 楼

我认为您需要检查您作为开发人员遇到的一些问题,由于又一次设计更改,您不得不第十次修改代码后才拔掉头发。您可能有一个项目列表,觉得有很多返工和痛苦。曾经有一段时间您需要对不同的数据集执行相同的一系列操作吗?您是否需要能够为应用程序提供将来的功能,但又希望避免为现有类重新编写所有逻辑?从这些场景开始,然后返回到模式目录及其应解决的各自问题。您可能会发现GoF与您的项目库之间存在一些匹配。

#22 楼

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

书将帮助您理解基本概念,除非直到在现实世界中实现后,您才能成为设计模式的大师