我们如何知道何时使用设计模式?
任何人都可以阅读GoF书,以了解什么是设计模式以及如何使用它们,但是弄清楚设计模式何时可以解决问题的过程是什么?模式的知识是驱动设计的方法,还是有办法弄清楚如何使用模式来更改设计?
换句话说,是否有模式的模式?
解决方案
回答
我强烈建议我们阅读O'Reilly的Head First Design Patterns。这就解释了如何在现实世界中使用这些模式。
我还要补充一点,不要在设计时过多考虑模式。另外,寻找一种模式可能有助于解决的"代码异味"。
回答
经验。了解其用法的模式和实际示例。每当我们要做出设计决定时,请考虑是否知道适用的模式。随着时间的流逝,我们会变得越来越好,并且发现了将模式应用于更多问题的新方法。
回答
我发现的另一本好书是:
重构为模式
通过显示何时,何地以及如何将现有代码更改为模式,它使我对概念有了更好的理解,并能够确定可以在何处使用它们。
回答
我们如何学习何时使用if语句?
我之所以喜欢它,是因为它是一个较大的结构,我们需要先了解它的来龙去脉,然后才能有效使用它。 if语句解决了一类需要分支的问题。桥接模式可解决一类问题。我真的没有不同的看法。
回答
设计模式应该提供一种可以解决问题的结构。解决实际问题时,我们必须考虑该问题的解决方案的许多细微变化,以查看是否有适合设计模式的问题。特别是,我们可能需要对问题或者其解决方案进行概括,以使设计模式合适。
答案是,这是一门艺术。知道设计模式无疑是重要的一步。习惯这种情况的一种方法是研究设计模式的应用,而不仅仅是模式。看到一种模式的许多不同应用程序可以随着时间的流逝更好地将任务映射到一种模式。
回答
如果我们知道这些模式,那么它们将成为我们工具箱中的工具。查看任务时,可以从工具中进行选择。到那时,我们应该对哪个工具最适合给定的问题有一个很好的认识。这是公式停止工作的地方,我们实际上是在进行工程工作。
回答
我同意仅仅学习模式是不够的。大多数书籍的问题在于它们没有提供真实的示例。我听说像一些前面提到的" Head First设计模式"是一个很好的模式。
另一件事是,大多数书籍有意不是针对特定语言的,这对我们来说既可能是好事,也可能是坏事。总体而言,了解一种模式很重要,但知道如何很好地实施它也同样重要。我碰到过一本书,叫做《 C3.0设计模式》,这本书对这两个不可分割的方面都投入了差不多的墨水。
回答
当我第一次遇到设计模式时,我也遇到了同样的问题。我赞赏这些概念,但不知道何时或者如何应用它们。我最初的方法是在设计阶段寻找适用性。一旦有了框图并明确了每个模块的职责,就不难承担职责并与一本体面的参考书交叉引用。这里已经提到了好几个,但是GoF应该在列表中。下一步是根据我们在模式中看到的内容寻找设计方面的改进。
回答
设计模式?我们正在浸泡其中!
设计模式没有什么特别的,它们仅仅是设计模式。所有开发都使用设计模式。在面向对象的程序设计中有一定的设计模式集,通常认为它们是合乎需要的,并已成为规范的设计模式。但是,还有许多不良的或者无差别的设计模式(例如设计反模式)以及未发现和/或者未记录的模式。
我们无法避免在编程时使用模式。但是,我们可以更清楚地了解正在使用的模式,以及何时某些模式有用以及什么时候不有用。从GoF书中学习规范的设计模式将有所帮助,学习代码气味和重构也将有所帮助。对于何时应使用特定的设计或者设计模式,没有一个正确的答案,我们需要积累使用和实施它们的经验,以便知道何时何地使用哪种模式。
回答
提出问题:我们应该制作的模式mtch是"哪种模式适合我的问题"。考虑一个非常简单的模式,在数组中查找一个元素。在C中,就像
TYPE_t ary[SIZE] = // ... gets initialized somehow size_t ix ; // Your index variable for(ix=0; ix < SIZE; ix++){ if (ary[ix] == item) { return ix ; } }
我们无需查看代码,而认为"我可以在哪里使用它",而是查看问题并说:"我知道如何在数组中查找元素吗?"
使用更广泛的模式实际上是相同的方式。我们需要拥有一个不经常更改的数据结构的许多副本-这使我们认为"轻量级"。我们认为代理服务器需要在网络边界两侧都存在的东西。
当我们研究模式,尤其是GoF时,问自己:"什么情况需要这种模式?我以前见过这种模式吗?在以前的工作中我可以将其用作什么?在我自己的生活中哪里可以找到这种示例? "
回答
模式的核心概念是大多数人不理解的。不要将它们视为数据结构或者算法。
而是将代码视为人们之间相互发送消息(例如通过便笺或者发送信件)。每个对象都是一个"人"。
我们组织"人员"的方式以及他们用来相互发送消息的模式就是模式。