如何研究设计模式?

时间:2008-11-24 18:36:43

标签: design-patterns

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

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

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

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

22 个答案:

答案 0 :(得分:203)

我阅读了三本书,但在我阅读OReilly的Head First Design Patterns之前,我仍然不太了解模式。这本书让我大开眼界,真的很好地解释了。

alt text

答案 1 :(得分:195)

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

一个很棒的资源是Data & Object Factory页面。他们浏览模式,并为您提供概念和现实世界的例子。他们的参考资料也很棒。

答案 2 :(得分:85)

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

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

  1. 学习测试驱动开发(TDD)
  2. 了解重构
  3. 学习模式
  4. 大多数人忽略1,许多人认为他们可以做2,而且几乎所有人都会直接争取3。

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

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

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

答案 3 :(得分:59)

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

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

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

答案 4 :(得分:35)

练习,练习,练习。

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

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

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

它与编码完全相同; K& R可能是C语言的“圣经”,但是多次阅读它的封面只是没有给出一个实际经验;没有经验的替代品。

答案 5 :(得分:25)

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

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

答案 6 :(得分:14)

问自己这些问题:

他们做了什么?

他们分离/结合了什么?

什么时候应该使用它们?

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

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

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

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

答案 7 :(得分:8)

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

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

祝你好运

答案 8 :(得分:8)

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

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

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

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

答案 9 :(得分:5)

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

Design Patterns: Elements of Reusable Object-Oriented Software

答案 10 :(得分:5)

您是否已阅读Allan Shalloway撰写的“设计模式解释”。

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

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

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

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

答案 11 :(得分:5)

对于图书,我建议使用Design Patterns ExplainedHead First Design patterns。要真正了解这些模式,您应该查看现有代码。寻找您已经使用的模式。查看code smells以及可以解决这些问题的模式。

答案 12 :(得分:4)

我领导了一些设计模式讨论组(our site)并阅读了5或6本模式书。我建议从Head First Design Patterns一书入手,参加或开始讨论小组。 Head First的书最初可能看起来有点像Hasboro,但大多数人在阅读了一两章后都喜欢它。

使用优秀资源 - Joshua Kereivisky's A Learning Guide to Design Patterns进行模式排序并帮助您的讨论组。根据经验,我建议的一个改变是将战略放在首位。今天的大多数开发人员都经历过工厂的一些好的或坏的化身,所以从工厂开始会导致很多关于模式的对话和混淆。这往往会把注意力集中在如何学习和学习模式上。第一次见面。

答案 13 :(得分:3)

我推荐HeadFirst DesignPattern。在吸收了你需要的概念之后阅读这本书是不够的,找出你脑海中出现的很多问题的答案,并尝试找出可以使用这些模式的真实生活应用。我也在这样做,并开始提问,即使这些问题看起来很傻。

答案 14 :(得分:2)

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

设计模式没有任何魔力,任何优秀的程序员在任何书籍出版之前都会将其中的90%用于自己。在大多数情况下,我认为这些书籍在简单地定义各种模式的名称时最有用,因此我们可以更容易地讨论它们。

答案 15 :(得分:2)

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

故事的道德:编写大量代码。正如其他人所说,练习,练习,练习。我想在你理解为什么你当前的设计很糟糕并且寻找更好的方法之前,你不会很清楚在哪里应用各种设计模式。设计模式书应该为您提供一个精确的解决方案和一个通用术语,以便与其他开发人员讨论,而不是针对您不理解的问题的粘贴解决方案。

答案 16 :(得分:2)

阅读设计模式,练习编码它们的想法并不能真正帮助IMO。当您阅读这些书籍时1.寻找特定设计模式解决的基本问题,从Creational Patterns开始是您最好的选择。 2.我相信你已经编写过代码,分析你是否遇到了与设计模式旨在提供解决方案相同的问题。 3.尝试重新设计/重新设计代码或者重新开始。

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

  1. www.dofactory.com
  2. 设计模式:Erich Gamma,Richard Helm,Ralph Johnson和John M. Vlissides的可重用面向对象软件(Addison-Wesley专业计算系列)的元素
  3. Martin Fowler的企业应用程序架构模式
  4. 1是快速入门,2将深入研究.3将解释或者应该让您认为您在2中学到的东西适合企业软件。

    我的2美分......

答案 17 :(得分:2)

我不知道最好的书,但纯粹主义者可能会说Design Patterns: Elements of Reusable Object-Oriented Software

就我个人的喜爱而言,我喜欢O'Reilly出版的Head First Design Patterns。它用一种对话的声音写给我。当我阅读它时,我同时查看了我的源代码,看它是否适用于我正在阅读的内容。如果是的话,我重构了。这就是我学习责任链的方式。

实践 - 实践 - 实践。

答案 18 :(得分:2)

我的建议是实现其中一些并组合它们的一些实现的组合。例如,在.Net中,如果您查看数据适配器,可以使用适配器模式,如果有人对框架进行了一些挖掘,还可以使用其他一些适配器模式。

答案 19 :(得分:1)

我认为研究设计模式也很困难。您必须了解有关OOP的更多信息以及中型到大型应用程序开发的一些经验。对我来说,我作为一组开发人员进行研究以进行讨论。我们按照A Learning Guide To Design Patterns他们完成了模式研究。有C#和JavaScript开发人员加在一起。对我来说很奇怪的是,JavaScript中的C#开发人员编写代码和JavaScript开发人员对C#代码执行相同的操作。我离开会议后,我也在家里研究和阅读一些书籍进行审查。理解更多并记住我的更好方法是在这里使用C#和JavaScript中的示例进行博客http://tech.wowkhmer.com/category/Design-Patterns.aspx

我建议在去每个设计模式之前先了解一下模式的名称。此外,如果有人知道这个概念,请解释并举一个例子,不仅仅是编程,而是在阅读世界。

例如:

工厂方法:

阅读世界:我只需要花5美元,10美元或20美元就可以生产披萨而不知道它是如何生产的,我只需要根据钱投入获得小型,中型或大型披萨,这样我就可以吃或做随你。

编程:客户端只需将参数值$ 5,$ 10或$ 20传递给factory方法,它将返回Pizza对象。因此,客户端可以在不知道如何处理的情况下使用该对象。

我不确定这可以帮到你。这取决于人们加入会议的知识水平。

答案 20 :(得分:1)

我认为你需要检查一下你作为开发人员遇到的一些问题,在你因为另一次设计更改而不得不第10次修改你的代码之后你把头发拉了出来。你可能有一个项目清单,你觉得有很多返工和痛苦。

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

答案 21 :(得分:1)

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

本书将帮助您理解基本概念,除非您在现实世界中实施,否则您不能成为设计模式的主人