大话设计模式读书笔记(开放-封闭原则)
人物:小菜,大鸟
事件:小菜考研失败,同时因为平时没有关心求职的事,导致也没找到工作,大鸟就说如果懂得了开闭原则,就不会这样了
两手准备,全力以赴
考研:不要一味长时间学习,根据自己的有效学习时间,制定学习计划,然后雷打不动完成,这是对修改关闭
求职:利用学习计划之外的休息时间,写写简历,了解下咨询,这就是对扩展开放
原书作者注:本事件和“开放-封闭原则”对应有些牵强,声明:全力以赴是应该的,两手准备也是灵活的处事表现
开放-封闭原则
开放-封闭原则:是指软件实体(类,模块,函数等)应该可以扩展,但是不可修改。
即对扩展开放,对修改关闭
开闭原则随处可见的例子:
1.一个软件的版本,能在第一个版本出来之后,面对新的需求不断改变,然后又能保持相对的稳定,推出一个又一个的版本
2.一个企业上班,要求工作8小时,每个月可允许3次迟到,迟到者下班补时间,这就是对上班具体时间的修改关闭,对时间制度扩展的开放
何时应对变化
小菜:那我们就应该在设计的时候,将各种需求考虑全面,能够应对之后的种种变化
大鸟:那不就成了未卜先知,需求时常会在想不到的地方出现
大鸟:其实开放封闭的原则是说,设计的时候,尽量让这个类足够好,写好后就不要去修改了,如果有新的需求,增加一些类就完事了,以前的类能不动就不动
小菜:这很难做到一个类写完就完全不改了吧
大鸟:是的,绝对的对修改封闭是不存在的,总会存在无法封闭的变化,既然无法完全封闭,则设计人员必须对于他的设计模块应对那种变化封闭做出选择,猜出可能变化的种类,然后构造抽象隔离变化,有的变化很明显可以提前抽离出来,有的变化如果不明显无法预测,则等变化出现时,立即行动。比如客户端需要做减法运算,则你就可以把减法类抽出来,变成运算类,然后让减法类去继承运算类,这样,就算之后有了加法类,乘法类,直接继承运算类就行,增加了新的代码而不是修改了已有的代码(开放封闭原则的精神所在)