设计模式之开放-封闭原则

继上一篇“拍摄UFO-单一职责原则”后,本文继续讲解《大话设计模式》第四章“设计模式之开放-封闭原则”。喜欢本书请到各大商城购买原书,支持正版。

1 考研失败

时间:3月5日20点 地点:小菜房间 人物:小菜、大鸟

“……多少次迎着冷眼与嘲笑,从没有放弃过心中的理想,一刹那恍惚,若有所失的感觉,不知不觉已变淡心里爱(谁明白我)……”

小菜此时正关在房中坐在桌前发呆,音箱中大声地放着Beyond 乐队的《海阔天空》。此时有人敲门。打开一看,原来是大鸟。

大鸟:“小菜,怎么听这么伤感的歌,声音这么大,我在隔壁都听得清清楚楚。发生什么事了?”

小菜:“今天研究生考试成绩出来了,我的英语成绩离分数线差两分。之前的努力白费了。”

大鸟:“失败也是正常的,考不上的人还是占多数呀,想开些吧,找到好工作未必比读研要差的。”

小菜:“为了考研,我没有做任何求职的准备,所以我们班不少同学都找到工作了,我却才刚开始,前段时间的面试也没消息。”

大鸟:“哈,鱼和熊掌岂能兼得,为一件事而放弃另一些机会,也是在情理之中的事。”

小菜:“说是这么说,我却感觉比较难受,我的同学,有几个其实水平不比我强,他们都签了XX大集团、XX 知名公司,而我现在一无所有,感觉很糟糕。要是当时我也花点时间在简历上,或许现在也不至于这么不爽。”

大鸟:“你考研复习的时候,每天学习多长时间,有没有休息的时候?”

小菜:“差不多十小时吧,其实效率并不高,有不少时候都困得不行,趴在桌上睡觉去了。”

大鸟:“这就对了,你为什么不利用休息的时间考虑一下自己的简历如何写,关心一下有些什么单位在招聘呢?这样也就不至于现在这样唉声叹气。”

小菜:“我感觉找工作会影响复习的精力,所以干脆什么都没找,但其实每天都会有些同学求职应聘的消息传到我耳朵里,我也没有安心复习。”

大鸟:“小菜呀,你其实就是没有搞懂一个设计模式的原则。”

小菜:“哦,是什么原则?”

大鸟:“先不谈这个原则,你想想看,香港澳门的顺利回归,有一个人起了重要的作用,他是谁?”

小菜:“啊,那还用说,是邓小平呀,如果不是他老人家提出的一国两制思想,或许现在还没回归呢。”

大鸟:“小平同志的确是伟大的政治思想家,他的这一创造性想法有什么独到之处?”

小菜:“我想想看,原因主要是在于大陆的社会主义制度不能修改,这一点毋庸置疑,而香港澳门长期在资本主义制度下管理和发展,所以回归时强行修改香港澳门的制度也并不合理,所以用‘一国两制’来解决制度差异造成的矛盾是最合理的办法。”

大鸟:“说得好,社会主义制度不能修改,邓小平在和英国首相撒切尔夫人谈香港问题的时候,如果咬定香港回来必须要实现社会主义制度,那回归就困难重重了,香港老百姓也不答应呀,毕竟这么多年来的殖民统治,突然在整个管理制度上进行彻底变化也是不现实的,那么怎么办?为了回归的大局,增加一种制度又何尝不可,一个国家,两种制度,这在政治上,是伟大的发明哦。在软件设计模式中,这种不能修改,但可以扩展的思想也是最重要的一种设计原则,它就是开放-封闭原则(The Open-Closeed Principle,简称OCP)或叫开-闭原则。”

2 开发-封闭原则

小菜;“开放、封闭,具体怎么解释呢?”

开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

大鸟:“这个原则其实是有两个特征,一个是说‘对于扩展是开放的(Open for extension)``',另一个是说‘对于更改是封闭的(Closed for modification)“’。”

大鸟:“我们在做任何系统的时候,都不要指望系统一开始时需求确定,就再也不会变化,这是不现实也不科学的想法,而既然需求是一定会变化的,那么如何在面对需求的变化时,设计的软件可以相对容易修改,不至于说,新需求一来,就要把整个程序推倒重来。`怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?“,开放-封闭给我们答案。”

小菜:“我明白了,你的意思是说,设计软件要容易维护又不容易出问题的最好的办法,就是多扩展,少修改?”

大鸟:“是的,比如说,我是公司老板,我规定,九点上班,不允许迟到。但有几个公司骨干,老是迟到。如果你是老板你怎么做?”

小菜:“严格执行考勤制度,迟到扣钱。”

大鸟:“你倒是够狠,但实际情况是,有的员工家离公司太远,有的员工每天上午要送小孩子上学,交通一堵就不得不迟到了。”

小菜:“这个,让他们有特殊原因的人打报告,然后允许他们迟到。”

大鸟:“哈,谈何容易,别的不迟到的员工不答应了呀,凭什么他能迟到,我就不能,大家都是工作,我上午也完全可以多睡会再来。”

小菜:“那怎么办?老是迟到的确也不好,但不让迟到也不现实。家的远近,交通是否堵塞也不是可以控制的。”

大鸟:“仔细想想,你会发现,其实迟到不是主要问题,每天保证8小时的工作量是老板最需要的,甚至8小时工作时间也不是主要问题,业绩目标的完成或超额完成才是最重要的指标,于是应该改变管理方式,比如弹性上班工作制,早到早下班,晚到晚下班,或者每人每月允许三次迟到,迟到者当天下班补时间等等,对市场销售人员可能就更加以业绩为标准,工作时间不固定了——这其实就是对工作时间或业绩成效的修改关闭,而对时间制度扩展的开放。”

小菜:“这就需要老板自己很清楚最希望达到的目的是什么,制定的制度才最合理有效。”

大鸟:“对的,用我们古人的理论来说,管理需要中庸之道。”

3 何时应对变化

小菜:“啊,有道理。所以,我们尽量应在设计时,考虑到需求的种种变化,把问题想得全了,就不会因为需求一来,手足无措。”

大鸟:“哪有那么容易,如果什么问题都考虑得到,那不就成了未卜先知,这是不可能的。需求时常会在你想不到的地方出现,让你防不胜防。”

小菜:“那我们应该怎么做?”

大鸟:“开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。”

小菜:“这可能做到吗?我深表怀疑呀,怎么可能写完一个类就再也不改了呢?”

大鸟:“你说得没错,绝对的对修改关闭是不可能的。无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。

小菜:“那还是需要猜测程序可能会发生的变化,猜对了,那是成功,猜错了,那就完全走到另一面去了,把本该简单的设计做得非常复杂,很不划算呀。而且事先猜测,这又是很难做到的。”

大鸟:“你说得没错,我们是很难预先猜测,但我们却可以在发生小变化时,就及早去想办法应对发生更大变化的可能。也就是说,等到变化发生时立即采取行动。正所谓,同一地方,摔第一跤不是你的错,再次在此摔跤就是你的不对了。”

大鸟:“在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。比如,我之前让你写的加法程序,你很快在一个client类中就完成,此时变化还没有发生。然后我让你加一个减法功能,你发现,增加功能需要修改原来这个类,这就违背了今天讲到的‘开放-封闭原则’,于是你就该考虑重构程序,增加一个抽象的运算类,通过一些面向对象的手段,如继承,多态等来隔离具体加法、减法与client耦合,需求依然可以满足,还能应对变化。这时我又要你再加乘除法功能,你就不需要再去更改 client 以及加法减法的类了,而是增加乘法和除法子类就可。即面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是‘开放-封闭原则”的精神所在。”(样例代码见第1章代码无错就是优)

类

大鸟:“当然,并不是什么时候应对变化都是容易的。我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。”

小菜:“这个我能理解,如果加减运算都在很多地方应用了,再考虑抽象、考虑分离,就很困难。”

大鸟:“开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要[ASD]。”

小菜:“哦,我还以为尽量地抽象是好事呢,看来过犹不及呀。”

4 两手准备,并全力以赴

大鸟:“回过头来说,你考研和求职这两件事,考研是你的追求,希望考上研究生,可以更上一层楼,有更大的发展空间和机会。所以考研之前,学习计划是不应该更改,雷打不动的。这就是对修改关闭。但你要知道,你几个月来只埋头学习,就等于放弃了许多好公司来你们学校招聘的机会,这机会的失去是很不值得的。我就不信你一天到晚全在学习,那样效果也不会好。所以你完全可以抽出一点时间,在不影响你复习的前提下,来写写自己的简历,来了解一些招聘大学生的公司的咨讯,这不是很好的事吗?既不影响你考研,又可以增大找到好工作的可能性。为考研万一失败后找工作做好了充分的准备。这就是对扩展开放,对修改关闭的意义。”

小菜:“是的,我就不信,我会比别人差!”

大鸟笑了笑说:“好了,我回房间去了,你也早些休息吧。”站起身走出了小菜的房门,此时Beyond的音乐再次响起,大鸟回头,伸出右手向前摆了个“V”字,说了声:“海阔天空,加油!”

“今天我寒夜里看雪飘过,怀着冷却了的心窝漂远方,风雨里追赶,雾里分不清影踪,天空海阔你与我可会变(谁没在变),……仍然自由自我,永远高唱我歌,走遍千里!”(作者注:本故事和“开放-封闭原则”对应有些牵强,所以在此做一声明。全力以赴当然是必需,两手准备也是灵活处事的表现,希望读者您能对痛苦关闭,对快乐开放。)

原文出处:微信公众号【乐趣课堂】

原文链接:

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论