中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

深入理解JavaScript系列(22):S.O.L.I.D五大原則之依賴倒置原則DIP詳解
來源:易賢網 閱讀:1118 次 日期:2015-03-09 17:23:47
溫馨提示:易賢網小編為您整理了“深入理解JavaScript系列(22):S.O.L.I.D五大原則之依賴倒置原則DIP詳解”,方便廣大網友查閱!

這篇文章主要介紹了深入理解JavaScript系列(22):S.O.L.I.D五大原則之依賴倒置原則DIP詳解,本文講解了DIP and JavaScript、何時依賴注入等內容,需要的朋友可以參考下

前言

本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現的第5篇,依賴倒置原則LSP(The Dependency Inversion Principle )。

英文原文:

依賴倒置原則

依賴倒置原則的描述是:

A. High-level modules should not depend on low-level modules. Both should depend on abstractions.

高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象

B. Abstractions should not depend upon details. Details should depend upon abstractions.

抽象不應該依賴于細節,細節應該依賴于抽象

依賴倒置原則的最重要問題就是確保應用程序或框架的主要組件從非重要的底層組件實現細節解耦出來,這將確保程序的最重要的部分不會因為低層次組件的變化修改而受影響。

該原則的第一部分是關于高層模塊和低層模塊之間的耦合方式,在傳統的分成架構中,高層模塊(封裝了程序的核心業務邏輯)總依賴于低層的一些模塊(一些基礎點)。當應用依賴倒置原則的時候,關系就反過來了。和高層模塊依賴于低層模塊不同,依賴倒置是讓低層模塊依賴于高層模塊里定義的接口。舉例來說,如果要給程序進行數據持久化,傳統的設計是核心模塊依賴于一個持久化模塊的API,而根據依賴倒置原則重構以后,則是核心模塊需要定義持久化的API接口,然后持久化的實現實例需要實現核心模塊定義的這個API接口。

該原則的第二部分描述的是抽象和細節之間的正確關系。理解這一部分,通過了解C++語言比較有幫助,因為他的適用性比較明顯。

不像一些靜態類型的語言,C++沒有提供一個語言級別的概念來定義接口,那類定義和類實現之間到底是怎么樣的呢,在C++里,類通過頭文件的形式來定義,其中定義了源文件需要實現的類成員方法和變量。因為所有的變量和私有方法都定義在頭文件里,所以可以用來抽象以便和實現細節之前解耦出來。通過定只定義抽象方法來實現(C++里是抽象基類)接口這個概念用于實現類來實現。

DIP and JavaScript

因為JavaScript是動態語言,所以不需要去為了解耦而抽象。所以抽象不應依賴于細節這個改變在JavaScript里沒有太大的影響,但高層模塊不應依賴于低層模塊卻有很大的影響。

在當靜態類型語言的上下文里討論依賴倒置原則的時候,耦合的概念包括語義(semantic)和物理(physical)兩種。這就是說,如果一個高層模塊依賴于一個低層模塊,也就是不僅耦合了語義接口,也耦合了在底層模塊里定義的物理接口。也就是說高層模塊不僅要從第三方類庫解耦出來,也需要從原生的低層模塊里解耦出來。

為了解釋這一點,想象一個.NET程序可能包含一個非常有用的高層模塊,而該模塊依賴于一個低層的持久化模塊。當作者需要在持久化API里增加一個類似的接口的時候,不管依賴倒置原則有沒有使用,高層模塊在不重新實現這個低層模塊的新接口之前是沒有辦法在其它的程序里得到重用的。

在JavaScript里,依賴倒置原則的適用性僅僅限于高層模塊和低層模塊之間的語義耦合,比如,DIP可以根據需要去增加接口而不是耦合低層模塊定義的隱式接口。

為了來理解這個,我們看一下如下例子:

代碼如下:

$.fn.trackMap = function(options) {

var defaults = {

/* defaults */

};

options = $.extend({}, defaults, options);

var mapOptions = {

center: new google.maps.LatLng(options.latitude,options.longitude),

zoom: 12,

mapTypeId: google.maps.MapTypeId.ROADMAP

},

map = new google.maps.Map(this[0], mapOptions),

pos = new google.maps.LatLng(options.latitude,options.longitude);

var marker = new google.maps.Marker({

position: pos,

title: options.title,

icon: options.icon

});

marker.setMap(map);

options.feed.update(function(latitude, longitude) {

marker.setMap(null);

var newLatLng = new google.maps.LatLng(latitude, longitude);

marker.position = newLatLng;

marker.setMap(map);

map.setCenter(newLatLng);

});

return this;

};

var updater = (function() {

// private properties

return {

update: function(callback) {

updateMap = callback;

}

};

})();

$("#map_canvas").trackMap({

latitude: 35.044640193770725,

longitude: -89.98193264007568,

icon: 'http://bit.ly/zjnGDe',

title: 'Tracking Number: 12345',

feed: updater

});

在上述代碼里,有個小型的JS類庫將一個DIV轉化成Map以便顯示當前跟蹤的位置信息。trackMap函數有2個依賴:第三方的Google Maps API和Location feed。該feed對象的職責是當icon位置更新的時候調用一個callback回調(在初始化的時候提供的)并且傳入緯度latitude和精度longitude。Google Maps API是用來渲染界面的。

feed對象的接口可能按照裝,也可能沒有照裝trackMap函數的要求去設計,事實上,他的角色很簡單,著重在簡單的不同實現,不需要和Google Maps這么依賴。介于trackMap語義上耦合了Google Maps API,如果需要切換不同的地圖提供商的話那就不得不對trackMap函數進行重寫以便可以適配不同的provider。

為了將于Google maps類庫的語義耦合翻轉過來,我們需要重寫設計trackMap函數,以便對一個隱式接口(抽象出地圖提供商provider的接口)進行語義耦合,我們還需要一個適配Google Maps API的一個實現對象,如下是重構后的trackMap函數:

復制代碼 代碼如下:

$.fn.trackMap = function(options) {

var defaults = {

/* defaults */

};

options = $.extend({}, defaults, options);

options.provider.showMap(

this[0],

options.latitude,

options.longitude,

options.icon,

options.title);

options.feed.update(function(latitude, longitude) {

options.provider.updateMap(latitude, longitude);

});

return this;

};

$("#map_canvas").trackMap({

latitude: 35.044640193770725,

longitude: -89.98193264007568,

icon: 'http://bit.ly/zjnGDe',

title: 'Tracking Number: 12345',

feed: updater,

provider: trackMap.googleMapsProvider

});

在該版本里,我們重新設計了trackMap函數以及需要的一個地圖提供商接口,然后將實現的細節挪到了一個單獨的googleMapsProvider組件,該組件可能獨立封裝成一個單獨的JavaScript模塊。如下是我的googleMapsProvider實現:

代碼如下:

trackMap.googleMapsProvider = (function() {

var marker, map;

return {

showMap: function(element, latitude, longitude, icon, title) {

var mapOptions = {

center: new google.maps.LatLng(latitude, longitude),

zoom: 12,

mapTypeId: google.maps.MapTypeId.ROADMAP

},

pos = new google.maps.LatLng(latitude, longitude);

map = new google.maps.Map(element, mapOptions);

marker = new google.maps.Marker({

position: pos,

title: title,

icon: icon

});

marker.setMap(map);

},

updateMap: function(latitude, longitude) {

marker.setMap(null);

var newLatLng = new google.maps.LatLng(latitude,longitude);

marker.position = newLatLng;

marker.setMap(map);

map.setCenter(newLatLng);

}

};

})();

做了上述這些改變以后,trackMap函數將變得非常有彈性了,不必依賴于Google Maps API,相反可以任意替換其它的地圖提供商,那就是說可以按照程序的需求去適配任何地圖提供商。

何時依賴注入?

有點不太相關,其實依賴注入的概念經常和依賴倒置原則混在一起,為了澄清這個不同,我們有必要來解釋一下:

依賴注入是控制反轉的一個特殊形式,反轉的意思一個組件如何獲取它的依賴。依賴注入的意思就是:依賴提供給組件,而不是組件去獲取依賴,意思是創建一個依賴的實例,通過工廠去請求這個依賴,通過Service Locator或組件自身的初始化去請求這個依賴。依賴倒置原則和依賴注入都是關注依賴,并且都是用于反轉。不過,依賴倒置原則沒有關注組件如何獲取依賴,而是只關注高層模塊如何從低層模塊里解耦出來。某種意義上說,依賴倒置原則是控制反轉的另外一種形式,這里反轉的是哪個模塊定義接口(從低層里定義,反轉到高層里定義)。

總結

這是五大原則的最后一篇了,在這5篇文字里我們看到了SOLID如何在JavaScript里實現的,不同的原則在JavaScript里通過不同的角度來說明的。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产女主播一区二区三区| 欧美另类一区| 欧美中文字幕在线| 伊人久久综合| 国产精品萝li| 欧美二区不卡| 免费亚洲电影| 美国成人直播| 欧美ed2k| 老司机免费视频久久| 欧美日韩国产一区二区| 欧美精品久久99| 欧美成人国产| 激情久久久久| 黄色在线一区| 国产精品美女久久| 在线观看日韩欧美| 一区二区欧美在线观看| 老司机aⅴ在线精品导航| 国产一区二区精品久久99| 这里只有视频精品| 欧美日韩精品久久久| 久久国产一区| 欧美激情女人20p| 亚洲视频1区| 美女啪啪无遮挡免费久久网站| 久久精品一本| 国产精品hd| 亚洲三级色网| 亚洲美女视频| 欧美视频亚洲视频| 欧美一区2区视频在线观看| 国产一区在线视频| 篠田优中文在线播放第一区| 亚洲国内欧美| 欧美日韩国产电影| 欧美高清不卡在线| 国产精品国产一区二区| 国产一区在线视频| 亚洲精品视频免费观看| 亚洲欧美韩国| 欧美日韩国产黄| 亚洲国产精品久久人人爱蜜臀| 国产欧美日韩视频| 亚洲男女毛片无遮挡| 欧美激情性爽国产精品17p| 国产亚洲欧美在线| 欧美一区二区三区久久精品| 欧美精品日韩三级| 亚洲人精品午夜在线观看| 欧美在线地址| 欧美美女操人视频| 亚洲精品久久久久久下一站| 免费在线观看日韩欧美| 一区二区在线看| 亚洲视频第一页| 欧美视频不卡中文| 亚洲视频在线一区观看| 性欧美办公室18xxxxhd| 亚洲大片免费看| 国产亚洲综合性久久久影院| 欧美大片第1页| 久久gogo国模裸体人体| 一本色道久久综合精品竹菊| 国内精品久久久久久久影视麻豆 | 在线观看视频欧美| 欧美日韩免费看| 欧美日韩国产精品一区| 久久免费高清视频| 久久riav二区三区| 久久国产夜色精品鲁鲁99| 亚洲女ⅴideoshd黑人| 99精品国产在热久久婷婷| 亚洲成人在线网站| 亚洲国产一区二区a毛片| 在线电影国产精品| 日韩视频免费观看高清完整版| 欧美激情黄色片| 亚洲欧洲av一区二区| 欧美影院成人| 欧美亚洲一区三区| 久久av在线看| 免费观看欧美在线视频的网站| 狂野欧美性猛交xxxx巴西| 久久婷婷国产综合国色天香| 国产欧美日韩另类一区| 欧美精品久久久久a| 欧美日本二区| 国产精品国产三级国产| 国产女精品视频网站免费| 伊人精品成人久久综合软件| 亚洲精品一区二区在线观看| 先锋亚洲精品| 欧美日韩综合另类| 亚洲国产成人久久综合| 一区二区三区视频在线| 久久精品国产成人| 欧美日韩在线直播| 1024国产精品| 久久狠狠亚洲综合| 国产精品国产一区二区| 亚洲国产电影| 久久婷婷激情| 黄色成人在线观看| 欧美在线观看一区二区| 国产精品久久久久av免费| 亚洲三级免费| 欧美精品网站| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产午夜精品理论片a级探花| 亚洲激情网址| 久久一综合视频| 在线日韩精品视频| 欧美国产日韩一二三区| 在线观看日韩精品| 欧美黑人在线播放| 亚洲娇小video精品| 欧美日韩三区| 欧美在线国产| 91久久久久久| 国产日韩欧美一区| 免费欧美在线视频| 一本一本a久久| 国产日韩欧美在线观看| 久热re这里精品视频在线6| **网站欧美大片在线观看| 欧美女主播在线| 久久成人av少妇免费| 亚洲第一精品影视| 国产精品久久久久久久久久妞妞| 亚洲欧美日韩成人| 在线播放一区| 国产美女精品视频| 国产精品jizz在线观看美国 | 国产亚洲精品久久久久久| 久久午夜精品一区二区| 亚洲婷婷在线| 9色国产精品| 1024欧美极品| 亚洲成人在线网站| 在线精品福利| 亚洲高清网站| 99精品久久久| 一区二区免费在线观看| 亚洲日本欧美天堂| 欧美日韩在线一区| 欧美精品一区二区三区视频| 久久综合色88| 欧美日本在线| 国产精品亚洲综合天堂夜夜| 欧美日韩一区在线播放| 欧美偷拍一区二区| 国产精品激情av在线播放| 欧美性事免费在线观看| 国产农村妇女毛片精品久久麻豆| 国产精品免费看片| 国产亚洲美州欧州综合国| 国产亚洲精品自拍| 91久久久久久国产精品| 一区二区欧美国产| 欧美中文字幕在线观看| 欧美成人乱码一区二区三区| 欧美午夜在线观看| 国产一区自拍视频| 一区二区三区视频在线看| 在线一区观看| 久久久久久9| 国产精品青草久久| 亚洲精品乱码久久久久久| 亚洲字幕在线观看| 欧美久久久久| 在线观看视频免费一区二区三区| 亚洲美女性视频| 欧美1区2区视频| 国内自拍视频一区二区三区| 亚洲欧美日本另类| 亚洲女爱视频在线| 欧美日韩一区在线播放| 在线观看三级视频欧美| 久久久久国产精品人| 国产三级精品在线不卡| 亚洲欧美日韩国产成人| 国产精品久久久久久妇女6080| 亚洲电影免费| 久久先锋影音av| 亚洲激情二区| 国产精品欧美一区喷水 | 国产欧美日韩精品a在线观看| 99成人在线| 夜夜嗨av一区二区三区网站四季av| 国产一区二区三区久久悠悠色av| 欧美精品一区在线发布| 久久av二区| 亚洲天堂成人| 亚洲精品国产无天堂网2021| 一区二区三区四区国产精品| 一本色道久久综合精品竹菊| 久久9热精品视频| 欧美日韩国产成人| 国产自产2019最新不卡|