如何学习设计模式?

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

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

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

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

176232 次浏览

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

数据,对象工厂页是一个很好的资源。他们会讲解这些模式,并给出概念上和现实世界中的例子。他们的参考资料也很棒。

你试过《四人帮》这本书吗?

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

我读了三本书,仍然不太理解模式,直到我读了OReilly的头部优先的设计模式。这本书让我大开眼界,解释得很清楚。

alt text

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

练习练习再练习。我认为4到5本书在没有大量练习的情况下是一种过度的阅读练习。我认为最好的方法是使用模式开始重构当前项目。或者如果你没有任何正在积极进行的项目,则用你自己的方式做,然后尝试重构模式.;

如果你没有亲身经历过他们所解决的问题,你就无法充分欣赏他们。请记住,它们不是银弹——你不需要记住它们,并在飞行中努力应用它们。我的意见…

我发现,要理解或理解某些模式的好处有点困难,除非理解它们解决的问题和其他(更糟糕的)实现问题的方式。

除了GOF和POSA的书,我还没有真正读过,所以我不能给你其他的建议。实际上,您只需要了解问题领域,我认为许多缺乏经验的开发人员可能无法欣赏模式的好处。这不是对他们的轻视。当一个人不得不首先与糟糕的选择作斗争时,接受、理解和欣赏好的解决方案要容易得多。

祝你好运

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

至于我个人最喜欢的,我喜欢O'Reilly出版的头部优先的设计模式。它是用对话的口吻写的,很吸引我。当我阅读它时,我同时检查了我的源代码,看看它是否适用于我所阅读的内容。如果有,我就重构。我就是这样学会责任链的。

练习-练习-练习。

练习,练习,再练习。

你可能读了很多年的关于演奏大提琴的书,但仍然不会用弓演奏乐器,也不会演奏出任何听起来像音乐的东西。

设计模式被认为是一个高级问题;只有当你有必要的经验来认识到它们是有用的,它才与你相关。你能认识到它们的有用是件好事,但除非你亲眼目睹过它们的应用场景,否则几乎不可能理解它们的真正价值。

当你在别人的代码中识别出设计模式,或者在设计阶段识别出一个与模式很适合的问题时,它们就会变得有用;然后检查形式模式,检查问题,确定它们之间的增量是什么,这说明了模式和问题的什么。

这和编码是一样的;K&R可能是C语言的“圣经”,但从头到尾读几遍并不能给人实际的体验;经验是不可替代的。

有很多很好的例子。我想补充一点:

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

你应用这个模式就会很好。几个月后,您将需要更改代码中的某些内容,并发现使用特定的模式并不明智,因为您将自己编码到一个角落,您需要再次重构。

当然,这并不是一个真正的“做了就会在21天内学会”的答案,但以我的经验来看,这是最有可能让你对问题有一个很好的洞察的答案。

对于书籍,我推荐设计模式说明头部优先设计模式。要真正了解这些模式,您应该查看现有的代码。寻找你已经在使用的模式。看看代码味道和什么模式可以解决它们。

我已经领导了一些设计模式讨论小组(我们的网站),并阅读了5或6本模式书籍。我建议从《头部优先设计模式》一书开始,参加或发起一个讨论小组。《Head First》一开始可能看起来有点像Hasboro,但大多数人在读了一两章后就喜欢上了它。

使用出色的资源——Joshua Kereivisky的《设计模式学习指南》进行模式排序并帮助您的讨论组。根据经验,我建议将战略放在第一位。今天的大多数开发人员都经历过工厂的一些好或坏的化身,因此从工厂开始可能会导致许多关于模式的对话和困惑。这往往会转移人们对如何学习模式的关注,而这在第一次会议上是非常重要的。

设计模式只是工具——有点像库函数。如果你知道它们和它们的近似函数,你可以在需要的时候从书中找到它们。

设计模式并没有什么神奇之处,任何优秀的程序员都能在任何书籍问世之前自己找出90%的设计模式。在大多数情况下,我认为这些书在简单地为各种模式定义名称方面最有用,这样我们就可以更容易地讨论它们。

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

这个故事的寓意是:编写大量的代码。就像别人说的,练习,练习,再练习。我认为,在您了解当前的设计为什么不好并寻找更好的方法之前,您不会很好地了解在哪里应用各种设计模式。设计模式书应该为您提供完善的解决方案和与其他开发人员讨论的通用术语,而不是对您不理解的问题的粘贴解决方案。

在我看来,阅读设计模式,练习编码的概念并没有真正的帮助。当你读这些书的时候。寻找特定设计模式解决的基本问题,从创建模式开始是最好的选择。2. 我相信你过去写过代码,分析一下你是否遇到了设计模式旨在提供解决方案的相同问题。3.尝试重新设计/重构代码,或者重新开始。

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

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

1是快速入门,2是深入学习。第3节将解释或应该让你认为你在第2节中学到的东西适用于企业软件。

我的2美分…

我认为研究设计模式也很困难。你必须对OOP有更多的了解,并有一些大中型应用程序开发的经验。对我来说,我是作为一组开发人员来学习进行讨论。我们跟随设计模式的学习指南,他们已经完成了模式研究。有c#和JavaScript开发者联合在一起。对我来说,很奇妙的是c#开发人员用JavaScript编写代码,JavaScript开发人员对c#代码做同样的事情。在我离开会议后,我也会在家里研究和阅读几本书来复习。在我的脑海中,更好的理解和记忆的方法是用c#和JavaScript在这里http://tech.wowkhmer.com/category/Design-Patterns.aspx中的例子来写博客。

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

例如:

工厂方法:

阅读世界:我只要给钱5美元、10美元或20美元,它就会生产出披萨,而不知道它是如何生产的,我只会得到一个小的、中等的或大的披萨,这取决于我投入的钱,这样我就可以吃或做任何事情。

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

我不确定这能帮到你。这取决于与会者的知识水平。

你读过Allan Shalloway写的《设计模式解释》吗?

这本书与其他设计模式书籍有很大的不同,因为它并不是一个模式目录,而是主要介绍了一种分解问题空间的方法,可以很容易地映射到模式。

问题可以分解为两部分:共同的和不同的。一旦完成了这一步,我们就可以将常见的内容映射到接口,并将不同的内容映射到实现。从本质上讲,许多模式都属于这种“模式”。

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

我发现这本书与其他模式书相比非常发人深省,对我来说,阅读电话簿的兴奋程度是一样的。

我认为您需要检查一些您作为开发人员遇到过的问题,当您因为另一个设计更改而不得不第十次修改代码时,您会感到非常紧张。你可能有一个项目清单,你觉得有很多返工和痛苦。

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

对于初学者来说,头部优先设计模式就可以了,一旦我们熟悉了所有的模式,然后尝试将实时对象可视化到这些模式中。

本书将帮助你理解基本概念,除非你已经在现实世界中实现了,否则你不能成为设计模式的大师

问自己这些问题:

他们做什么?

它们是如何耦合的?

什么时候使用它们?

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

什么缺失的语言特征会让它们消失?

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

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

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

对于这样一个老问题,我只有两分钱

有些人已经提到,实践和重构。我认为学习模式的正确顺序是:

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

大多数人忽略了1,许多人相信他们可以做2,几乎每个人都直接去做3。

对我来说,提高软件技能的关键是学习TDD。这可能是一个痛苦而缓慢的编码过程,但首先编写测试肯定会让您对代码进行很多思考。如果一个类需要太多样板文件或者很容易崩溃,你很快就会注意到不好的味道

TDD的主要好处是你不再害怕重构你的代码,并迫使你编写高度独立和内聚的类。如果没有一套好的测试,触摸没有损坏的东西就太痛苦了。有了安全网,你将真正冒险对你的代码进行巨大的更改。这是你真正开始从实践中学习的时刻。

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

Derek Banas在youtube上制作了我非常喜欢的图案设计教程:

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

他们可能在时间上有点短,但他的时机和呈现方式使他们非常愉快地学习。