国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript系列(8) S.O.L.I.D五大原則之里氏替換原則LSP

2024-05-06 14:22:37
字體:
供稿:網(wǎng)友
前言
本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實(shí)現(xiàn)的第3篇,里氏替換原則LSP(The Liskov Substitution Principle )。

英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/
復(fù)制代碼
開閉原則的描述是:

Subtypes must be substitutable for their base types.
派生類型必須可以替換它的基類型。
復(fù)制代碼
在面向?qū)ο缶幊汤?,繼承提供了一個(gè)機(jī)制讓子類和共享基類的代碼,這是通過在基類型里封裝通用的數(shù)據(jù)和行為來實(shí)現(xiàn)的,然后已經(jīng)及類型來聲明更詳細(xì)的子類型,為了應(yīng)用里氏替換原則,繼承子類型需要在語義上等價(jià)于基類型里的期望行為。

為了來更好的理解,請參考如下代碼:
代碼如下:
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";
}
};
}

上述代碼我們定義了一個(gè)Vehicle函數(shù),其構(gòu)造函數(shù)為vehicle對象提供了一些基本的操作,我們來想想如果當(dāng)前函數(shù)當(dāng)前正運(yùn)行在服務(wù)客戶的產(chǎn)品環(huán)境上,如果現(xiàn)在需要添加一個(gè)新的構(gòu)造函數(shù)來實(shí)現(xiàn)加快移動(dòng)的vehicle。思考以后,我們寫出了如下代碼:
代碼如下:
function FastVehicle(my) {
var my = my || {};

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

在瀏覽器的控制臺(tái)我們都測試了,所有的功能都是我們的預(yù)期,沒有問題,F(xiàn)astVehicle的速度增快了3倍,而且繼承他的方法也是按照我們的預(yù)期工作。此后,我們開始部署這個(gè)新版本的類庫到產(chǎn)品環(huán)境上,可是我們卻接到了新的構(gòu)造函數(shù)導(dǎo)致現(xiàn)有的代碼不能支持執(zhí)行了,下面的代碼段揭示了這個(gè)問題:
代碼如下:
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());
};

根據(jù)上面的代碼,我們看到拋出的異常是“The vehicle is still moving!”,這是因?yàn)閷戇@段代碼的作者一直認(rèn)為加速(accelerate)和減速(decelerate)的數(shù)字是一樣的。但FastVehicle的代碼和Vehicle的代碼并不是完全能夠替換掉的。因此,F(xiàn)astVehicle違反了里氏替換原則。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 农安县| 文昌市| 邢台县| 新津县| 固安县| 嵊州市| 旬邑县| 宁明县| 阿坝| 兴义市| 报价| 沙田区| 丹巴县| 九龙城区| 深泽县| 会昌县| 谢通门县| 井研县| 孝义市| 三江| 安多县| 贞丰县| 万全县| 明光市| 贵港市| 舒兰市| 山东| 视频| 景泰县| 岐山县| 苗栗市| 聂荣县| 龙海市| 禹州市| 溧水县| 定日县| 遂宁市| 富蕴县| 临夏县| 日土县| 沂水县|