GoF中有什么设计模式吗?

9

我目前正在准备设计模式考试(将于明天举行...)。在“测试考试”中,我发现了以下问题:

Jim Coplien在邀请演讲期间说,GoF书中甚至没有一个设计模式。您对此有何看法?

因为我没有参加这个特定的讲座(它是上学期的),所以我不知道他可能意味着什么。而且我没有证据证明Jim Coplien确实说过这句话,但我认为这并不重要。

您认为他这个声明可能意味着什么?

(我不确定这个问题是否适合这个论坛,但我想问一下。)


8
这道测试题显然是关于“设计模式”的含义,从引文中猜测,James Coplien 对此与 GoF 有不同的看法。因此,你可以 a) 研究 James Coplien 在设计模式方面的工作(提示:他出版了一本关于 C++ 习惯用法的书籍,影响了 GoF 的著作),或者 b) 通过描述你对设计模式的看法并展示为什么(或为什么不)GoF 的书描述了它们来回答这个测试问题。 - stakx - no longer contributing
1
不是说这会帮到你,Thomas,但在我看来,这个问题毫无意义。无论GoF书中有什么,对世界上数百万程序员来说都非常有用。如果你把它们称为设计模式还是其他什么,这有什么关系呢? - Sameer
stakx建议您采取最佳方法来解决这个问题。关于Coplien的指针,他的模式范例本质上是还原主义的,模式应该被还原为最简单的形式。 - Martin Spamer
这个问题之所以有趣,是因为你被迫讨论它们为什么是设计模式。从教育的角度来看,这有几个不同的目的,包括但不限于:1)让你展示对设计模式的彻底理解;2)迫使你在某种程度上充当魔鬼的代言人,并尝试找到它们不是设计模式的方法。 - user483040
2个回答

42

模式:概念源自亚历山大的工作

GoF声称从Christopher Alexander(正如他们在书的前言中所说)汲取了其模式灵感,后者在设计领域广泛使用了这个术语。对于Alexander来说,一个模式:总是一种模式语言的元素;有助于深刻的人类感受;并且总是几何形态的。至少有一些GoF的模式在这些要点上失败了,而有几个在所有三个要点上都失败了。尽管“模式”是一个中性的英语单词,但GoF工作的文化和历史根源,加上他们对亚历山大灵感的引用,使它受到其祖先基本标准的评判,并且它不足够好。即使他们知道,并表达了他们知道,他们与亚历山大有所分歧,他们仍然选择使用他创造、研究和普及的术语,我认为他们应该对此负责。 (也就是说,他们都是有价值的熟人;我们失去了约翰·弗利西德斯(John Vlissides),我与理查德·赫尔姆(Richard Helm)和埃里克·伽玛(Eric Gamma)在这个问题的更深层次上有过很好的对话。我的与拉尔夫(Ralph)的讨论则不那么有趣,因为他们只停留在工程水平上。)

历史根源

“词语有其含义。当GoF写书时,亚历山大派对‘模式’这一术语的理解并不被很好地理解(也没有被整个软件界所理解),但他们建立在当时通俗的看法上,这种看法基于三个来源:1.埃里克·伽玛的博士论文;2.拉尔夫·约翰逊的框架工作;3.C++惯用语书籍(你可以在GoF书的6.3节中找到这个)。 (哦,Knuth也是一个影响因素。)我继续向作者挑战,但人们喜欢它,他们喜欢人们喜欢它,所以势头持续下去。”
“几年后(2004年12月2日),GoF的一位成员会写信给我,描述他最终理解亚历山大所要传达的信息的‘啊哈’体验。 这与GoF书的内容根本不同:”
“最终通过漫长而曲折的道路,理解了‘生成模式’和分步增长……主要是通过软件的一些有趣的普遍属性(无标度和小世界性)”
“有时候我有点慢,但最终到达了那里……”

GoF模式解决的是偶然而非本质复杂性问题

人们发现它们有用,这是现代编程语言的指控。这些语言没有适当的结构来表达亚历山大认为是模式特征的破碎对称性,而这种对称性是复杂设计固有的(《秩序的本质》,第187页:“一般来说,简化的新古典主义类型的大对称很少有助于事物的生命,因为在世界上的任何复杂整体中,几乎总是存在着复杂的不对称力量——位置、环境和功能等问题——需要打破对称”;同上,第63-4页:“自然也创造了美丽的结构,这些结构由结构保持变换的重复应用所支配。在这方面,我认为有用的是要注意,我所谓的结构保持变换与物理学中所谓的“对称性破缺”非常密切相关。”)。Java在这方面特别糟糕,但其祖先Smalltalk也是如此。C++具有描述局部对称性破裂的丰富功能,但大多数人实际上并不知道如何使用它们。与亚历山大紧密合作并拥有类似CLOS和Scheme等语言的Richard Gabriel表示,他根本不理解GoF模式,因为像CLOS或Scheme这样设计良好的语言不需要它们。我在很大程度上也是这个阵营中的一员。

设计运动

这背后有很多设计理论,可以追溯到设计运动(塔卡拉(“现代主义之后的设计”,1989年)、诺尔、亚历山大、克罗斯(“设计方法论的发展”,1984年)以及其他20世纪80年代的作者)。令我惊讶的是程序员们对这一文献体系了解甚少,以及在设计运动的明显发现面前,计算机科学思维是如何错误的。我们于1993年创立了模式学科(The Hillside Group最初的7个成员),熟悉这些文献的主要主题。PLoP会议演变出一套与这些基础截然不同的文献体系,更加专注于晦涩的知识,而不是亚历山大所追求的“无名质量”。

习语的起源

我介绍C++程序员使用成语的原因是为了让他们在语言阻碍时进行面向对象编程。现在,我们有更强大的方法,如DCI,大大减少了使用成语的必要性。模式仍然适用于域级别 - 这符合亚历山大的愿景。已经写了一些好的模式语言;例如,Hanmer(《容错软件模式》2007年);Eloranta等人(《设计分布式控制系统》2014年),以及Alexander本人指出满足必要标准的组织模式(Coplien和Harrison,2004年)。
战斗虽败,但工作仍在继续
亚历山大和我(以及Richard Gabriel-阅读他的“软件模式”-以及其他人)对这个术语的早期重定向感到失望,这个术语在被GoF重新定义之前在设计中已经得到很好的确立。是的,因为他们称它们为设计模式,在谈论Gang of Four的《设计模式》一书时它们就是设计模式。在设计理论和架构的更广泛方案中,它们不是:它们只是惯用语。即使作者自己说,这就是它们起初的样子。
有几个努力正在进行,旨在将亚历山大的视野恢复到软件界。ScrumPLoP®社区(http://scrumplop.org)非常认真地对待模式的所有亚历山大基础。一位老牌的亚历山大同事Greg Bryant曾为CES做过IT工作,他联系了我,告诉我他正在努力将亚历山大的视野重新引入软件领域,我们即将交换笔记。我相信Dick Gabriel也一直有自己的想法,尽管他和我已经有一段时间没有聊天了。与此同时,我继续直接与亚历山大的同事中野浩联系,他将亚历山大的思想(他直接用《道德经》的术语表达)直接与日本文化的相似之处联系起来。这比试图将其塞入西方文化更加契合。这可能解释了一些难以理解我的说法的挫败感-尽管这并不是一个在知识业务中工作的专业人员的借口。

对抱怨者的鼓励

当然,所有这些基础都是已经发表的辩证法和研究成果,任何愿意花时间去研究的人都可以获得。这不是一个轻松的问题,不能被迅速地驳回,就像在这里所做的那样。我花了20年的时间,并且直接接触到了信息来源。我理解对于普通程序员来说深入了解这些东西很困难,但我建议在否定一个经过充分研究的立场之前,多做一些研究,做好功课。这是StackOverflow的事情。

这个答案相当长。也许可以用标题来组织它。 - Andrew
4
@Cope感谢您的时间和努力。非常好的答案,直接来自信息源头!我学到了很多。再次感谢。 - Thomas Uhrig
5
对于那些认为人生只是一场考试,或者关乎证书的人来说,这句话很有道理。如果你非常重视考试,也许就无法理解我的回答了 :-) - Cope
我对真正的设计模式解决基本复杂性问题的本质感到好奇。您是否有任何关于软件中的示例的参考资料? - Fuhrmanator
1
伟大的模式总是与某个领域相关。软件往往更多地处于工具领域。亚历山大的大部分模式不是关于锤子和木材,而是关于场所——人们吃饭、睡觉和聚会的地方。然而,有些领域是软件密集型的。你可以看看高可用电信系统的模式(https://sites.google.com/a/gertrudandcope.com/info/Publications/Patterns/PLoP95-telecom)。如果你坚持要纯粹的软件,可以参考http://www.laputan.org/pub/sag/coplien-idioms.pdf。这篇文章相当古老,我今天可能会有所不同。 - Cope
显示剩余2条评论

3
按照GoF的定义,这段话充满了设计模式。因此可以推断,Coplien对于设计模式有着不同的定义,或者他误解或歪曲了GoF的定义,或者他认为GoF的定义与GoF的模式不符合。
该问题要求您描述两个定义之间的差异,并提供您喜欢哪个定义的意见。也许您需要理性地表达自己的意见,因为在学术界,您对意见的理由(方法论)比意见本身更重要。

1
我认为重点在于GoF在书的前言中引用了之前的“设计模式”作为他们的灵感来源,而Jim指出他们未能满足他们声称受到启发的定义。所以,是的,有一个定义上的区别,但这不是关于设计模式应该是什么的事后意见差异(一个幼稚的反对),而是对原始工作的重要批评,以及如果我们真正深入探究模式的本质,计算机科学如何进一步发展。这是否正确还有待讨论。 :-) - srm

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