如何研究设计模式?

ana*_*and 352 design-patterns

我已经阅读了大约4-5本关于设计模式的书籍,但我仍然觉得我在设计模式方面没有接近中级水平?

我该如何去研究设计模式?

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

我知道这只会有经验,但必须有一些方法来掌握这些?

Dar*_*n C 207

在阅读OReilly的Head First Design Patterns之前,我读了三本书并且仍然不太了解模式.这本书睁开眼睛,真的很好解释.

替代文字

  • 我绝对认为这是了解设计模式的最佳书籍.在您更好地理解GoF书之后,应将其用作参考书. (16认同)
  • 一开始阅读一本看起来像这本书的"严肃"的书有点奇怪,但是当我继续阅读时,我注意到我实际上是在理解改变的概念.绝对值得一读. (11认同)
  • 我在2006年在法国南特举行的一次会议上遇到了Erich Gamma(GoF之一),他说这本书超过了GoF书籍:) (10认同)
  • 对.我确认Head First非常出色 (2认同)
  • 读完这本书,OO 就明白了。@SimpleFellow GoF 的书很乏味。如果事先不了解设计模式,它会让您立即入睡。然而,它是一本很好的(*the*)参考书,应该与 EAA 的 DDD 和 P 一起成为任何专业人士图书馆的一部分。 (2认同)

Jos*_*ris 203

最好的方法是开始使用它们进行编码.设计模式是一个伟大的概念,仅仅通过阅读它们很难应用.采取一些在线发现并围绕它们构建的示例实现.

一个很好的资源是数据和对象工厂页面.他们浏览模式,并为您提供概念和现实世界的例子.他们的参考资料也很棒.

  • 究竟!我一直觉得软件属于"计算机科学".我可以看到硬件的论点,但软件是一个非常不精确的科学! (11认同)
  • @NielsW它起来了,也许它只是暂时的下降. (5认同)

Sys*_*ank 89

对于这样一个老问题我的两分钱

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

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

大多数人忽略1,许多人认为他们可以做2,而且几乎所有人都会直截了当3.

对我来说,提高我的软件技能的关键是学习TDD.这可能是一段长时间的痛苦和缓慢的编码,但首先编写测试肯定​​会让你对代码有很多想法.如果一个课程需要太多的样板或容易打破,你会开始注意到难闻的气味

TDD的主要好处是您不必担心重构代码并迫使您编写高度独立且具有凝聚力的类.没有一套好的测试,触摸没有破坏的东西真是太痛苦了.使用安全网,您将真正冒险进入代码的重大变化.那是你真正开始从实践中学习的那一刻.

现在,您必须阅读有关模式的书籍,而且我认为,完全浪费时间去努力.在注意到我做了类似的事情后,我才真正理解模式,或者我可以将其应用于现有代码.如果没有安全测试或重构习惯,我会等到新项目.在新项目中使用模式的问题在于,您无法看到它们如何影响或更改工作代码.一旦我将代码重构为其中一个代码,我才理解软件模式,从来没有在我的代码中引入一个新代码.

  • 在另一个背景下谈论TDD的重要性+1.我应该开始在我所有的活动项目中应用它. (3认同)
  • 如果缩小到C++,您将在查找高质量内容时遇到很多问题.此外,C++不是您想要学习测试的语言,因为从技术上讲,它缺乏反射,仅此一点很难构建好的测试工具.它仍然可行,但由于这一点,社区,论坛,讨论和TDD人数在C++中是少数.我已经做了很多工作,但尽管它有其优点,但它并不是一种考试友好的语言. (2认同)

小智 59

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

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

它们可能有点短,但他的时间和表现使他们非常乐于学习.


Pau*_*ier 35

实践,实践,实践.

你可以阅读有关多年来演奏大提琴的内容,但仍然无法用弓来演奏和制作听起来像音乐的东西.

设计模式最好被认为是一个高级别的问题; 只有在您具备将其识别为有用所必需的经验时才有意义的.你认识到它们是有用的很好,但除非你已经看到它们适用或应用的情况,否则几乎不可能理解它们的真正价值.

它们变得有用的地方在于您在其他人的代码中识别设计模式,或者在设计阶段识别出与模式非常吻合的问题; 然后检查正式模式,检查问题,确定它们之间的差异,以及关于模式和问题的说法.

它与编码真的一样; K&R可能是C语言的"圣经",但是多次阅读它的封面并不能提供一种实践经验; 没有经验的替代品.

  • +1.我认为很多新手都过早地跳入设计模式,并开始围绕抽象工厂,单身人士,观察员,访客等设计系统.结果往往是笨拙的,没有充分利用语言,甚至没有从基本的耦合/凝聚力角度精心设计(后者尤其在设计模式实施不当时受到影响).需要经验来确定设计模式的适用位置,甚至更多地决定如何以特定语言最恰当地实现它们. (5认同)

utk*_*tas 25

实践练习.我认为4到5本书甚至是一个过度的阅读练习,没有一些练习.我相信,实现这一目标的最佳方法是使用模式重新开始重构当前项目.或者,如果您没有任何正在进行的项目,那么只需按照自己的方式进行,然后尝试重构模式.

如果你没有遇到他们解决的问题,你就无法完全欣赏他们.请记住,它们不是银子弹 - 你不需要记住它们并且很难在飞行中使用它们.我的两分钱..


gtr*_*rak 15

问自己这些问题:

他们在做什么?

它们分离/耦合的是什么?

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

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

什么遗漏语言功能会让它们消失?

使用它会产生什么技术债务?

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

  • 最后问问自己从哪里可以得到上述所有问题的答案 (14认同)

Tim*_*Tim 8

我发现在理解他们解决的问题以及其他(更糟)的问题实施方式之前,理解或理解某些模式的好处有点困难.

除了GOF和POSA书籍之外我还没读过任何书籍,所以我不能给你其他建议.真的,你只需要了解问题领域,我认为许多经验不足的开发人员可能无法理解模式的好处.这对他们来说并不轻微.当人们不得不首先与糟糕的替代方案作斗争时,拥抱,理解和欣赏良好的解决方案要容易得多.

祝好运


Joa*_*uer 8

已经给出了很多很好的例子.我想补充一个:

误用他们.您不需要故意这样做,当您尝试在初始的Design-Pattern-fit中应用它们时会发生这种情况.在此期间,您将看到的每个问题似乎都恰好符合一种设计模式.由于某种原因,这些问题似乎都符合相同的设计模式(Singelton是其主要候选者).

而你将应用这种模式,它会很好.几个月之后,您将需要更改代码中的某些内容并查看使用该特定模式并不那么聪明,因为您将自己编码为一个角落,并且需要再次重构.

当然,这并不是一个21天的答案,但根据我的经验,它最有可能让你对这件事情有所了解.


Roh*_*hit 6

你有没有尝试过Gang of Four书?

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

  • 我会推荐它作为一本闭眼的书.睡前几页这本书以及失眠将成为过去. (71认同)
  • 我不推荐这本书作为"令人大开眼界"的书:) (7认同)
  • 我读完这本书的时候在中午睡觉的时候来到了这里.寻找'理解设计模式'.发现了这个帖子.发现上面的评论.让我的一天.同意其他人,这是一本令人闭眼的书 (2认同)

Phi*_*gan 6

您是否阅读过Allan Shalloway撰写的"设计模式解释".

本书与其他设计模式书非常不同,因为它不是一个模式目录,而是主要提供一种分解容易映射到模式的问题空间的方法.

问题可以分解为两部分:常见的东西和变化的东西.完成此操作后,我们将常见事物映射到接口,以及与实现不同的内容.从本质上讲,许多模式属于这种"模式".

例如,在战略模式中,常见事物表示为策略的上下文,可变部分表示为具体策略.

我发现这本书非常引人注目,与其他模式书相比,对我来说,与阅读电话簿有着同样程度的兴奋.


Dav*_*hme 5

对于书籍,我会推荐Design Patterns ExplainedHead First Design模式.要真正了解这些模式,您应该查看现有代码.寻找您已经使用的模式.看看代码气味以及可以解决它们的模式.


JB *_*own 5

我领导了一些设计模式讨论组(我们的网站)并阅读了 5 或 6 本书。我建议从 Head First Design Patterns 这本书开始,然后参加或发起一个讨论组。Head First 的书一开始可能看起来有点儿孩之宝,但大多数人在阅读一两章后都会喜欢它。

使用优秀资源 - Joshua Kereivisky 的 A Learning Guide to Design Patterns进行模式排序并帮助您的讨论组。根据经验,我建议对排序进行的一项更改是将 Strategy 放在首位。今天的大多数开发人员都经历过工厂化身的好坏,所以从工厂开始可能会导致很多关于模式的对话和混乱。第一次会议。