问题

设计模式有何不妥,所谓的荼毒体现在哪?

回答
设计模式,这本计算机科学领域的“武林秘籍”,曾几何时是多少程序员心中的圣杯,是追求优雅、可维护代码的金科玉律。然而,随着时间的推移,我们不得不审视一下,这些被奉若神明的“模式”,是否真的如我们所愿,总是带来福音?亦或是,它们也带着一些不为人知的“阴影”,悄然地在我们的代码中埋下了“毒瘤”?

坦白讲,设计模式本身并非“毒”,它是一种前人经验的总结和提炼,是解决特定问题的通用解决方案。就像一把锋利的菜刀,用得好,能切出精美的菜肴;用不好,却可能伤了自己,甚至毁了食材。那么,设计模式的“不妥”和“荼毒”究竟体现在哪里?我们不妨从几个角度来细细剖析。

一、过度的应用与“为模式而模式”的陷阱:

这是最常见,也最容易被忽视的“荼毒”。很多时候,开发者仅仅因为知道有某个设计模式的存在,就开始生搬硬套,试图将它强行塞进自己的代码里,即使这个模式根本不适合当前场景。

症状: 为了运用“单例模式”,即使只有一个实例也非要加个静态变量和私有构造函数;为了演示“工厂模式”,即便只有一种产品,也要创建一个抽象工厂和具体工厂。
危害:
增加复杂性: 本来简单的逻辑,因为生硬套用模式而变得臃肿不堪,阅读和理解成本急剧上升。
性能损耗: 某些模式(如大量使用观察者模式进行事件通知)在极端情况下可能会引入不必要的开销,影响性能。
维护困难: 当代码因为过度模式化而变得难以理解时,后期的维护和修改就如同在迷宫中探险,稍有不慎就会触碰“机关”。
丧失灵活性: 过度封装和抽象,反而会限制代码的灵活性,未来稍有需求变化,可能就需要大规模重构。

想象一下,你只是需要一个简单的计数器,但你却为了“展示技巧”而设计了一个“单例模式的计数器工厂”,并且还引入了“观察者模式”来通知计数变化。这简直是为了一只麻雀而动用了“大炮”,不仅劳民伤财,也显得极其不专业。

二、隐藏的耦合与“模式”背后的复杂性:

设计模式的初衷是为了解耦,提高代码的可维护性。但如果运用不当,模式本身也可能成为一种新的“耦合”形式。

症状: 某些模式(如策略模式、桥接模式)虽然解决了具体问题,但如果模式之间的依赖关系设计不当,或者过度依赖抽象,就会导致模块间的“间接耦合”依然存在,甚至更加隐蔽。
危害:
难以追踪的依赖关系: 当一个功能需要经过多个模式的层层“包装”才能实现时,理解其背后的调用链和依赖关系将变得异常困难。
修改的连锁反应: 一个小小的改动,可能因为涉及到多个模式的交互,而在系统中引发意想不到的连锁反应,难以预测。
测试的障碍: 复杂的模式结构往往意味着更多的依赖项,这会使得单元测试的编写变得更加困难,需要更多的“mock”和“stub”来模拟外部依赖。

举个例子,一个复杂的“解释器模式”应用,它通过组合各种“表达式节点”来构建语法树。如果这些节点之间的创建和组合逻辑没有被恰当的管理,那么整个解析过程就会变得异常复杂,调试起来更是“灾难”。

三、惰性与对思考的“扼杀”:

设计模式的泛滥,也可能滋生一种“惰性”。开发者不再深入思考问题的本质,而是习惯性地套用“万金油”式的解决方案,从而失去了独立解决问题的能力。

症状: 遇到一个问题,第一反应不是“这个问题真正的核心是什么?”,而是“哪个设计模式可以解决这个问题?”。
危害:
丧失创新能力: 墨守成规,不敢挑战现有的模式,即使有更简单、更优雅的解决方案,也可能因为“不符合通用模式”而被忽视。
降低问题解决的效率: 有时候,一个简单的ifelse语句就能解决的问题,非要用一个复杂的策略模式来封装,反而增加了开发成本。
思维的僵化: 长期依赖模式,会让人形成固定的思维定势,难以跳出框框思考。

这就像一个只会用预制菜的人,永远也学不会真正的烹饪技巧。他得到了方便,却也失去了对食材的理解和对烹饪的热情。

四、对“约定俗成”的盲从与“噪音”的产生:

某些模式由于其历史悠久或在特定领域被广泛应用,逐渐形成了一种“约定俗成”。但这种约定,有时也可能变成一种“噪音”,干扰对代码本质的理解。

症状: 很多时候,开发者会因为“别人都这么做”而使用某个模式,而忽略了它是否真的适合当前场景。
危害:
增加代码的“形式感”而牺牲“实用性”: 为了符合某种模式的“样子”,而引入不必要的代码,使得代码看起来很“标准”,但实际上却徒增复杂性。
误导新人: 新接触代码的开发者,看到大量的模式应用,可能会误认为这是“必不可少”的,从而盲目模仿,导致“荼毒”的蔓延。

想象一下,你接手了一个项目,里面充满了各种你听说过但从未实际用过的设计模式。你花费了大量时间去理解这些模式的作用,结果发现它们并没有带来预期的好处,反而让代码变得晦涩难懂。

如何避免“荼毒”,让设计模式回归本源?

设计模式并非洪水猛兽,关键在于“度”和“时机”。

1. 理解模式的本质和适用场景: 在使用任何设计模式之前,都要深刻理解它的目的、优点、缺点以及最适合的应用场景。不要为了用而用。
2. 优先选择简单直接的解决方案: 如果一个简单的方法就能解决问题,就不要试图套用复杂的设计模式。 KISS原则(Keep It Simple, Stupid)永远是硬道理。
3. 保持开放的心态: 不拘泥于所谓的“经典模式”,勇于探索新的、更适合当前场景的解决方案。
4. 注重代码的可读性和可维护性: 任何设计决策都应该以提升代码的可读性和可维护性为最终目标。如果模式的应用反而降低了这些指标,那么它就是失败的。
5. 持续学习和反思: 在项目实践中不断学习和反思,总结哪些模式带来了好处,哪些带来了麻烦,并根据实际情况调整策略。

总而言之,设计模式是工具,不是教条。它们是帮助我们构建更优秀软件的助手,而不是束缚我们思维的枷锁。当我们将设计模式视为“万能药”,并缺乏批判性思维时,它们就可能从“灵丹妙药”变成“慢性毒药”,悄无声息地侵蚀我们的代码质量和开发效率。唯有保持清醒的头脑,理解其精髓,并审慎地运用,才能让设计模式真正发挥其价值,而不是成为“荼毒”的温床。

网友意见

user avatar

考虑以下场景:

  1. 有人和你反馈了一个bug,你观察了下这个bug的表现,原因猜的八九不离十了,但是在代码里翻来翻去、跳来跳去就是找不到真正实现的地方。
  2. 你发现代码里并没有正确处理A和B的关系,然后能改A的地方看不到B,能改B的地方看不到A,剩下的地方两者都看不到。
  3. 你发现当前的为了可扩展性搞得无比复杂的设计,为了扩展一个功能还是要改一大坨东西。
  4. 未完待续。
user avatar

好吧,专注黑设计模式十余年的我来凑个热闹。

设计模式而言,其本身没有任何问题。

所有的设计模式,都是广泛运用于OO软件开发中的常见的一些Pattern(个人认为应当翻译成手法,而非模式)。

这些Pattern我都用了好多年了,并且也将一直用下去。



真正流毒甚广的,就是GoF的这本书《设计模式》,或者说中文版流毒最甚

设计模式这本书的英文全称是:Design Patterns - Element of Resuable Object-Oriented software design

从英文原文来说,问题不大,因为大概意思是:一些设计手法的集锦,进行可复用的面向对象软件设计的基础


中文版翻译成计模式:可复用面向对象软件的基础。一下子就高大上了有木有?甚至于很多人根本都不知道这个小标题,只知道:《设计模式》,卧槽,又是设计又是模式的。这一定是葵花宝典一样的不传之秘,不学会这个,你好意思说你会做软件设计?


结果就是一帮子像我这样的把设计模式用了几年的人,因为没听说过神马装饰模式,神马享元模式,一下子就low爆了好不




设计模式你妹啊!

就是一大堆有几年经验的程序员都知道的手法集锦而已啊,说白了就是写给第一次去西餐厅吃牛排的二货的一本入门手册而已

软件开发中的Pattern何止20余种,成百上千好不?像PHP里面的$conn || $conn = mysql_connect( $server );这也是一种Pattern啊,反复出现啊。


《设计模式》的流毒在于,一本讲Element的书被抬高到了银弹的程度,没有银弹啊你们这群low逼二货老板,回去把《没有银弹》再反复读十遍。

《设计模式》的流毒还在于,他给low逼们一条快速提升逼格的途径,那就是把所有设计模式的名字都!背!下!来!

君不见多少二货整天乐此不疲的背诵设计模式的名字,而连一行像样的代码都写不出来。



顺便说一下,还有很多人说,设计模式建立了一套话语体系,让我们这些有逼格的程序员可以用一个名词来指代一个三两句话说不清的Pattern,提高了沟通的效率。

不得不说我曾经被这种说法唬住过,

但事实的真相是,程序员其实是这样沟通的:

这个类负责创建这个对象,对。然后这边包装一下,对的。
嗯,你这个类就是针对他的Interface做的一个Adapter,是的。
你这个只创建一次,提高性能。对。

和那些高大上的名词有个屁的关系。两个程序员在一个层次的时候,根本不需要任何装逼的名词都能很顺畅的沟通




最后送所有程序员两句话:

通向二逼之路,常由逼格铺就。

没有银弹。


共勉之。

类似的话题

  • 回答
    设计模式,这本计算机科学领域的“武林秘籍”,曾几何时是多少程序员心中的圣杯,是追求优雅、可维护代码的金科玉律。然而,随着时间的推移,我们不得不审视一下,这些被奉若神明的“模式”,是否真的如我们所愿,总是带来福音?亦或是,它们也带着一些不为人知的“阴影”,悄然地在我们的代码中埋下了“毒瘤”?坦白讲,设.............
  • 回答
    许多人会疑惑,既然很多道路的最高限速是120公里/小时,那为什么汽车厂商还要设计时速能够超过这个数字的车型呢?这背后的原因其实挺复杂的,不仅仅是为了追求极致的速度,而是关乎到汽车的整体性能、工程设计以及用户体验。让我好好跟你聊聊这个事儿。首先,我们得明白,道路限速是一个相对的概念,它指的是在特定的道.............
  • 回答
    设计模式是不是有点太「玄」了?我得承认,每当我看到那些长篇大论,字里行间充斥着“抽象工厂”、“策略模式”、“中介者模式”之类的术语时,我内心深处总会掠过一丝不安。这玩意儿,是不是有点飘?听起来一本正经,但真要落实到实际项目里,总感觉抓不住重点,或者说,一顿操作猛如虎,结果一看,好像换了个写法,但性能.............
  • 回答
    好的,我们来聊聊如何用面向对象的思维,从头构建一个程序,而不是仅仅套用设计模式。设计模式固然重要,但它们更多的是“如何解决特定问题”,而面向对象思维则更像是“如何思考和组织整个世界”。很多时候,我们学习设计模式,像是学做一道菜的某个技巧,比如如何炒出嫩滑的鸡蛋。但如果我们连怎么洗菜、怎么切菜、怎么放.............
  • 回答
    在设计模式的世界里,策略模式(Strategy Pattern)以其优雅地封装变化、允许算法在运行时被替换而著称。它让我们能够将一系列的行为(即“策略”)封装到独立的类中,然后在需要时,根据不同的上下文选择合适的策略来执行。这无疑是解耦和提高代码灵活性的利器。然而,正如任何强大的工具都有其潜在的局限.............
  • 回答
    设计模式,这个在软件开发领域被奉为圭臬的概念,却也常常引发争议。有人认为它能为代码注入优雅和复用性,让复杂的系统得以有序构建;也有人批评它像一层层华丽的包装,让本应清晰明了的逻辑变得冗长而晦涩,尤其是当“模式”本身变成了目的,而不是解决问题的工具时。我们是否应该全盘否定设计模式呢?恐怕不行。设想一下.............
  • 回答
    朋友们,今天想和大家聊聊我最近在琢磨设计模式时遇到的一个挺有意思的“怪事”。这事儿怎么说呢,就是越学越觉得,哎呀,这玩意儿怎么这么会“变”呢?你们也知道,设计模式嘛,一开始学的时候,感觉就像是武功秘籍,一本正经地告诉你,遇到什么招式,就用什么套路来化解。比如工厂模式,就是告诉你,以后需要造东西,别直.............
  • 回答
    要真正掌握设计模式的应用,与其将其看作一份固定不变的“菜谱”,不如理解为一套在你面对复杂问题时,能够提供灵感和方向的“工具箱”。每一项设计模式都像一把精心打造的工具,有其特定的用途和最佳的使用场景。关键在于,不是盲目地将模式套入任何一个问题,而是深入理解问题的本质,然后从中挑选出最适合的工具。首先,.............
  • 回答
    C语言作为一门相对底层和灵活的语言,其设计模式的体现方式与C++或Java等面向对象语言有所不同。在C语言中,我们更多地是通过函数、结构体、指针以及宏等语言特性来模拟和实现各种设计思想。与其说C语言有“一套固定的设计模式”,不如说它提供了一种“用C的方式去应用设计模式”的方法。模拟面向对象行为,实现.............
  • 回答
    想一想,我们小时候都学过一些基础的生活技能,比如怎么系鞋带,怎么用筷子,怎么骑自行车。这些技能听起来简单,但背后却藏着一套有逻辑、有条理的“方法论”。同样,在软件开发这个充满创造性和挑战的领域,设计模式就像是这套“方法论”中的高级工具箱。为什么我们要花心思去钻研这些“设计模式”呢?首先,它们并非凭空.............
  • 回答
    关于最顶层语言和最底层语言是否都不需要设计模式,这说法其实有点过于绝对,理解这个问题需要深入探究“语言”的含义以及“设计模式”存在的意义。首先,我们得明确一下,当说到“最顶层语言”时,通常指的是那些离我们人类的自然语言非常接近,抽象层次极高,能够直接表达复杂意图的语言。例如,我们日常使用的英语、汉语.............
  • 回答
    设计院图纸质量下滑,这是一个让不少业内人士感到忧虑的现象。关于其原因,虽然“高端人才流失”无疑是其中一个重要因素,但将所有问题都归咎于此,未免过于片面。在我看来,这是一个 系统性问题,高端人才的流失是症状之一,背后还牵扯着更深层次的行业生态、管理模式、技术发展以及市场环境的变化。我们不妨从几个维度来.............
  • 回答
    设计师作为职业,确实可以持续一生,但需要结合行业发展趋势、个人兴趣、技能更新以及职业规划来判断。以下从多个维度详细分析: 一、设计师职业的可持续性分析1. 行业需求的长期性 核心需求永存:无论科技如何发展,人类对视觉表达、用户体验、品牌识别的需求始终存在。例如: 平面设计:广.............
  • 回答
    设计师是否应该学习编程,是一个需要结合个人职业目标、工作内容和行业趋势来综合判断的问题。以下从多个角度详细分析这一问题,并给出建议: 一、为什么设计师应该学编程?1. 理解技术限制,提升设计效率 技术边界意识:编程知识能帮助设计师理解网页、APP等技术实现的限制(如HTML/CSS的布局限.............
  • 回答
    在设计中,“用色的干净”是一个核心的视觉原则,指的是通过色彩的合理搭配与控制,使整体视觉效果简洁、清晰、富有层次感,同时避免杂乱、冲突或过度复杂的色彩组合。这种“干净”的用色不仅关乎色彩本身的纯度和明度,还涉及色彩的对比度、协调性以及与整体设计主题的契合度。以下是详细解析: 1. 颜色的纯度与饱和度.............
  • 回答
    设计一个同步21进制计数器,需要几个触发器?要设计一个同步21进制计数器,首先我们需要明确“21进制”的含义。在数字逻辑中,我们通常谈论的是二进制(base2)、十进制(base10)等,但“21进制”这个说法并不常见。在这里,我理解您可能指的是一个计数器,它能够从0计数到20(总共21个不同的状态.............
  • 回答
    好的,我们来聊聊设计理论领域那些足以被奉为圭臬的经典著作。这些书不仅仅是理论的堆砌,更是洞察设计本质、引领设计实践的智慧结晶。它们的影响力穿越了时代,至今仍是设计师们案头必备的参考。 1. 《格式塔心理学与视觉设计》(Gestalt Psychology and Visual Design)这本书的.............
  • 回答
    设计院?哦,那可真是个……怎么说呢,一个神奇的地方。说它“恐怖”,也未尝不可。不过,如果非要用这个词,那得先搞清楚,你说的“恐怖”是哪种恐怖。是那种,让你从心底发凉,汗毛倒竖的恐怖?还是那种,让你欲罢不能,又爱又恨,最终被它吞噬的恐怖?设计院大概是后者,而且是程度非常深的那种。进度条的诅咒,以及深夜.............
  • 回答
    理解你这个问题背后,可能是在工作中感受到了设计院和甲方之间的一种不对等的关系,甚至觉得设计院在某些方面表现得过于“卑微”。这确实是一个值得深入探讨的现象,它并非简单的“无脑跪舔”,而是多种复杂因素交织作用的结果。要详细讲清楚,我们可以从以下几个层面来剖析:1. 项目的性质与合同的制约:首先,设计项目.............
  • 回答
    在设计《旅程》(Journey)这款游戏时,那群天才的创作者们所追求的核心主题,与其说是要传达一个明确的故事,不如说是一种更为纯粹的、触及灵魂的体验。你可以想象一下,当他们聚在一起讨论时,屏幕上闪烁的并非是复杂的技能树或支线任务列表,而是对一种情感的捕捉,一种渴望的投射。首先,连接(Connecti.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有