国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

前端理解依賴注入(控制反轉)

開發 前端
前端的技術的極速發展,對前端同學來說也是一個不小的挑戰,有各種各樣的東西需要學,在開發過程中經常會被后端同學嘲諷,對于前端來講根本就不存在類的概念,很多時候需要把大量的業務代碼堆積在頁面或者組件中,使組件和頁面變得特別的臃腫,一旦業務邏輯復雜的情況下,及時組件化做的很好......
前端的技術的極速發展,對前端同學來說也是一個不小的挑戰,有各種各樣的東西需要學,在開發過程中經常會被后端同學嘲諷,對于前端來講根本就不存在類的概念,很多時候需要把大量的業務代碼堆積在頁面或者組件中,使組件和頁面變得特別的臃腫,一旦業務邏輯復雜的情況下,及時組件化做的很好,仍然避免不了難以維護。

之所以會被后端同學嘲諷,一基礎掌握不扎實,對前端理解不到位,二缺乏面向對象思想,三對業務與基礎傻傻分不清楚。ECMAScript 2015與Type Script的推出,提出了一個很重要的概念就是class(類)的概念。在沒有class之前為了前端能夠有類的概念,一直都是使用構造函數模擬類的概念,通過原型完成繼承。

雖然前端提出了很多概念(模塊化,組件化...),個人覺得面向對象的應用是前端對于項目以及整體架構來講是一件利器,代碼結構好與壞與面向對象有一定的關系,但不是全部。不過我們可以借助計算機領域的一些優秀的編程理念來一定程度上解決這些問題,接下來簡單的說下依賴注入(控制反轉)。

什么是依賴注入

依賴注入一般指控制反轉,是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入,還有一種方式叫依賴查找。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

從上面的描述中可以發現,依賴注入發生在2個或兩個以上類,比如現在有兩個類A與B類,如果A是基礎類存在的話,B做為業務類存在,B則會依賴于A,上面有一句話很重要由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它,個人理解,在B類中使用A類的實例,而不是繼承A類。

對面向對象了解的同學應該了解,面向對象7大原則:

  1. 單一職責
  2. 開閉原則
  3. 里氏替換
  4. 依賴倒置
  5. 接口隔離
  6. 迪米特法則
  7. 組合聚合復用原則

詳細解釋參照:面向對象之七大基本原則(javaScript)

然而使用依賴注入的事為了降低代碼的耦合程度,提高代碼的可拓展性。以上都是一些面向對象的思想,我們參考一下以上最重要的幾個原則,層模塊不應該依賴低層模塊。兩個都應該依賴抽象,抽象不應該依賴具體實現,具體實現應該依賴抽象。

 

  1. // 球隊信息不依賴具體實現 
  2. // 面向接口即面向抽象編程 
  3. class Fruit { 
  4.     constructor(name) { 
  5.         this.name = name 
  6.     } 
  7. class Tropical { 
  8.     // 此處的參數,是teamInfo的一個實例,不直接依賴具體的實例 
  9.     // 面向抽象 
  10.     constructor(fruit) { 
  11.         this.fruit = fruit; 
  12.     } 
  13.     info() { 
  14.         console.log(this.fruit.name
  15.     } 
  16. // 將依賴關系放到此處來管理,控制權也放到此處 
  17. // Tropical和Fruit之間不再有直接依賴 
  18. // 原本直接掌握Fruit控制權的Tropical不再直接依賴 
  19. // 將依賴控制,落在此處(第三方模塊專門管理)即為控制反轉 
  20. var ym = new Tropical(new Fruit('香蕉')) 
  21. ym.info() 
  22. var kobe = new Tropical(new Fruit('菠蘿')) 
  23. kobe.info() 

 

依賴注入的作用

初始化被依賴的模塊

如果不通過依賴注入模式來初始化被依賴的模塊,那么就要依賴模塊自己去初始化了

那么問題來了:依賴模塊就耦合了被依賴模塊的初始化信息了

注入到依賴模塊中

被依賴模塊已經被其他管理器初始化了,那么依賴模塊要怎么獲取這個模塊呢?

有兩種方式:

  • 自己去問
  • 別人主動給你

沒用依賴注入模式的話是1,用了之后就是2

想想,你需要某個東西的時候,你去找別人要,你需要提供別人什么信息?最簡單的就是那個東西叫什么,即你需要提供一個名稱。所以,方式1的問題是:依賴模塊耦合了被依賴模塊的名稱還有那個別人而方式2解決了這個問題,讓依賴模塊只依賴需要的模塊的接口。

依賴注入的優點

依賴注入降低了依賴和被依賴類型間的耦合,在修改被依賴的類型實現時,不需要修改依賴類型的實現,同時,對于依賴類型的測試。依賴注入方式,可以將代碼耦合性降到最低,而且各個模塊拓展不會互相影響,

  1. 實現數據訪問層,也就是前端你的數據請求層
  2. 模塊與接口重構,依賴注入背后的一個核心思想是單一功能原則,這意味著這些對象在系統的任何地方都可以重用。
  3. 隨時增加單元測試,把功能封裝到整個對象里面會導致自動測試困難或者不可能。將模塊和接口與特定對象隔離,以這種方式重構可以執行更先進的單元測試。

Vue中使用

上面寫的例子也只是對依賴注入見單的使用,在項目過程中往往就不是這么簡單了,肯定不會向例子這么簡單,而是很復雜很龐大的一個項目。項目中分為各種各樣的模塊,這種情況又改如何處理?在JavaScript中常見的就是依賴注入。從名字上理解,所謂依賴注入,即組件之間的依賴關系由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關系注入到組件之中。

前端項目中并不像后端一樣,各種各樣的類,雖然前端可以寫class,若是React項目的話,還會好很多,由于其框架使用,全部是基于class但是在vue項目中,又應該怎么具體體現呢?頁面中的業務也是可以作為類存在最終注入到Vue頁面中,最終完成業務邏輯。

 

 

 

 

通過依賴注入到底想要達到到什么效果呢,依賴注入最終想要達成的效果則是,頁面的表現與業務相脫離,從本質上來說,頁面的展現形式與業務邏輯其實沒有根本聯系的。若使用這種依賴注入的形式,則可以輕松的把業務和頁面表現分離開,頁面更加的專注于展示,而所注入的東西則更加的專注于業務的處理。項目也則會變得容易維護。

index.vue

  1. <template> 
  2.   <div> 
  3.     <el-button @click="getList" 
  4.               :loadding="loadding">獲取表格數據</el-button> 
  5.     <ul> 
  6.       <li v-for="(item,index) of list" 
  7.           :key="index">{{item}}</li> 
  8.     </ul> 
  9.   </div> 
  10. </template> 
  11. <script> 
  12. import operation from "@/business/index/Operation.js"
  13. export default { 
  14.   data() { 
  15.     return { 
  16.       list: [], 
  17.       query:{}, 
  18.       loadding:false 
  19.     } 
  20.   }, 
  21.   methods:{ 
  22.     async getList(){ 
  23.       let {query} = this; 
  24.       this.loadding = true
  25.       try{ 
  26.         this.list = await operation.getData.call(this,query); 
  27.       }catch(error){ 
  28.         console.log(error) 
  29.       } 
  30.       this.loadding =false
  31.     } 
  32.   } 
  33. </script> 
  34. <style> 
  35. @import "@/style/index.vue"
  36. </style> 

 

 

 

operations.js

 

  1. import request from "@/api/errorList/index.js"
  2. class Operation { 
  3.     async getData(query){ 
  4.         //  this 指向Vue實例 
  5.         try { 
  6.             let res = await request.getErrorList(query); 
  7.             let {list} = res; 
  8.             //  這里可以對數據進行二次處理 
  9.             //  寫一些其他業務 
  10.             Promise.resolve(list); 
  11.         }catch(error){ 
  12.             Promise.reject(error); 
  13.         } 
  14.     } 
  15. }; 
  16. export default new Operation(); 

 

上面也是在項目中的一個簡單的應用,使頁面表現數據請求與數據處理,業務相脫離,讓項目變得更加容易維護。

控制反轉這里控制權從使用者本身轉移到第三方容器上,而非是轉移到被調用者上,這里需要明確不要疑惑。控制反轉是一種思想,依賴注入是一種設計模式。

依賴注入最終想要達到的目的,首先得為模塊依賴提供抽象的接口,下來應該能夠注冊依賴關系

在注冊這個依賴關系后有地方存儲它,存儲后,我們應該把被依賴的模塊注入依賴模塊中,注入應該保持被傳遞函數的作用域,被傳遞的函數應該能夠接受自定義參數,而不僅僅是依賴描述。

總結

在JavaScript中依賴注入的概念不像Java中被經常提到,主要原因是在js中很容易就實現了這種動態依賴。其實我們大部分人都用過依賴注入,只是我們沒有意識到。即使你不知道這個術語,你可能在你的代碼里用到它百萬次了。希望這篇文章能加深你對它的了解。

需要注意的是,依賴注入只是控制反轉的一種實現方式,正確的依賴管理是每個開發周期中的關鍵過程。JavaScript 生態提供了不同的工具,作為開發者的我們應該挑選最適合自己的工具。

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-04-30 08:50:11

控制反轉Spring依賴注入

2020-07-14 14:59:00

控制反轉依賴注入容器

2023-12-09 14:29:30

編程語言Go

2024-04-18 08:39:57

依賴注入控制反轉WPF

2024-05-10 07:19:46

IOC依賴倒置控制反轉

2011-05-31 10:00:21

Android Spring 依賴注入

2009-06-22 10:20:01

Spring IoC容

2017-08-16 16:00:05

PHPcontainer依賴注入

2022-08-02 07:56:53

反轉依賴反轉控制反轉

2023-07-11 09:14:12

Beanquarkus

2022-12-29 08:54:53

依賴注入JavaScript

2024-03-28 10:37:44

IoC依賴注入依賴查找

2018-03-12 10:02:30

PHP依賴注入

2015-09-02 11:22:36

JavaScript實現思路

2021-09-01 08:58:15

項目 UTFailed

2024-06-12 00:00:01

Java函數式接口

2009-09-29 10:00:40

Spring AOP框

2024-12-30 12:00:00

.NET Core依賴注入屬性注入

2020-08-17 07:59:47

IoC DINestJS

2022-04-11 09:02:18

Swift依賴注
點贊
收藏

51CTO技術棧公眾號

神马久久av| 日本一不卡视频| 日本高清中文字幕二区在线| 无人区在线高清完整免费版 一区二| 欧美全黄视频| 日韩国产在线看| 精品久久久久久久免费人妻| 欧美成人综合| 91在线视频在线| 中文字幕亚洲一区| 一本久道中文无码字幕av| 成人亚洲一区二区| 9191久久久久久久久久久| 欧美 国产 小说 另类| 亚洲第一福利一区| 青青在线视频免费观看| 丝袜诱惑一区二区| 欧美一区二区视频免费观看| 久久久久久久久影视| 日本福利午夜视频在线| 国产亚洲精久久久久久| 国产日韩第一页| 懂色av一区二区在线播放| 日日夜夜精品网站| 可以看av的网站久久看| 久久国产主播精品| 悠悠资源网久久精品| 成人久久久久爱| 亚洲精品一区二区妖精| 国产日韩在线视频| 日韩欧美中文| 成人免费在线视频网址| 91综合久久| 91亚洲国产成人精品性色| 不卡一区2区| 国产精品爽黄69| 全球成人免费直播| 久久九九全国免费精品观看| 国产成+人+综合+亚洲欧美| 亚洲精选中文字幕| 666av成人影院在线观看| 中文国产成人精品| 精品伊人久久| 国产不卡视频在线| 999精品一区| 精品一区二区国产| 久久国产精品第一页| 97在线免费视频观看| 国产一区二区精品在线观看| 熟女熟妇伦久久影院毛片一区二区| 模特精品在线| 无码av天堂一区二区三区| 91小视频免费看| jizzjizzjizz亚洲女| 亚洲精品视频在线| 美国一级片在线免费观看视频| 欧美剧情片在线观看| 超碰97免费在线| 欧美大肚乱孕交hd孕妇| 深夜国产在线播放| 一区二区三区国产视频| 中文字幕亚洲在线观看| 国产欧美一区二区| 日韩精品久久理论片| www.国产在线视频| 亚洲伊人色欲综合网| 黄网站app在线观看| 国产午夜精品一区二区三区| 日韩欧美激情电影| 亚洲自拍在线观看| 久久激五月天综合精品| caoporn超碰97| 欧美丝袜一区二区| 一二三四视频在线中文| 992tv成人免费影院| 一本综合精品| 精品99在线视频| 欧美日韩国产在线播放| 九九色在线视频| 欧美夜福利tv在线| 狠狠久久婷婷| 国产l精品国产亚洲区久久| 色综合久久久久网| 国产第一亚洲| 97神马电影| 久久免费偷拍视频| 美女羞羞视频在线观看| 欧美老女人性视频| 亚洲一区日韩| 99爱视频在线观看| 日韩精品丝袜在线| 99久久久久| 人妻熟妇乱又伦精品视频| 欧美日韩国产影院| 国产乱码精品一区二三赶尸艳谈| 久久久伊人欧美| 国产日韩一区二区三区在线播放| 日韩av一二三四| 制服丝袜中文字幕亚洲| 欧洲精品一区| 400部精品国偷自产在线观看| 偷窥少妇高潮呻吟av久久免费| 久久爱91午夜羞羞| 日本精品久久久久久久| 激情偷乱视频一区二区三区| 真不卡电影网| 日韩有码在线观看| 久久久青草婷婷精品综合日韩| 91大神影片| 色一情一乱一区二区| 精品久久久久久久久久久下田| 日韩jizzz| 亚洲高清免费在线| 亚洲精品第一| 日本精品免费| 精品国产精品自拍| 一区二区视频| 青青青免费在线| 亚洲国产精品久久久久秋霞不卡 | 欧美xxxx18国产| 亚洲综合精品四区| 福利网址在线| 欧美激情奇米色| 久久精品国产一区二区| 偷拍25位美女撒尿视频在线观看| 美女av一区二区三区| 国产一区中文字幕| 黄色成人在线| 91久久久久久久一区二区| 国产精品久久三| 国产成人免费| 懂色av粉嫩av蜜臀av| 欧美精品亚洲二区| 久久中文字幕二区| 成年人视频网站| 欧美成年人视频| 粉嫩在线一区二区三区视频| 激情图片在线观看高清国产| 好吊色欧美一区二区三区四区| 亚洲午夜精品一区二区三区他趣| 天堂资源在线亚洲| 午夜影院网站| 国产欧美日韩综合一区在线观看| 欧美男同性恋视频网站| 久久精品国产第一区二区三区| 四虎影视4hu4虎成人| 国产真人无码作爱视频免费| 青青a在线精品免费观看| 午夜激情久久久| 宅男噜噜噜66一区二区 | 分分操这里只有精品| 麻豆乱码国产一区二区三区 | 欧美网站在线| av观看在线| 久久久久久久久久久99| 欧美自拍大量在线观看| 色综合色狠狠综合色| 日本不卡123| 涩爱av色老久久精品偷偷鲁| 免费高清视频日韩| 超碰97在线人人| 亚洲成色777777女色窝| 91蜜桃视频在线| 日韩欧美自拍| 黄色小说在线播放| 无遮挡又爽又刺激的视频 | 亚洲欧洲色图| 日本高清中文字幕在线| 成人污网站在线观看| 韩剧1988免费观看全集| 欧美综合天天夜夜久久| 丁香六月久久综合狠狠色| 免费久久精品| 成入视频在线观看| 黄色激情网站| 在线观看日本一区| 青青青国产精品一区二区| 日韩欧美自拍偷拍| 中文字幕一区在线观看视频| 亚洲影音一区| 欧美jizz19性欧美| 丁香花视频在线观看| 99re热在线观看| 欧美激情视频一区二区三区| 精品视频9999| 91精品国产综合久久久久| 国产日产欧美一区二区三区| 激情综合在线| 99ri日韩精品视频| 欧美1234区| 中文字幕在线视频观看| 91传媒免费视频| 亚洲v日韩v综合v精品v| 久久精品亚洲一区| 欧美久久久影院| 亚洲一区免费视频| 91网站在线观看视频| 久久综合精品一区| 欧美日本韩国国产| 成人一级片网站|