如何学习设计模式? [关闭]
Posted
技术标签:
【中文标题】如何学习设计模式? [关闭]【英文标题】:How to study design patterns? [closed] 【发布时间】:2010-09-23 19:41:48 【问题描述】:我已经阅读了大约 4 到 5 本关于设计模式的书籍,但我仍然觉得我在设计模式方面还没有接近中级水平?
我应该如何学习设计模式?
有没有什么设计模式的好书?
我知道只有经验才能做到这一点,但一定有办法掌握这些吗?
【问题讨论】:
学习设计模式的最好方法是做一个项目。当您在项目中看到模式时,您就会知道何时使用它们,这里有一篇文章通过项目codeproject.com/Articles/1009532/… 逐步教授设计模式 看看反模式以及deviq.com/antipatterns 你可以从这里学习,play.google.com/store/apps/… 可能晚了,但仍然可能对某人有所帮助.. 尝试geeksforgeeks.org/software-design-patterns 以了解解释它们可以在何处使用的基础知识和场景。帮助我了解每种模式的基础和目的 另见,Pluralsight:pluralsight.com/courses/patterns-library 【参考方案1】:我读了三本书,但直到我读了 OReilly 的 Head First Design Patterns 之前,我仍然不太了解模式。这本书让我大开眼界,解释得很好。
【讨论】:
一开始阅读一本看起来像那样“严肃”的书有点奇怪,但当我继续阅读时,我注意到我实际上是在理解改变的概念。绝对值得一读。 我绝对认为这是学习设计模式的最佳书籍。在您更好地理解 GoF 书之后,应将其用作参考。 2006 年,我在法国南特的一次会议上遇到了 Erich Gamma(GoF 成员之一),他说这本书的销量超过了 GoF 书籍 :) 读完这本书,OO 说得通了。 @SimpleFellow GoF 的书很枯燥。如果没有关于设计模式的先验知识,它会让您立即入睡。然而,它是一本很好的(the)参考书,应该与 DDD 和 EAA 的 P 一起成为任何专业图书馆的一部分。 我不喜欢这本书,因为它没有达到一个点,并且可能会与所有试图变得用户友好的非严肃底色混淆......在我看来这已经过分了完成并产生相反的效果。寻找其他来源。【参考方案2】:最好的方法是开始使用它们进行编码。设计模式是一个伟大的概念,仅仅阅读它们就很难应用。获取一些您在网上找到的示例实现并围绕它们进行构建。
Data & Object Factory 页面是一个很好的资源。他们回顾了模式,并为您提供了概念和现实世界的示例。他们的参考资料也很棒。
【讨论】:
New Link, same resource【参考方案3】:对于这样的老问题,我的两分钱
已经有人提到,实践和重构。我相信学习模式的正确顺序是这样的:
-
学习测试驱动开发 (TDD)
学习重构
学习模式
大多数人忽略 1,许多人认为他们可以做到 2,几乎每个人都直接选择 3。
对我来说,提高软件技能的关键是学习 TDD。这可能是一段痛苦而缓慢的编码时间,但首先编写测试肯定会让您对代码进行很多思考。如果课程需要太多样板或容易中断,您很快就会注意到难闻的气味
TDD 的主要好处是您不再担心重构代码,并迫使您编写高度独立和内聚的类。如果没有一套好的测试,触摸没有损坏的东西实在是太痛苦了。使用安全网,您将真正冒险对代码进行重大更改。那是你真正开始从实践中学习的时刻。
现在到了你必须阅读有关模式的书籍的时候了,在我看来,过于努力完全是浪费时间。在注意到我做了类似的事情之后,我才真正很好地理解了模式,或者我可以将其应用于现有代码。如果没有安全测试或重构习惯,我会等到一个新项目。在新项目中使用模式的问题是您看不到它们如何影响或更改工作代码。只有在我将代码重构为其中一种时,我才理解一种软件模式,而当我在代码中引入新的一种时,我才理解。
【讨论】:
你能推荐一些关于TDD和主要用C++重构的书 如果你把范围缩小到 C++,你会在寻找高质量的内容时遇到很多问题。此外,C++ 不是您想学习测试的语言,因为从技术上讲,它缺乏反射,仅此一项就很难构建好的测试工具。它仍然是可行的,但正因为如此,社区、论坛、讨论和 TDD 人的数量在 C++ 中是少数。我已经用它做了很多工作,但尽管它很强大,但它并不是一种测试友好的语言。【参考方案4】:Derek Banas 制作了 youtube 教程,用于设计我非常喜欢的模式:
http://www.youtube.com/playlist?list=PLF206E906175C7E07
他们的时间可能有点短,但他的时间安排和演示让他们学习起来非常愉快。
【讨论】:
【参考方案5】:练习,练习,练习。
您可以阅读关于演奏大提琴多年的文章,但仍然无法为乐器拉弓并制作任何听起来像音乐的东西。
设计模式最好被认为是一个高级问题;只有当你有必要的经验来识别它们是有用的时,它才是相关的。认识到它们很有用是件好事,但除非你见过它们会应用或已经应用的情况,否则几乎不可能理解它们的真正价值。
当您在其他人的代码中识别设计模式,或者在设计阶段识别出与模式非常吻合的问题时,它们会变得有用;然后检查正式模式,检查问题,确定它们之间的差异,以及关于模式和问题的说明。
真的和编码一样; K&R 可能是 C 语言的“圣经”,但从头到尾多次阅读并不能提供一种实践经验;经验是无可替代的。
【讨论】:
+1。我认为很多新手很快就跳入了设计模式,并直接从书中开始设计围绕抽象工厂、单例、观察者、访问者等构建的系统。结果通常是笨拙的,没有充分利用语言,甚至从基本的耦合/内聚的角度来看也没有精心设计(当设计模式实施不佳时,后者尤其受到影响)。需要经验来决定设计模式在哪里合适,甚至更需要经验来决定如何以一种特定的语言最恰当地实现它们。【参考方案6】:练习练习练习。如果没有大量的练习,我认为 4 到 5 本书甚至是一种过度的阅读练习。我认为,最好的方法是使用这些模式开始重构您当前的项目。或者,如果您没有任何正在积极从事的项目,那么按照自己的方式进行,然后尝试重构为模式。
如果您没有经历过他们解决的问题,您将无法完全欣赏他们。请记住,它们不是灵丹妙药——你不需要记住它们,也不需要努力去申请。我的两分钱..
【讨论】:
【参考方案7】:问自己这些问题:
他们是做什么的?
它们解耦/耦合什么?
你应该什么时候使用它们?
什么时候不应该使用它们?
缺少哪些语言功能会使它们消失?
使用它会招致什么技术债务?
有没有更简单的方法来完成这项工作?
【讨论】:
最后问问自己从哪里得到上述所有问题的答案 @JatinDhoot 通过思考..【参考方案8】:我发现要理解或理解某些模式的好处有点困难,直到人们了解它们解决的问题以及解决问题的其他(更糟糕的)方式。
除了 GOF 和 POSA 书籍之外,我还没有真正阅读过任何书籍,因此无法给您其他建议。实际上,您只需要了解问题域,我认为许多经验不足的开发人员可能无法欣赏模式的好处。这对他们来说不是轻视。当一个人必须首先与糟糕的替代方案作斗争时,接受、理解和欣赏好的解决方案要容易得多。
祝你好运
【讨论】:
+1 以了解他们打算解决的问题。挑战在于亲眼看到问题(在具有个人重要性的真实项目中)。书中太多的示例问题被(过度)简化了。我喜欢《Head First Design Patterns》一书的原因之一是,它们展示了幼稚解决方案的一些问题,以及这些解决方案是多么站不住脚。然后他们展示了图案以及它的干净程度……例如,看看那本书中的装饰器。【参考方案9】:已经给出了很多很好的例子。我想加一个:
误用它们。您不需要故意这样做,当您尝试将它们应用到您的初始设计模式拟合中时就会发生这种情况。在此期间,您将看到的每一个问题似乎都恰好适合一种设计模式。通常,出于某种原因,这些问题似乎都符合相同的设计模式(Singelton 是该设计模式的主要候选者)。
你会应用这个模式,它会很好。几个月后,您将需要更改代码中的某些内容,并发现使用该特定模式并不那么聪明,因为您将自己编码到了一个角落,您需要再次重构。
诚然,这并不是一个真正做到 21 天就能学会的答案,但根据我的经验,它最有可能让你深入了解这个问题。
【讨论】:
【参考方案10】:你读过 Allan Shalloway 的“设计模式解释”吗?
这本书与其他设计模式书籍非常不同,因为它不是模式目录,而是主要介绍了一种分解问题空间的方法,可以轻松映射到模式。
问题可以分为两部分:常见的事物和不同的事物。完成此操作后,我们将常见的事物映射到接口,并将变化的事物映射到实现。本质上,很多模式都属于这种“模式”。
例如在策略模式中,共同的事物被表达为策略的上下文,可变的部分被表达为具体的策略。
与其他模式书相比,我发现这本书非常发人深省,对我来说,这些书对我来说就像阅读电话簿一样兴奋。
【讨论】:
【参考方案11】:你试过《四人帮》这本书吗?
Design Patterns: Elements of Reusable Object-Oriented Software
【讨论】:
我不会推荐这本书作为一本“大开眼界”的书 :) 我会推荐它作为一本闭眼的书。睡前读几页这本书,你的失眠就会成为过去。 在我读这本书时在中午睡着了之后来到这里。搜索“理解设计模式”。找到了帖子。找到了上面的评论。成就了我的一天。同意别人,这是一本闭眼的书【参考方案12】:对于书籍,我推荐Design Patterns Explained 和Head First Design patterns。要真正学习这些模式,您应该查看现有代码。寻找您已经在使用的模式。查看code smells 以及哪些模式可以解决它们。
【讨论】:
【参考方案13】:我领导了几个设计模式讨论组 (our site) 并阅读了 5 或 6 本模式书籍。我建议从 Head First Design Patterns 这本书开始,然后参加或开始一个讨论组。 Head First 这本书一开始可能看起来有点像孩之宝,但大多数人在读完一两章后就会喜欢它。
使用出色的资源 - Joshua Kereivisky's A Learning Guide to Design Patterns 进行模式排序并帮助您的讨论组。根据经验,我建议对排序进行的一个更改是将策略放在首位。今天的大多数开发人员都经历过工厂化身的好坏经历,因此从工厂开始可能会导致很多关于模式的对话和混淆。这往往会分散如何学习和学习模式的注意力,而这在这方面非常重要第一次见面。
【讨论】:
【参考方案14】:我推荐 HeadFirst DesignPattern。阅读这本书是不够的,在吸收了你需要找到的许多问题的答案之后,你需要找出这些模式在现实生活中的应用。我也在做同样的事情并开始提出问题,即使这些问题看起来很傻。
【讨论】:
【参考方案15】:我的建议是结合实现其中一些并分析它们的一些实现。例如,在 .Net 中,如果您查看数据适配器,则会使用适配器模式,如果您稍微深入研究一下框架,还会使用其他一些模式。
【讨论】:
【参考方案16】:我不知道最好的书,但纯粹主义者可能会说Design Patterns: Elements of Reusable Object-Oriented Software
就我个人而言,我喜欢 O'Reilly 发布的Head First Design Patterns。它是用对话的声音写的,很吸引我。当我阅读它时,我同时查看了我的源代码,看看它是否适用于我正在阅读的内容。如果是这样,我重构了。这就是我学习责任链的方式。
练习 - 练习 - 练习。
【讨论】:
【参考方案17】:设计模式只是工具——有点像库函数。如果您知道它们的存在以及它们的大致功能,您可以在需要时从书中挖掘它们。
设计模式并没有什么神奇之处,任何优秀的程序员在任何书籍出版之前就已经将其中的 90% 自己弄清楚了。在大多数情况下,我认为这些书在简单地为各种模式定义名称方面最有用,因此我们可以更轻松地讨论它们。
【讨论】:
【参考方案18】:我学习设计模式的方式是编写大量非常糟糕的软件。当我大约 12 岁时,我不知道什么是好或坏。我只是写了一堆意大利面条代码。在接下来的 10 年左右,我从错误中吸取了教训。我发现了什么有效,什么无效。大多数常见的设计模式都是我独立发明的,所以当我第一次听说设计模式是什么时,我很兴奋地了解它们,然后很失望的是它只是我直觉上已经知道的事物的名称集合。 (关于 10 年自学 C++ 的笑话其实不是笑话)
故事的寓意:编写大量代码。正如其他人所说,练习,练习,练习。我认为,除非您了解当前设计为何不好并寻找更好的方法,否则您将无法很好地了解在何处应用各种设计模式。设计模式书籍应该为您提供精炼的解决方案和通用术语,以便与其他开发人员讨论,而不是为您不理解的问题提供粘贴式解决方案。
【讨论】:
【参考方案19】:阅读设计模式,练习编码这些概念并不能真正帮助 IMO。当您阅读这些书时 1. 寻找特定设计模式解决的基本问题,从创建模式开始是您最好的选择。 2. 我确定你以前写过代码,分析一下你是否遇到过设计模式旨在提供解决方案的相同问题。 3. 尝试重新设计/重构代码,或者重新开始。
关于资源你可以查看这些
-
www.dofactory.com
设计模式:可重用的面向对象软件的元素(Addison-Wesley 专业计算系列),作者:Erich Gamma、Richard Helm、Ralph Johnson 和 John M. Vlissides
Martin Fowler 的企业应用架构模式
1 是快速入门,2 将是深入研究..3 将解释或应该让您认为您在 2 中学到的内容适合企业软件。
我的 2 美分...
【讨论】:
【参考方案20】:我认为学习设计模式也很困难。您必须更多地了解 OOP 以及一些大中型应用程序开发的经验。对我来说,我作为一组开发人员进行研究以进行讨论。我们关注A Learning Guide To Design Patterns,他们已经完成了模式研究。有 C# 和 javascript 开发人员联合在一起。对我来说,奇特的是 C# 开发人员用 JavaScript 编写代码,而 JavaScript 开发人员为 C# 代码做同样的事情。离开会议后,我还在家里研究并阅读了几本书以进行复习。更好地理解和记住更多信息的方法是在http://tech.wowkhmer.com/category/Design-Patterns.aspx 中使用 C# 和 JavaScript 编写博客。
我建议在了解每个设计模式之前先了解一下模式的名称。另外,如果有人知道这个概念,请解释并举一个例子,不仅是编程,而且是在阅读世界中。
例如:
工厂方法:
阅读世界:我只给钱 5 美元、10 美元或 20 美元,它会在不知道它是如何生产的情况下生产披萨,我只是得到一个小型、中型或大型披萨,这取决于资金投入,这样我就可以吃或做任何。
编程:客户端只需将参数值 $5、$10 或 $20 传递给工厂方法,它就会返回 Pizza 对象。因此客户端可以在不知道它如何处理的情况下使用该对象。
我不确定这对您有帮助。这取决于参加会议的人的知识水平。
【讨论】:
答案中的第二个链接已失效。【参考方案21】:我认为您需要检查您作为开发人员遇到的一些问题,在您因为又一次设计更改而不得不第 10 次修改您的代码之后,您把头发拉了出来。您可能有一份项目清单,您觉得其中有很多返工和痛苦。
从该列表中,您可以得出设计模式打算解决的场景。是否曾经需要对不同的数据集执行相同的一系列操作?您是否需要能够为应用程序提供未来功能,但又想避免为现有类重新设计所有逻辑?从这些场景开始,然后返回到模式目录以及它们应该解决的各自问题。您可能会在 GoF 和您的项目库之间看到一些匹配项。
【讨论】:
【参考方案22】:对于初学者来说,Head First Design 模式就可以了,一旦我们熟悉了所有模式,然后尝试将实时对象可视化为这些模式。
本书将帮助您理解基本概念,除非您在现实世界中实施之前,您无法成为设计模式的大师
【讨论】:
以上是关于如何学习设计模式? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章