彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 彩世界平台官方网址 2019-11-28 06:06 的文章
当前位置: 彩世界开奖app官网 > 彩世界平台官方网址 > 正文

深入理解JavaScript系列(8):S.O.L.I.D五大原则之里

前言 本章大家要上课的是S.O.L.I.D中国共产党第五次全国代表大会规范JavaScript语言达成的第3篇,里氏替换原则LSP(The Liskov Substitution Principle 卡塔 尔(英语:State of Qatar)。 塞尔维亚语原稿: 复制代码 开闭原则的描述是: Subtypes must be substitutable for their base types. 派生类型必得能够替换它的基类型。 复制代码 在面向对象编制程序里,世袭提供了一个机制让子类和分享基类的代码,那是经过在基类型里封装通用的多少和行事来完毕的,然后已经及项目来声称更详尽的子类型,为了选用里氏替换原则,世襲子类型供给在语义上等价于基类型里的梦想行为。 为了来更加好的理解,请参见如下代码: 复制代码 代码如下: function Vehicle { var my = my || {}; my.speed = 0; my.running = false; this.speed = function() { return my.speed; }; this.start = function() { my.running = true; }; this.stop = function() { my.running = false; }; this.accelerate = function() { my.speed ; }; this.decelerate = function() { my.speed--; }, this.state = function { return "parked"; } else if (my.running && my.speed) { return "moving"; } else if { return "idle"; } }; } 上述代码我们定义了一个Vehicle函数,其布局函数为vehicle对象提供了一些基本的操作,我们来揣摩借使当前函数当前正运营在劳务顾客的制品情形上,假如今后内需加上一个新的结构函数来达成加快移动的vehicle。考虑现在,大家写出了如下代码: 复制代码 代码如下: function 法斯特Vehicle { var my = my || {}; var that = new Vehicle; that.accelerate = function() { my.speed = 3; }; return that; } 在浏览器的调整台大家都测验了,全数的功效都是大家的预料,没异常,FastVehicle的快慢增快了3倍,并且一连他的方法也是依照大家的意料职业。从此以后,大家带头结构那几个新本子的类库到付加物景况上,不过大家却收到了新的布局函数导致现存的代码无法支撑实践了,上边包车型大巴代码段揭露了那个题目: 复制代码 代码如下: var maneuver = function { write; vehicle.start(); write; vehicle.accelerate(); write; write; vehicle.decelerate(); write; if != "idle") { throw "The vehicle is still moving!"; } vehicle.stop(); write; }; 事务所方的代码,大家见到抛出的非常是“The vehicle is still moving!”,那是因为写这段代码的撰稿者一贯感到加快和减速的数字是均等的。但法斯特Vehicle的代码和Vehicle的代码并非一心能够替换掉的。由此,FastVehicle违反了里氏替换原则。 在这里点上,你或者会想:“但,顾客端不能老假定vehicle都是依照这样的家有家规来做”,里氏替换原则的妨碍不是凭仗大家所想的存在延续子类应该在展现里保管更新代码,而是这样的翻新是还是不是能在当前的梦想中拿走贯彻。 上述代码那几个case,消逝那几个不相称的主题材料要求在vehicle类库或许客商端调用代码上海展览中心开一些重复规划,或许两个都要改。 收缩LSP妨碍 那么,大家什么样防止LSP妨碍?不幸的话,并不是一向都是能够变成的。大家那边有多少个政策大家管理这些事情。 左券管理LSP过分妨碍的三个计划是应用合同,协议项目清单有2种样式:实行表明书(executable specifications卡塔 尔(阿拉伯语:قطر‎和错误管理,在实行表明书里,一个详实类库的协议也包含后生可畏组自动化测量检验,而错误管理是在代码里直接管理的,举个例子在放手条件,后置条件,常量检查等,能够从Bertrand米尔er的名著《公约设计》中查看这些技艺。尽管自动化测量试验和协议设计不在本篇文字的界定内,但当大家用的时候作者依旧引入如下内容: 检查接受测量检验驱动开垦(Test-Driven Development)来辅导你代码的规划 设计可选择类库的时候可轻便行使协议设计能力对于你协和要敬爱和完毕的代码,使用合同设计趋向于增多相当多不须要的代码,假让你要调节输入,增加测量检验是特别常有必不可缺的,假诺您是类库笔者,使用合同设计,你要留神不正确的行使办法以至让您的客商使之视作四个测量检验工具。 幸免后续 制止LSP妨碍的其余二个测量检验是:倘诺恐怕的话,尽量不用接二连三,在Gamma的绝响《Design Patterns – Elements of Reusable Object-Orineted Software》中,大家能够见到如下建议: Favor object composition over class inheritance 尽量利用对象组合并不是类继承 复制代码 有个别书里研究了整合比持续好的唯大器晚成成效是静态类型,基于类的言语,与JavaScript相关的三个主题素材是耦合,当使用持续的时候,世襲子类型和他们的基类型耦合在联合了,就是说及项指标转移会耳熏目染到世襲子类型。组合趋向于对象更加小化,更便于想静态和动态语言语言维护。 与行为有关,并非世襲到先天,我们谈谈了和继续上下文在内的里氏替换原则,提醒出JavaScript的面向对象实。可是,里氏替换原则的真面目不是真正和持续有关,而是表现包容性。JavaScript是三个动态语言,二个目的的协议行为不是目的的品类决定的,而是对象希望的法力决定的。里氏替换原则的开头构想是当作一而再一而再的一个法则指南,等价于对象设计中的隐式接口。 举例来讲,让大家来看一下罗Bert C. Martin的绝响《敏捷软件开辟原则、格局与实行》中的叁个矩形类型: 矩形例子 思谋大家有叁个顺序用到上边那样的三个矩形对象: 复制代码 代码如下: var rectangle = { length: 0, width: 0 }; [code] 过后,程序有需求叁个长方形,由王芸方形正是一个长都如出风流倜傥辙的极其矩形,所以大家以为创设一个圆柱形代替矩形。大家加多了length和width属性来合作矩形的宣示,但咱们感到使用品质的getters/setters日常大家可以让length和width保存同步,确定保证注解的是三个星型: [code] var square = {}; { var length = 0, width = 0; // 注意defineProperty情势是262-5版的新特征 Object.defineProperty(square, "length", { get: function() { return length; }, set: function { length = width = value; } }); Object.defineProperty(square, "width", { get: function() { return width; }, set: function { length = width = value; } }); })(); 不幸的是,当大家应用长方形替代矩形实行代码的时候开掘了难题,在那之中三个计量矩形面积的章程如下: 复制代码 代码如下: var g = function { rectangle.length = 3; rectangle.width = 4; write; write; write(rectangle.length * rectangle.width); }; 该措施在调用的时候,结果是16,并非梦想的12,大家的星型square对象违反了LSP原则,square的尺寸和增长幅度属性暗中提示着而不是和矩形百分百相配,但大家并不总是如此明确的授意。扑灭那些题目,大家可以再次设计二个shape对象来落到实处程序,依赖多边形的概念,大家注解rectangle和square,relevant。不管怎么说,大家的指标是要说里氏替换原则并不只是三回九转,而是其余方式。 总括 里氏替换原则发布的意味不是持续的关联,而是其余方法。

减少LSP妨碍

那么,大家什么样制止LSP妨碍?不幸的话,实际不是一贯都以能够完结的。我们那边有多少个政策大家管理这几个事情。

防止后续

幸免LSP妨碍的此外三个测验是:假若只怕的话,尽量不用持续,在Gamma的大手笔《Design Patterns – Elements of Reusable Object-Orineted Software》中,我们能够看看如下建议:

Favor object composition over class inheritance
尽量使用对象组合而不是类继承

稍许书里商量了组合比持续好的天下第一作用是静态类型,基于类的言语(比方,在运营时得以变动行为卡塔尔,与JavaScript相关的一个主题材料是耦合,当使用持续的时候,继承子类型和他们的基类型耦合在生机勃勃道了,便是说及项指标转移会影响到世袭子类型。组合趋势于对象越来越小化,更易于想静态和动态语言语言维护。

前言

本章大家要上课的是S.O.L.I.D中国共产党第五次全国代表大会规格JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle 卡塔 尔(英语:State of Qatar)。

英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/

开闭原则的描述是:

Subtypes must be substitutable for their base types.
派生类型必须可以替换它的基类型。 

在面向对象编制程序里,世袭提供了叁个体制让子类和分享基类的代码,那是经过在基类型里封装通用的数目和表现来落实的,然后已经及项目来声称更详实的子类型,为了利用里氏替换原则,继承子类型须求在语义上等价于基类型里的梦想行为。

为了来更加好的明白,请参照他事他说加以考察如下代码:

function Vehicle(my) {
    var my = my || {};
    my.speed = 0;
    my.running = false;

    this.speed = function() {
        return my.speed;
    };
    this.start = function() {
        my.running = true;
    };
    this.stop = function() {
        my.running = false;
    };
    this.accelerate = function() {
        my.speed  ;
    };
    this.decelerate = function() {
        my.speed--;
    }, this.state = function() {
        if (!my.running) {
            return "parked";
        }
        else if (my.running && my.speed) {
            return "moving";
        }
        else if (my.running) {
            return "idle";
        }
    };
}

上述代码我们定义了三个Vehicle函数,其布局函数为vehicle对象提供了有的主干的操作,我们来思索假设当前函数当前正运转在劳务顾客的成品情状上,尽管明天亟待加上四个新的布局函数来促成加速移动的vehicle。考虑以往,大家写出了如下代码:

function FastVehicle(my) {
    var my = my || {};

    var that = new Vehicle(my);
    that.accelerate = function() {
        my.speed  = 3;
    };
    return that;
}

在浏览器的调节台大家都测量试验了,全体的固守都以大家的预想,没反常,法斯特Vehicle的速度增快了3倍,并且持续他的不二等秘书籍也是根据我们的预想专门的工作。从今以后,我们开首配备那个新本子的类库到成品情形上,可是大家却接到了新的构造函数以致现存的代码无法援助实行了,下面的代码段揭破了这一个标题:

var maneuver = function(vehicle) {
    write(vehicle.state());
    vehicle.start();
    write(vehicle.state());
    vehicle.accelerate();
    write(vehicle.state());
    write(vehicle.speed());
    vehicle.decelerate();
    write(vehicle.speed());
    if (vehicle.state() != "idle") {
        throw "The vehicle is still moving!";
    }
    vehicle.stop();
    write(vehicle.state());
};

依据上面包车型大巴代码,大家看看抛出的百般是“The vehicle is still moving!”,那是因为写这段代码的撰稿者从来以为增加速度(accelerate卡塔 尔(英语:State of Qatar)和减速(decelerate卡塔 尔(阿拉伯语:قطر‎的数字是近似的。但法斯特Vehicle的代码和Vehicle的代码并非一心能够替换掉的。因而,法斯特Vehicle违反了里氏替换原则。 

在此点上,你恐怕会想:“但,客户端无法老假定vehicle都以依据那样的中规中矩来做”,里氏替换原则(LSP)的妨碍(译者注:正是妨碍达成LSP的代码卡塔 尔(英语:State of Qatar)不是依据我们所想的世袭子类应该在表现里保管更新代码,而是那样的创新是不是能在当下的企盼中获得完毕。

上述代码那么些case,清除这一个不匹配的主题素材须求在vehicle类库或然顾客端调用代码上开展一些重新设计,可能两个都要改。

契约(Contracts)

管理LSP过分妨碍的一个国策是行使左券,合同清单有2种样式:履行表明书(executable specifications卡塔 尔(英语:State of Qatar)和错误管理,在试行表明书里,三个详实类库的合同也富含大器晚成组自动化测验,而错误管理是在代码里直接管理的,举例在贮存条件,前置条件,常量检查等,能够从BertrandMiller的大作《协议设计》中查看那一个手艺。尽管自动化测量检验和公约设计不在本篇文字的界定内,但当大家用的时候小编或然引入如下内容:

  1. 反省接纳测量试验驱动开荒(Test-Driven Development卡塔尔来指引你代码的安插性
  2. 安插可选拔类库的时候可轻巧使用左券设计本领

对于你自个儿要敬重和促成的代码,使用协议设计趋势于加多相当多不供给的代码,若是您要调控输入,增加测量检验是不行有不可缺乏的,假如你是类库小编,使用左券设计,你要小心不正确的应用办法以至让您的客商使之视作二个测验工具。

与行为有关,实际不是持续

到后天,大家谈谈了和继承上下文在内的里氏替换原则,提醒出JavaScript的面向对象实。不过,里氏替换原则(LSP卡塔尔国的面目不是确实和延续有关,而是作为宽容性。JavaScript是二个动态语言,四个对象的合同行为不是指标的品种决定的,而是对象希望的功力决定的。里氏替换原则的伊始构想是当做三番若干遍的三个口径指南,等价于对象设计中的隐式接口。

举例来讲,让我们来看一下罗Bert C. 马丁的大小说《敏捷软件开垦原则、形式与实施》中的叁个矩形类型:

矩形例子

思量大家有一个前后相继用到上边这样的一个矩形对象:

var rectangle = {
    length: 0,
    width: 0
};

今后,程序有亟待多少个星型,由江小鱼方形就是一个长(length)和宽(width)都生机勃勃律的极其矩形,所以我们认为创设二个长方形替代矩形。我们加多了length和width属性来协作矩形的注解,但大家感觉使用性质的getters/setters日常我们得以让length和width保存同步,确定保证注明的是贰个正方形:

var square = {};
(function() {
    var length = 0, width = 0;
    // 注意defineProperty方式是262-5版的新特性
    Object.defineProperty(square, "length", {
        get: function() { return length; },
        set: function(value) { length = width = value; }
    });
    Object.defineProperty(square, "width", {
        get: function() { return width; },
        set: function(value) { length = width = value; }
    });
})();

不好的是,当大家应用正方形代替矩形实行代码的时候开掘了难点,当中八个乘除矩形面积的办法如下:

var g = function(rectangle) {
    rectangle.length = 3;
    rectangle.width = 4;
    write(rectangle.length);
    write(rectangle.width);
    write(rectangle.length * rectangle.width);
};

该方法在调用的时候,结果是16,并非可望的12,大家的星型square对象违反了LSP原则,square的长短和宽窄属性暗中表示着实际不是和矩形百分之百相当,但大家并不三番五次如此明显的授意。解决那些标题,大家能够另行设计一个shape对象来落实程序,依附多边形的概念,大家注解rectangle和square,relevant。不管怎么说,大家的目标是要说里氏替换原则并不只是后续,而是其余方法(在那之中的作为足以其它的行事卡塔尔。

同台与引入

正文已联合至目录索引:浓厚理解JavaScript种类

深深掌握JavaScript体系小说,包罗了原创,翻译,转发等各个型的文章,假设对你有用,请推荐支持豆蔻年华把,给五伯写作的引力。


总结

里氏替换原则(LSP卡塔 尔(阿拉伯语:قطر‎表明的情致不是继续的涉嫌,而是此外格局(只要该办法的展现能心得其它的一举一动就能够卡塔尔国。

本文由彩世界开奖app官网发布于彩世界平台官方网址,转载请注明出处:深入理解JavaScript系列(8):S.O.L.I.D五大原则之里

关键词: 原则 之家 里氏 五大