为什么要批判设计模式?设计模式不是OO开发的救星吗?作为“可复用的面向对象”的基础设施,设计模式大大的超越了OO设计原则给予我们的承诺,还记得我们前面的分析吗?OO设计原则并不担保你在设计之前就能避免错误,相反的,你往往需要在屡屡受伤之后,才会明白设计原则的真谛。而设计模式是如此的伟大,他甚至可以帮你提前避免问题,只要你可能遇到的问题,符合设计模式手册中,所描述的那种场景,基本上你就可以直接采用相应的设计方案了。如果找不到正好合适的,你也可以改造自己面对的问题,使得他看起来究就像设计模式手册中描述的那样,然后你就可以放心使用相应的设计方案了。如果你无法在那23个模式中找到合适的答案——你可真是太挑剔了——那么你只能自己想法组合一下那23个中的2~3模式,总之,一切尽在其中
好吧,事实其实没有那么夸张,“GoF”从来没有宣称“设计模式”能够包治百病,更没有说过使用“设计模式”可以预防疾病,他们也的确谦虚的承认,设计模式肯定不止23个。但是,GoF也必须承认的一点就是:“Design Patterns原本是用来指导设计的。大多数时候,都是在实际开发之前完成的。”而且,按照设计模式原本的思维模式,应该把一个系统中的各个类,按照他们所说的一堆模式组织起来,其根本目的,就是不让后来的改动,再去修改以前的代码,所谓OCP原则在设计模式中的实际体现,就是对扩展开放、对修改封闭。
In other words, (in an ideal world...) you should never need to change existing code or classes: All new functionality can be added by adding new subclasses and overriding methods, or by reusing existing code through delegation.
再强调一遍:“设计模式认为,灵活性、可复用性是设计出来的”,而在此之后的发展我们可以看到,新的大师们又偷换了概念,将“设计——实施”的两阶段过程,变成了一个“TDD+重构”的持续改进过程,他们不但提倡改以有的代码,而且要大改特改,持续不断的改,唯一还带着的帽子是:“重构的目标是得到设计模式。”重构真的能以设计模式为目标吗?我们下一篇再讨论。
请允许我先借力打力,利用重构这一新生事物,攻击一下设计模式这个老东西。为什么灵活性、可复用性不能是设计出来的?
软件开发,一个很重要的工作,就是对付“需求变更”,软件工程的办法是尽可能的抵挡、或者有效控制变更的发生。技术人员的目标,则是努力开发出更加灵活的技术,以适应可能的变化。值得一提的是,现在软件开发的管理者,也开始相信,拥抱变化比限制变更,是更为可取的手段了。
更加灵活的技术,更加容易理解,方便描述事实的语言,设计模式等等等等,都是用来适应可能的变化的。对于技术人员来说,如果能够预测可能的变化,并在系统设计期就将其考虑进去,那么变化就成为计划的一部分,注意这句话,因为实际的情况往往是:“计划赶不上变化”。越是自信的技术人员,越是自以为能够预测可能的变化,将变化提前设计进入自己的系统。所以,滥用设计模式的人,往往是那些自以为水平很高的半桶水。而重构这一思路的出现,就是对于设计模式这种“企图预测变化”的否定。事实上,即使是重构,也是危险的,因为从原始状态,到第一个变化发生时,我们能够得到的只有两个状态点,这两个点联成直线所指向的一个方向,并不一定就是变化的方向,因此,重构是一个好办法,而将得到设计模式作为重构的目标,却相当危险。
设计模式背后的思路非常清楚,就是将可能变化纳入设计模式的考虑之中,所以我们看到设计模式的目标“可复用”,其实是一个转了一个弯以后的目标,“在尽可能重用已有代码的前提下,适应变化”。我的观点是:“首先需要满足的不是复用,而是快速修改”,这个问题太大以后有机会再讨论吧。
这篇关于设计模式的批判,我写了好几天,始终感觉难以下手。今天和徐昊讨论,他的话我认为非常有道理:“设计模式的成功,正好证明了OO的失败”。这个思路相当有用,我决定就按这个调子来写。当然,设计模式并不是只有一个,而是有很多很多个,作为一种“专家经验交流的规范描述格式”,设计模式已经非常多了。我们今天也不批判更多的模式,仅仅对GoF的23个模式下手吧。
GoF的23个设计模式,主要分为三类:创建型模式、结构型模式、行为型模式。我们就分别批判这三种模式吧。
创建型模式之所以需要,其实正好证明了OO的失败。因为在OO的思想中,创建对象这种事情,天然就应该是对象自己处理的。一个类在定义时,可以定义一个以上的构造函数,来决定如何得到自己的实例,那为什么还需要把创建对象这个事情,交到别人手里?按照SRP原则,无论出于什么原因,创建自己总是自己的职责吧!所以按照SRP原则,所有的创建型模式都不应该出现,出现了也是错误的。但是为什么我们需要创建型模式呢?先看看GoF的解释:“随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这种情况发生时,重心从对一组固定行为的硬编码,转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的复杂的行为,这样创建有特定行为的对象要求的不仅仅是实例化一个类。”
这样的解释,有一定的道理,但是却局限于“用组合取代继承”这样一个“当年的热门话题”。在我看来,根本的原因在于:“在OO的经典思想中,对象之外的环境是不存在的,因此,所有的对象,都要考虑如何产生自己,如何销毁自己,如何保存自己,总之,自己的事情自己做。”Java的一个巨大进步就在于,销毁自己这件事情,不再强求对象自己去考虑了,因为这种事情过于琐碎,而且复杂易错。但是创建自己这件事情,java依然没有考虑到也不该交给对象自己考虑的。于是设计模式中的种种创建模式被发明出来,用以满足复杂多变的创建需求。这个根本原因同时也解释了为什么单例模式会被发明,按照GoF的解释,是无法说明为什么我们会需要单例模式地。而当我们有了对象环境的概念之后,各种创建自然有“容器环境”来完成,“单例”模式也只需要在环境中配置,有了OO容器之后,所有的创建模式都被一个概念所代替了。在没有这样的概念之前,我们需要用各种模式技巧,来实现“支离破碎”的环境。而在真正的容器环境出现之后,我们就不再需要这些设计模式了。
让我再说一遍:“如果你能够理解为什么现在会出现那么多容器,就能理解设计模式中的创建模式,只不过是用来解决OO概念欠缺的一种不完善的手段了。”
再来看结构型模式,个人认为将“Adapter、Bridge、Composite、Decorator、Facade、Flyweight、Proxy”统统归入结构型模式,是不恰当的。除了Composite模式算是结构模式,Flyweight算是一种“节约内存的技术手段”之外,其他的模式,都属于打破OO静态封装的技巧。我们知道,按照OO的设定,一个类,就是一种类型,它在代码写下的时候,就已经决定了自己的内部数据与外部行为。怎么还能在运行的时候再改变呢?事实证明,这样需求不但存在,而且重要,设计模式之所以被大家欣赏,一个重要的原因,就是他能够帮助程序员部分摆脱“静态封装属性与行为”的限制。
(未完待续)
分享到:
相关推荐
20210509-信达证券-化工行业:敲响轮胎消费时代的钟声!.pdf
【标题解析】:“图片购物搜索淘淘搜:敲响美丽说们的丧钟?”指的是新兴的电商搜索工具“淘淘搜”通过创新的图片购物搜索功能,对以美丽说、蘑菇街为代表的图片购物网站构成潜在的竞争威胁。 【描述概要】:文章...
化工行业:敲响轮胎消费时代的钟声!.pdf
化工行业:敲响轮胎消费时代的钟声!(30页).pdf
化工行业:敲响轮胎消费时代的钟声!(2021)(30页).pdf
提到的“丧钟为谁而鸣”,这句话源自约翰·多恩的诗句,意味着每个人的死亡都是所有人的损失,每个人都在为自己的死亡敲响丧钟。在这里,读者被提醒珍惜当下,因为生命无常,每一刻都可能是最后的时刻。同时,这也...
《地球——我们的家园》是教育学生认识地球独特性和环保重要性的关键课程。这一课时的教学设计旨在通过多种教学策略,使学生对地球的唯一性有深入理解,提高他们对环境保护的认识,培养珍视地球家园的情感。 教学...
1. 教育资源:文档是一个针对六年级下册道德与法治课程的教学设计,具体为第4课“地球——我们的家园”。这表明教育资源正在关注环境教育,旨在培养学生的环保意识。 2. 知识目标:教学设计中包含了三个层次的目标...
本课主题为“地球——我们的家园”,旨在教育六年级学生了解地球作为我们唯一的生存家园的重要性和环境问题的严重性。教学设计围绕两个主要部分展开:一是认识我们生存的家园,二是环境问题对人类生存的警示。 1. *...
这篇读后感主要围绕的是作者在疫情期间阅读《小学生时代》杂志后的感受。书中的内容虽然未具体提及,但从作者的描述中可以看出,这本书或许包含了对疫情的报道、对前线工作者的致敬,以及对生活的反思和希望的探讨。...
"地球——我们的家园 教案(教学设计)" 本教案旨在帮助六年级学生初步养成珍惜地球资源、保护地球环境的行为与习惯,了解地球是目前已知的惟一有生命存在的、适宜人类生存和发展的星球。通过教学,学生能初步归纳...
Window操作系统的诞生成就了微软帝国,同时也造就了PC时代的繁荣,然而如今,以Android和iPhone手机为代表的智能移动设备的发明与互联网云技术的兴起却敲响了PC时代的丧钟!这也预示着移动互联网时代(3G)已经来临。 ...
《医疗废物管理的法律问题探析——以湖南某湖流域为例》 医疗废物管理是公共卫生领域中的重要环节,它涉及到环境保护、公众健康和社会稳定等多个层面。这篇研究主要以湖南某湖流域为背景,深入探讨了我国医疗废物...
然而,以android和iphone手机为代表的智能移动设备的发明却敲响了pc时代的丧钟!移动互联网时代(3g时代)已经来临,谁会成为这些移动设备上的主宰?毫无疑问,它就是android——pc时代的windows! 移动互联网还是...
例如,微软Azure证书问题和亚马逊断电事件都给使用BaaS模式的开发者敲响了警钟,他们需要对数据安全和云服务的可靠性有充分的认识。 从2010年开始,已经有至少40家企业专注于提供BaaS服务。国内也有专注于BaaS服务...
【标题】:“教育培训行业点评:韦博英语倒闭带来的思考——政策与资本夹击下,关注教培行业现金流风险” 在当今社会,教育培训行业扮演着重要的角色,为个人提供提升技能和知识的平台,也为社会发展输送人才。然而...
今年,集团内部连续发生的重大安全事故为全体人员敲响了警钟,强调了安全发展的必要性。全国第五个“安全生产年”和第12个“安全生产月”的到来,进一步凸显了当前阶段对安全工作的紧迫性和重要性。 “安全第一,...
《地球——我们的家园》是部编版六年级下册道德与法治课程中的第四课,旨在教育学生认识地球作为人类生存环境的重要性,理解人与自然之间的相互依存关系,以及环境问题的严重性,培养学生的环保意识和责任意识。...
勒索病毒敲响网络安全警钟.pdf
此外,课文中的另一关键句子“让那已经能够听到脚步声的21世纪,为战争敲响丧钟,让明天的世界真正成为充满阳光、鲜花和爱的人类家园!”则要求学生理解作者对未来和平世界的期盼,通过合作探究,理解这一愿景的深刻...