设计模式 - 架构宇航员

41

也许我的问题与这个类似: 你使用设计模式吗?

我编写的程序主要是使用 Windows FormsASP.NET,代码量大约在50-75 K行左右。这些程序需要进行GUI设计和布局,包括各种图形和图形处理。

我认为自己很擅长面向对象编程(OOP),并且擅长平衡OOP和传统的过程式方法以创建易于维护的代码。

问题出现在我考虑设计模式时。链接的线程有一个有趣的评论,即可能使用设计模式,但没有刻意这样做。当我想有意识地使用设计模式(在程序设计中),感觉就像我正在超越所需的范围,我在“架构宇航员”的领域中,所以我回到传统的方法,一切都正常进行。

以MVC模式为例。如果我想使用 Windows Forms 或 ASP.NET (Visual Studio 2005) 实现此模式,那么我必须编写一个“框架”,而编写框架似乎比应用程序的规模还要麻烦。

也许我的应用程序太小了,无法证明使用某些模式的必要性。也许我只是不够了解这些模式或需要更深入地研究它们。

是否有其他人有过这种“架构宇航员”的感觉?

如何有意识地使用设计模式而不过度使用呢?


3
好问题,但它可能适合放在http://programmers.stackexchange.com/上。 - Hamish Grubijan
或者在https://softwareengineering.stackexchange.com上找到它。 - user1451111
12个回答

40
当涉及到这种规模较小的应用程序时,我通常更担心反模式而不是设计模式。话虽如此,这实际上是同一枚硬币的两面:对我来说,设计模式的力量在于熟悉它们,以便认识到我正在考虑的任何解决方案的不太明显的优缺点。除非我确实需要所有功能,否则我很少或从不刻意完全实现完整的设计模式;然而,通过识别我所走的路径并查看该解决方案的常见陷阱或缺点,我经常节省了自己大量未来的重新工作,可以将其与我未来的使用进行比较,以查看它是否会成为我关注的问题。因此,设计模式的力量在于,您可以轻松预测当前解决方案对您的潜在需求的未来后果,而不必担心您可能错过了一些不太明显的警告或特殊情况,您没有考虑到。

3
对于反模式来说,我个人认为它们比设计模式更重要但却没有得到足够的关注,给这些反模式点个赞。 - Asics

31

'如何有意识地使用设计模式而不过度使用?'

很简单。

  1. 不要将MVC框架的开发与模式混为一谈。

  2. 认识到你所做的每一件事情都曾被其他人(或者你自己)做过。

  3. 当你重复某个东西——任何东西——时,你正在遵循一种模式。

  4. 当你重复设计某个东西——无论多么小——时,你正在遵循一种设计模式。

  5. 当你注意到自己在重复某个东西时,给那个东西起一个名字。看,你已经发现并命名了你的第一个设计模式。无论大小。

  6. 当你命名了一个设计模式,你可以考虑何时使用它,为什么使用它,它解决了什么问题以及使用它的后果是什么。无论大小。

  7. 所有涉及“重复设计元素”的学习都是设计模式。无论大小。

每一个循环,每一个if语句,每一个对话框,每一个文件打开,这些都是设计模式。

大多数是语言的一部分,并且具有明显的语言特定名称。“IF”,“OPEN”等等。

一些设计模式比单个语句更大,但比整个MVC框架小。这些才是有趣的。学习它们。购买一本书。阅读它。MVC不会出现在大多数设计模式书籍中,因为——嗯——它太复杂,太难应用了。

不要从MVC开始。从其他任何东西开始。


2
+1 我笑了,“无论多么小”这个描述很好,但有一瞬间我以为我在读“霍顿听到了谁”的故事。 - Andrew Hare
7
好的文章,但我必须挑刺一下:设计模式的内涵指的是您软件架构中高级别的布局,而不是任何命名的软件模式的通用词。举个例子,“冒泡排序”是一个有名称的可识别软件模式,但不是设计模式。 - Juliet
设计模式怎么可能不涉及到所有层次的模式呢?如果它们不是设计模式,那我所设计的其他模式又是什么呢?冒泡排序是由更小的模式组成的一种模式,并且是一个更大模式的一部分。 - S.Lott
1
在较低的层面上,我认为你指的是“算法”,而不是“模式”。从英语单词的意义上讲,你所描述的确实是“模式”- 但就我个人而言,我同意朱丽叶的看法,即在问题被提出的意义上,模式是指更高层次的设计。这只是“我的观点”。 - Nij
将“模式”限制在设计的“高层次”是一种人为的区分,当您开始实际思考您正在做什么、什么是可重复的以及什么是常见问题的常见解决方案时,这种区分很快就会崩溃。 - S.Lott
+1..我看到这个答案中有很多思考过程,无论所有陈述是否都是设计模式 - S2S2

10

“架构宇航员”是那些花费大量时间讨论设计但实际上并没有任何实际行动的人。

我喜欢《重构与模式》这本书中提出的设计模式方法。在这里,模式不是我们预先投入的,而是仅在代码复杂性妨碍了开发后,用来减少代码复杂性的东西。因为这种方法需要先有可用的代码,并选择基于使代码更易于满足特定需求的重构,所以非常注重结果。


7

几乎任何一个适当的设计模式,应用时都应该能够简化问题。如果你让事情变得更加复杂,那么你可能正在朝着错误的方向解决你的特定问题。


6

MVC本身并不要求您编写任何框架,它只是意味着您将视图、控制器和模型代码分开。即使是编写简单的移动应用程序,我也会使用MVC(或 MVP),因为我发现控制分离在编写测试时非常有利(更不用说在更改UI时了)。

我猜想您现在做的单元测试或集成测试不多,所以这种分离对于提高代码质量和可读性并不是那么明显。

我强烈建议您阅读Fowler关于UI架构的覆盖范围


3

不要忘记沟通 - 众所周知的设计模式可以用几个词语来传达复杂的内容。当你说“使用观察者模式进行通知传递”,每个人都知道你的意思。


3
很少有项目需要或从超级架构中受益。大多数以这种方式开始的项目最终都无法完成。其中许多人即使声称相反,也往往很难扩展或维护。请记住语言和技术的发展速度之快。今天最新、最酷的东西可能在你完成一个非常大的项目时已经过时了。模式很有趣,可以让你洞察如何优雅地解决问题,但在现实世界中,大多数时候并没有优雅的解决方案。我曾在各种公司工作过,都有一位超级明星航天员,用无穷无尽的行话印象深刻,但写出的代码却是我以后必须修复的垃圾代码。最重要的是最终结果。你的公司需要一个可用的应用程序,而不是一个无休止的正在进行中的工作,即使他们自己没有意识到这一点。

1

设计模式只是针对一般问题的抽象解决方案。如果人们了解这些模式,那么他们更有可能应用已知的解决方案,更快地解决问题,而不是坐在那里思考:“哎呀,我该怎么让它工作?”

关于框架:如果你曾经在一个超过一个人的团队中工作过(根据你的项目规模来看,似乎并没有),框架可以帮助每个人以相同的方式完成任务,这在团队合作中非常重要,可以提高可维护性和快速将新成员融入团队。


1

简单的问题通常需要简单的解决方案,尽管一些困难的问题非常简单。而复杂的问题则可以通过有组织的方式或“肮脏”的代码来解决。许多人试图组织软件设计,并出现了一些“模式”并得到名称。

我认为模式是有用的词汇,当你向他人传达你的设计意图时,但这并不是你强加于设计中的东西。当您根据需要使您的代码解耦时,可以根据需要应用模式。例如,在您发现自己创建非常复杂的构造函数时,放入生成器模式。

从我的角度来看,将数据层和 UI 层从业务逻辑中解耦,就像是一个很好的设计一样。再次强调,低耦合、 DRY 以及可维护的代码应该是目标,而不是模式。


0

对我来说,这取决于:

  • 应用程序的大小,
  • 要使用的设计模式,
  • 我在架构方面需要投入的时间。

在小型应用程序中,除非它们在扩展或维护应用程序的范围内具有很高的回报率,否则我不太可能使用任何不自然的设计模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接