如果我不使用软件设计模式怎么办?[关闭]


17

如果不使用软件设计模式,我可能会遇到什么样的问题?您能告诉我使用标准的面向对象技术进行设计的问题吗?


24
相当多的软件设计模式非常明显。您必须非常了解它们,以确保您没有使用它们-可能足够好,您不妨使用它们!
James McLeod13年

18
作为@JamesMcLeod的附带说明,许多“设计模式”非常明显,每个人都会做的事情。那为什么给他们起名字呢?为了交流的目的。“我正在使用X模式”比解释您的解决方案具有更大的语义密度,希望另一端可以“哦,是的!我也做到了,除了我叫我的变量...”。
Phoshi

6
@AJMansfield我见过的一些最糟糕的代码涉及对设计模式的过度热情。
Erik Reppen 2013年

5
@ErikReppen过度使用设计模式的责任应归功于这样做的人。从我的角度来看,核心问题不是设计模式本身,而是过度概括(部分是由于缺乏架构监督)和过度设计(有时由工程委员会)。
rwong

5
“设计模式”是一个词典,而不是一种技术。
卡兹巨龙

Answers:


76

您错过了重点。

设计模式固有地存在于进行软件设计时,就像世界上存在的结构模式一样。即使您不知道事物的名称,您最终也会发现某些物理结构非常适合某些问题。您会发现木头/金属棒/等的三角形形状是非常稳定的结构,但仅在平面上。您会发现方砖比圆砖更具优势...

同样,某些软件结构在某种程度上是唯一的或最佳的。最终,您将找到它们并使用它们,而不管它们的名称如何。这就是设计模式的核心-它们是经验丰富的程序员无论如何都知道并使用的这些结构的名称。它使程序员能够更加统一和简洁地进行通信。它还使程序员可以更自觉地思考模式的概念。

因此,我想提出两个要点:

  1. 不能使用设计模式。
  2. 由于不知道正在使用的事物的名称,您将很难在团队中工作。

12
+1:绝对正确。在设计模式广为人知或流行之前,我开始了OO开发。是的,我们也发明的东西一样,当你它在明亮的光线种类貌似策略模式的眯起眼睛说,工厂,单身人士和一些东西。现在的重点是,我知道设计模式,我知道工厂还可以,但是可以做得更好,单例做得不好,如果实际上策略模式,那么可能是策略模式会更好。
Binary Worrier

3
...了解设计模式并学习如何正确使用它们可以节省大量时间,您不太可能尝试重新发明轮子,阻止您带领自己走上糟糕的设计和制定错误的解决方案的道路。认真学习模式,在它们为您服务时使用它们,而在它们不起作用时不要使用它们。
Binary Worrier

1
这恰好总结了我对模式的看法。它们是与他人交流您正在做的事情的绝佳工具。尽管您不会完全构建它们,因为每个问题都是不同的。但是它们是要旨,方向和要遵循的粗略指导,因此可以很容易地向他人解释您在做什么。
Matt D

+1用于与物理结构进行比较。我要补充的是,如果您已经知道“桁架”是支撑屋顶负载的好结构,而不是进行试验并希望它不会倒塌,那么它将有助于建造房屋。
kdgregory 2013年

39

那些不记得过去的人会被谴责重复过去。

除了设计提出的问题之外,您将不会遇到任何其他具体问题。随着时间的流逝,您最终会不知不觉地使用这些模式,您只是花时间自己弄清楚它们。事先了解这些图案可以使它们更容易在设计中发现,并具有许多人证明它们的主要优点。

今天开发的所有内容都主要基于先前的知识,因此忽略它是没有道理的。想象一下,今天建造一座摩天大楼,却不知道数百年前建造大教堂的人们所面临的问题。


10
“每个引号都具有相等且相反的反引号。” “如果我们真正值得未来,就必须撕毁过去。” (OK一个是希特勒所以大概最好忽略它....)
拉塞尔

20

如果不使用软件设计模式,我可能会遇到什么样的问题?

您将遇到无法编写任何软件的问题。

变量是一种设计模式。

方法是一种设计模式。

运算符(加法,减法等)是一种设计模式。

陈述是一种设计模式。

值是一种设计模式。

参考是一种设计模式。

表达式是一种设计模式。

类是一种设计模式。

...

您始终在编程中所做的一切都是设计模式。在大多数情况下,该模式已根深蒂固,以至于您不再将其视为“设计模式”。您必须学习的东西,例如“单例模式”等等,仅仅是(尚未)被烘焙为您使用的任何语言的模式。

您能告诉我使用标准的面向对象技术进行设计的问题吗?

不,我不知道这个问题是什么意思。设计模式 “标准的面向对象技术”,这就是使它们成为设计模式的原因。设计模式是一种解决特定问题的标准技术,特别是(尽管不一定)以面向对象的语言解决。


1
The things that you have to learn like "the singleton pattern" and so on are simply patterns that haven't (yet) been baked into whatever language you're using.-这(几乎)是设计模式的定义-一种灵活/易于重用的代码构造,用于克服语言本身的局限性,易于与他人进行交流。一旦成为语言的一部分,它就不再是设计模式。
2013年

1
@Izkata:所以您的立场是,例如,在C#中不可能使用观察者模式,因为C#将观察者模式以事件的形式内置在语言中?真傻 与模式相关的特定于语言的位是在语言中实现模式的规范方式。当然,设计模式可以用直接支持它们的语言来使用。这就是直接支持他们的重点!
埃里克·利珀特

从未说过不可能,我试图暗示不必要例如Java没有事件,因此它使用设计模式来模拟它们。
Izkata

@Izkata:那我很困惑。您说过,模式一旦成为语言的一部分,就不再是模式。那么“观察者模式”是Java中的模式不是 C#中的模式吗?
埃里克·利珀特

1
或者换一种说法,设计模式是程序员所做的任何事情,而不是用英语来描述。我不确定我是否完全同意该定义,但是我认为它可以准确地反映您在说什么,并且至少没有主观判断的好处,这算是一种模式。这是分析程序员行为的一个属性,当然,程序员不可能以无法分析的方式行事:-)
Steve Jessop 2015年

4

理解设计模式的要点比将其用于文字更重要。IMO,至少在我习惯的语言范例中,有些模式是愚蠢的。IMO是一个只盲目地使用设计模式而没有真正理解设计模式的程序员,而不是想自己思考问题的程序员。但是,熟悉这些思想然后自己决定是否值得的人可能比这两个人都要强大得多。

就是说,我不知道飞行重量的意义是什么,我并不为此感到羞耻。(请参阅有关另一个很有帮助的维基百科条目的评论)

我推荐维基百科关于设计模式的条目。它非常简洁明了。对于了解为什么可能会干扰给定的设计模式非常有帮助。我个人倾向于发现最简单的方法最有用,并且不会三思而后行地修改任何模式的给定实现以适合我的需求。

他们是想法,而不是蓝图。在某些语言中,它们根本不是一个好主意。在其他语言中,正确地将它们视为克服语言设计弱点的鞭策,而这些弱点可能可以通过减少复杂性得到更好的补偿。无论如何,在决定自己的首选解决方案之前,对它们进行检查并尝试了解它们将要克服的挑战并没有什么害处。

您将面对什么样的问题?除非您是一位编程天才,但您可能已经错失了机会,并且在解决问题上花费了更多的时间,除非您已经掌握了一切。对流行的编程思想保持批判性的眼光很重要,但是了解人们认为他们正在解决的问题永远不会有任何伤害,因为这将使您自己喜欢的解决方案/方法更加清晰。


2
飞重(不是飞轮)。阅读Wikipedia文章的第一段(并且只有第一段),然后查看Integer.valueOf(int)并考虑多少次这样可以避免为通用值创建新的整数。

2
@MichaelT和该死的。那确实比我见过的要好得多。谢谢。
Erik Reppen

我在大多数设计模式指令中看到的问题是,它们试图给出一个较大的项目视图(GoF书全部是关于编写文字处理器的,而不是一项艰巨的任务)。但是有时它们适用于小得多(几乎是“琐碎”)的事物。7行代码可以清晰地描述每个人都在不断使用的重量。比大型项目或人为设计的示例更容易理解。

1
@MichaelT对我来说,这也是一个很好的例子,说明即使对我的主要语言JavaScript(即原型继承和闭包通常用于解决该问题)没有立即使用,但对某些内容稍加澄清对总体上编写代码有什么帮助呢?问题。有了那ha-ha的时刻,仍然给了我一些相关的想法。
Erik Reppen

2

您将面临的主要问题是您将重新发明轮子。之所以将它们称为模式,是因为它们经常且以可预测的方式出现。


0

即使遵循设计模式,您也可能最终会得到错误的设计。设计模式是自然的,您最终将在设计中使用某些样式。您将必须非常努力不使用任何模式。没有理由谴责设计模式,更重要的是选择适合您需求的模式


-1

您一直在使用设计模式,而没有意识到。许多流行语言的标准库在设计时都考虑了设计模式。Java的FileReader库就是一个例子,它是使用decorator设计模式设计的。现在谈论您自己的代码,您不必被迫使用设计模式(在大多数情况下)。设计模式是“解决常见问题的可重用解决方案”,这意味着它将帮助您编写更清晰,更易于维护的代码,因此您实际上要决定要避免多少使用意大利面条式代码。

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.