博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开放封闭原则之模式的黄金法则
阅读量:5879 次
发布时间:2019-06-19

本文共 2631 字,大约阅读时间需要 8 分钟。

开放-封闭原则应该算是这几个原则里面最容易理解的一个。它的宗旨就是:

如果你想扩展或者改变一个程序的功能,可以增加代码,但是不能改变程序的源码。
如果,是对于那些码农来说,最快捷的办法就是改变源码,但是我们面向的是更复杂的项目,我们的目的不是当码农,而是要做一名代码艺术家,想完成一件艺术品一样去完成我们的项目。
拿装饰者模式的例子来说吧。 如果我们想改变onload的函数,即,其他小伙伴,有可能已经在onload上面绑定好,我们可以翻阅onload代码,进行修改。 但是,这个扩展性简直啦!!!
从装饰者模式可以知道,我们可以使用引用装饰进行改动。

var fn = window.onload;var change = function(){    fn();    conosle.log("整洁代码");}window.onload = function(){      change();}

当然,我们也可以使用AOP,进行一个装饰,将原来代码实现的功能完全保留,只在外部添加一些代码。

另外,if语句就是开放封闭原则的死敌.
这个是状态模式中的一个例子。

if(state === "auto"){            console.log("制热");            state = "hot";        }else if(state === "hot"){            console.log("制冷");            state = "cold";        }else if(state === "cold"){            console.log("送风");            state = "wind";        }else if(state === "wind"){            console.log("除湿");            state = "dry";        }else if(state === "dry"){            console.log("自动");            state = "auto";        }

可以从上面的代码看出,如果功能继续发生变化,你必须做的就是改动原来代码的内容,这是极不可取的。 所以依照开放封闭原则,我们需要进行优化,可以修改为这样

//定义状态var Auto= function(button){    this.turn = button;}Auto.prototype.press= function(){    console.log('制热');    this.turn.setState("hot");}var Hot = function(button){    this.turn = button;}Hot.prototype.press= function(){    console.log('制冷');    this.turn.setState("cold");}var Cold = function(button){    this.turn = button;}Cold.prototype.press= function(){    console.log('送风');    this.turn.setState("wind");}var Wind = function(button){    this.turn = button;}Wind.prototype.press= function(){    console.log('除湿');    this.turn.setState("dry");}var Dry = function(button){    this.turn = button;}Dry.prototype.press= function(){    console.log('自动');    this.turn.setState("auto");}//定义状态仓库var Remoter = function(){    this.auto = new Auto(this);    this.hot = new Hot(this);    this.cold = new Cold(this);    this.wind = new Wind(this);    this.dry = new Dry(this);    this.state = "auto";}Remoter.prototype.setState = function(state){    this.state=state;}Remoter.prototype.press = function(){    this[this.state].press();  //执行对应状态的press}Remoter.prototype.init = function(){  //定义执行者    document.querySelector('.switch').addEventListener("click",()=>{        this.press();    },false);}new Remoter.init();  //初始化

即,使用对象的多态性,消除条件分支语句。

处理开放封闭模式的特例

我们都是人,不可能一开始都写出完美的代码。但我们在写程序的时候,要永远的给自己留一手,以便后面改动的需要。 在模板模式里,我们给特殊性留了一条后路, 我们使用钩子方法,通过外部的设置,我们可以得到不用的结果。

当然,我们还可以使用callback函数,执行自己想要做的功能,比如在$.ajax调用的时候,我们添加回调函数,执行自己想要的函数功能,这些都是很棒的实现开放封闭模式原则的办法。

最后一点

这里想说的就是,原则是一份指导,能够指引你的代码结果怎样做,可以达到最优的形式,但,事实上,我们遵不遵守,是完全取决于个人而言的。 而且,有时候我们写程序,真的不必过分追求设计,因为我们是完成用户的交付的需求,如果一味追求设计,无疑增加代码的难度,和实现的时间。所以,一切跟着感觉走,我们写程序不也是凭感觉写的吗?

转载地址:http://jscix.baihongyu.com/

你可能感兴趣的文章
Ansible playbook 使用
查看>>
for/foreach/linq执行效率测试
查看>>
js /jquery停止事件冒泡和阻止浏览器默认事件
查看>>
杭电1698--Just a Hook(线段树, 区间更新)
查看>>
长春理工大学第十四届程序设计竞赛(重现赛)I.Fate Grand Order
查看>>
好作品地址
查看>>
[翻译]Protocol Buffer 基础: C++
查看>>
runloop与线程的关系
查看>>
[Bzoj2246]迷宫探险(概率+DP)
查看>>
[译] 感受 4px 基线网格带来的便利
查看>>
oracle常用函数
查看>>
MYBATIS
查看>>
详解消息队列的设计与使用
查看>>
iOS 项目优化
查看>>
筛选出sql 查询结果中 不包含某个字符
查看>>
8进制与16进制
查看>>
使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误
查看>>
mybatis:Invalid bound statement (not found)
查看>>
电脑中毒的现象
查看>>
django表单操作之django.forms
查看>>