学习/实施设计模式(针对新手)


85

我是一个迷茫的新手和业余程序员,试图掌握这一点,所以请原谅我的问题有点小或没有太大的意义。

我看到很多关于SO的问题都围绕着设计模式的使用,我想知道是否有人拥有学习和实现设计模式的良好资源?我了解一般的想法,并且知道如何/何时使用其中的几个(Singletons,Factory方法),但我知道我错过了。

(只要有关系,我的首选语言是C#,但我可以从其他语言的示例中学到)

Answers:


84

头先设计模式

替代文字

和“设计模式”维基百科页面是初学者的最佳资源。 FluffyCatJavaPHP的另一个免费的优秀在线设计模式资源。

四本书刚是紧随其后的,但是它相当先进,所以我要等到您从其他资源中牢牢地掌握住了。



5
我看着那本书...讨厌它。因此,我拿起了GoF书,并从中学到了有关设计模式的所有知识。它有点干,但是内容更多。
Thomas Owens

1
最初,我以为第一本书将完全令人作呕(沉重的隐喻,旁白,并且带有很强的对话性)。我很高兴冒险冒险并买了它。Imo,选择四人组=不必要的受虐狂。
codeinthehole

2
我确实发现第一本书完全令人作呕。我花了很多时间来“取乐”,我认为它传达的关键思想很差-他们迷路了。读它就像看着某人的父亲努力保持冷静。但是GoF书是另一个极端,因此并不适合所有人。
Draemon

2
@Bill:我知道,但是我同意@Thomas和@Draemon的评论。我的非编程类朋友推荐此系列书籍作为编程类算法的参考书,他们讨厌它们并最终选择“较干燥”的书籍,因为每页的信息量更高。这只是一个偏好问题。我从小就读技术书籍,并进入一所高技术高中,那一定使我习惯于阅读“干”书籍。我更喜欢没有宠物对我说话和旁听的书,而没有让我同化的简单信息。
EstebanKüber2010年

27

设计模式之所以出色,有多种原因:

  1. 让您开始解决常见问题。
  2. 为开发人员提供了词汇表,以非常紧凑的方式讨论解决问题的某些方法。
  3. 与了解设计模式并在解决方案中使用设计模式的开发人员合作时,他们会更快地了解解决方案。

但是,当您的目标只是学习设计模式时,我认为您缺少基本知识。所有设计模式都基于更通用的原则。高内聚,低耦合开闭原理,DRY,李斯科夫替代原理等。对于这些基础知识,我将按以下顺序阅读以下书籍:

  1. 面向对象的分析与设计(从头开始)[说明的](平装本)
  2. 应用UML和模式(精装)
  3. C#中的敏捷原理,模式和实践(Robert C. Martin系列)(精装本)

之后,您就可以准备四种设计模式的基本组合

  1. 头先设计模式(头先)[说明](平装本)
  2. 圣经
  3. 一个不错的网站(不买东西,不值得)http://dofactory.com/Patterns/Patterns.aspx(该网站的某些实现值得讨论

下一步:

  1. 企业应用程序体系结构的模式(Addison-Wesley签名系列)(精装书)
  2. POSA书籍

并永远记住:模式不是目标!


2
我认为面向对象的基础知识(封装,继承,多态等)足以使知识开始学习设计模式。您可以通过学习模式来学习其他原理(高内聚,低耦合开闭原理,DRY,李斯科夫替代原理等)。
比尔蜥蜴

我同意您可以仅使用面向对象的基础来学习设计模式。但是到了这样的地步,您就可以使模式起作用,但还没有完全理解为什么这是一个好的设计,您进行了哪些折衷以及如何对模式进行更改。
KeesDijk,


14

我的提示:

阅读来自不同来源的大量模式。

试图将尽可能多的模式强加到您正在编写的所有代码中,因为这一点不会产生良好的结果。相反,让信息在您的大脑中停留一段时间(阅读:几个月)。

突然之间,您会发现自己陷入某个问题或一段代码中,并且隐约地记得您已经看到一些可以解决该特定问题的方法。现在是时候查找您正在考虑的模式的详细信息并尝试应用它。

无论如何,这就是对我有用的东西。


9

设计模式

本教程站点包含以下小节

  • 每种设计模式的意图
  • 现实世界的结构设计模式的
  • 一个问题说明
  • 关于这个问题的详细讨论
  • 关于如何得出模式的清单
  • 达成规则的经验法则
  • 设计模式的代码段,包括C#,C ++,Delphi,Java和PHP

该站点还包含有关反模式UML重构的指南


我发现网站非常有用。好的,清楚的例子。
奥古斯塔斯




4

我建议您看一下Jean Paul Boodhoo关于DNRtv上的Demystifying Design Patterns的方法论(?),以下提供了URL。该视频广播涉及到Singleton,Abstract Factory等-区别在于您可以在他讨论理论的同时观看他的代码。很高兴在一个下雨的工作日看午餐。

http://www.dnrtv.com/default.aspx?showNum=63 http://www.dnrtv.com/default.aspx?showNum=65 http://www.dnrtv.com/default.aspx?showNum= 68 http://www.dnrtv.com/default.aspx?showNum=71 http://www.dnrtv.com/default.aspx?showNum=92


DnrTV崩溃了!因为Boodhoo的屏幕广播提供了很多信息,所以真是太可惜了。您是否看过其他地方托管的视频?您有视频文件吗,我很乐意将其保持在线状态。
斯蒂芬·路易斯

4

以上注释的注释。

GOF模式快速参考

在这里可以启动dofactory.com/patterns/patterns.aspx是一个好地方-您可以找到每个模式的链接以及相应的实现。

但是,请记住,这些都是GOF模式。在OOAD获得足够的专业知识后,您可能还需要阅读和理解高级模式。Head First设计模式是一个好的开始,在取得一些进展之后,请使用Martin Fowler的企业应用程序体系结构模式。

应用设计模式-思考过程

另一个主要方面-应用设计模式与了解它们一样重要。阅读这些文章可能对您也有帮助。

应用设计模式第一部分

应用设计模式第二部分

希望这可以帮助


3

与其他已经提到的一样,Head First设计模式是一个很好的模式。除此之外,当然还有原始书籍和C#设计模式。也有已经提到的好网站。

除了自学之外,我还建议您在您所在的地区开始或参加一个模式研究小组。请参阅设计模式学习指南获取解释和很好的学习模式的知识。我们做到了这一点,老实说,我现在的理解不多。每周与其他有兴趣的人会面时,您会在学习抽象的东西(如设计模式)时保持令人惊讶的纪律。

学习愉快!


3

在花钱买书之前,我会推荐Wikipedia出色的设计模式页面。也适用于其他与Google不同的东西,用于“设计模式截屏”或在YouTube上搜索“设计模式”。以不同的方式呈现相同的信息通常有助于减少一分钱。

四人帮》一书是有关最著名的模式的权威文章,但阅读起来并不容易,并且使用C ++示例并不是每个人都喜欢的。

Head First设计模式的文字是更为接近,但只包含四种模式岗的一个子集。

最重要的是了解特定模式在何处以及为何有用。然后,以您选择的语言在网络上搜索实现示例,然后进行实验,直到您“理解”为止。在继续学习下一个模式之前,请先了解其中一种模式。每个人都比其他人更了解某些模式(还有数百个鲜为人知的模式)。

只是不断插电。



2

Martin Fowler的企业应用程序架构模式(精装)

重构为模式(精装本),作者:Joshua Kerievsky

持续集成:Paul Duval等人,提高软件质量并降低风险(平装本)。

超越软件架构:Luke Hohmann创建和维持获奖解决方案(平装)


2

设计模式就像任何库函数一样,请阅读它们,然后在出现问题时,设计模式将出现在“工具箱”中。有许多设计模式书籍,都是按照原始的“四人帮”设计模式进行仿制的。

对于任何程序员来说,我认为和Fowler的Refactoring本书都是绝对的最低要求。


POSA书籍不是“ GOF之后的典范”书籍-GOF恰好是第一个出版的-它们同时在生产中。
蒂姆(Tim)

1
为了避免混淆,我想说的是MOST设计模式未在库中实现。通过将库类组合在一起可以形成许多模式。
比尔蜥蜴

我确实听起来像可以在图书馆中完成这些—很抱歉,感谢您的澄清,比尔。设计模式通常是LIKE库,但是您通常不能将它们放在库中-就像彼此未知的类交互的不同方式一样。
Bill K


2

原始的《设计模式》一书是所有程序员必读的书。

这是一本非常出色的书籍,涵盖各个层次:布局,清晰度,洞察力,深度。这是一本很棒的书,您首先要从头到尾阅读,然后用作参考,直到您从内到外真正地了解它。

您可以从Wikipedia页面开始,但也可以阅读一本好书。


2

Craig Larman的《应用UML和模式》。从分析,设计和使用简单的Case场景的基础开始。以简单的方式介绍了大多数基本模式。


2

如果您了解设计模式,您会注意到Java似乎已经实现了其中的一些。

查看任何框架的源代码,就可以收集有关设计模式的信息。我个人认为它们并不完全适合我的任何代码,有时书和教程中的示例似乎有些理想化,尤其是对于单独的编码人员而言。

设计模式不适用于懒惰的程序员。


2

对我和我的同事来说,在模式研究组之后学习设计模式。他们准备了我们应按顺序学习的每种模式的列表,并提出了一些开放式问题,使我们在小组中进行更多讨论。


1

我还建议在重构为模式方面有所作为阅读过Head First Design模式后,您对了解。

注意:代码示例使用Java,但应与C#示例非常相似...


1

对于一个很少经验的人来说,深入研究设计模式对我来说没有太大的意义。很高兴知道它们的存在,但是在这一点上,您应该更多地专注于其他事情,而不仅仅是学习设计模式。

它们在遇到问题时很有用-作为新手/初学者开发人员的概念,除了知道您应该在任何时间和地点使用它们之外,它们实际上并没有太多实用价值。

编辑要澄清-许多设计模式是某些领域中发现问题的结果。很难指望新的程序员(IMO)知道用于某些问题的设计模式。正如我们在CS研究中散布算法一样,我们需要了解我们可以使用模式做的事情及其好处,但是当人们仍在建立问候世界或发现stl时,对设计模式的实际需求就不大。模式很棒。但是它们不是灵丹妙药。

(CASE(工具)也不是,UML也不是,SCRUM也不是,TDD,STL,Java或XML等都不是。)这些都是我们专业的方面,因此将这些主题视为第二主题。来是天真。


但是,如果您不了解这些模式,就不会知道是否有解决您的特定问题的模式。是的,作为新手,您不太需要使用模式,但是在需要之前学习模式非常重要。
Elie

我想我在帖子
蒂姆(Tim)

您不仅需要知道它们的存在,还需要更多...。您需要知道它们的工作方式以及使用它们的情况。这不仅仅是肤浅的知识。您可能需要几年的时间才能使用模式,但是当您使用它时,就不是学习该模式的时候了。
Elie

因此,您是说新手必须学习和理解数十种或更多种模式?在此期间,桌面上出现了什么?我不是在反对模式。而且我也不认为学习模式JIT的细节不是一件坏事。在其他内容之前学习模式IMO没什么用
Tim

1

模式包括程序员用来谈论抽象设计的高级词汇。如果您正在重复使用抽象解决方案,则按名称引用它会很有帮助。如果您发明了一种模式,则进行一些检查以确保尚未获得名称是很专业的。如果已命名,则说明可能会有用。

在进行了一点点编码之后,您会发现自己编写的代码与之前编写的代码相似。这是一个模式。即使是很小的模式,也应注意。有没有更好的模式?您是否看到某些微小的模式合作解决更大的问题?好吧,下一次,当您想解决更大的问题时,整个模式将成为一个整体。整理详细的代码行变得机械化。

您越注意到模式,编程就变得越容易,您就越会欣赏其他程序员开发出的一些最大最好的模式。尝试掌握MVC模式。一种或另一种方式,即使在很小的设计决策中,变化也随处可见。


1

一旦理解了这个概念,就可以遍历Eclipse源代码或设计,以及这些模式的许多非常好的示例(毫不奇怪,Gamma是其中的一位设计师)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.