自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

IoC/DIP其實(shí)是一種管理思想

開(kāi)發(fā) 項(xiàng)目管理 后端
關(guān)于IoC的的概念提出來(lái)已經(jīng)很多年了,其被用于一種面象對(duì)像的設(shè)計(jì)。我在這里再簡(jiǎn)單的回顧一下這個(gè)概念。我先談技術(shù),再說(shuō)管理。

關(guān)于IoC的的概念提出來(lái)已經(jīng)很多年了,其被用于一種面象對(duì)像的設(shè)計(jì)。我在這里再簡(jiǎn)單的回顧一下這個(gè)概念。我先談技術(shù),再說(shuō)管理。

話說(shuō),我們有一個(gè)開(kāi)關(guān)要控制一個(gè)燈的開(kāi)和關(guān)這兩個(gè)動(dòng)作,最常見(jiàn)也是最沒(méi)有技術(shù)含量的實(shí)現(xiàn)會(huì)是這個(gè)樣子:

然后,有一天,我們發(fā)現(xiàn)需要對(duì)燈泡擴(kuò)展一下,于是我們做了個(gè)抽象類:

但是,如果有一天,我們發(fā)現(xiàn)這個(gè)開(kāi)關(guān)可能還要控制別的不單單是燈泡的東西,我們就發(fā)現(xiàn)這個(gè)開(kāi)關(guān)耦合了燈泡這種類別,非常不利于我們的擴(kuò)展,于是反轉(zhuǎn)控制出現(xiàn)了。

就像現(xiàn)實(shí)世界一樣,造開(kāi)關(guān)的工廠根本不關(guān)心要控制的東西是什么,它只做一個(gè)開(kāi)關(guān)應(yīng)該做好的事,就是把電接通,把電斷開(kāi)(不管是手動(dòng)的,還是聲控的,還是光控,還是遙控的),而我們的造各種各樣的燈泡(不管是日關(guān)燈,白熾燈)的工廠也不關(guān)心你用什么樣的開(kāi)關(guān),反正我只管把燈的電源接口給做出來(lái),然后,開(kāi)關(guān)廠和電燈廠依賴于一個(gè)標(biāo)準(zhǔn)的通電和斷電的接口。于是產(chǎn)生了IoC控制反轉(zhuǎn),如下圖:

所謂控制反轉(zhuǎn)的意思是,開(kāi)關(guān)從以前的設(shè)備的專用開(kāi)關(guān),轉(zhuǎn)變到了控制電源的開(kāi)關(guān),而以前的設(shè)備要反過(guò)來(lái)依賴于開(kāi)關(guān)廠聲明的電源連接接口。只要符合開(kāi)關(guān)廠定義的電源連接的接口,這個(gè)開(kāi)關(guān)可以控制所有符合這個(gè)電源連接接口的設(shè)備。也就是說(shuō),開(kāi)關(guān)從依賴設(shè)備這種情況,變成了,設(shè)備反過(guò)來(lái)依賴于開(kāi)關(guān)所定義的接口。

只要你看過(guò)我的那篇《面向?qū)ο笤O(shè)計(jì)其實(shí)和面象對(duì)象一點(diǎn)關(guān)系也沒(méi)有》,你就知道這樣的例子在生活中太多見(jiàn)了。比如說(shuō):

1)在交易的過(guò)程中,賣(mài)家向買(mǎi)家賣(mài)東西,一手交錢(qián)一手交貨,所以,基本上來(lái)說(shuō)賣(mài)家和買(mǎi)家必需強(qiáng)耦合(必需見(jiàn)面)。這個(gè)時(shí)候,銀行出來(lái)做擔(dān)保,買(mǎi)家把錢(qián)先墊到銀行,銀行讓賣(mài)家發(fā)貨,買(mǎi)家驗(yàn)貨后,銀行再把錢(qián)打給賣(mài)家。這就是反轉(zhuǎn)控制。買(mǎi)賣(mài)雙方把對(duì)對(duì)方的直接控制,反轉(zhuǎn)到了讓對(duì)方來(lái)依賴一個(gè)標(biāo)準(zhǔn)的交易模型的接口。股票交易也是一樣的,證交所就是買(mǎi)賣(mài)雙方的標(biāo)準(zhǔn)交易模型接口。

2)上面這個(gè)例子,可能還不明顯,再舉一個(gè)例子。海爾公司作為一個(gè)電器制商需要把自己的商品分銷(xiāo)到全國(guó)各地,但是發(fā)現(xiàn),不同的分銷(xiāo)渠道有不同的玩法,于是派出了各種銷(xiāo)售代表玩不同的玩法,隨著渠道越來(lái)越多,發(fā)現(xiàn),每增加一個(gè)渠道就要新增一批人和一個(gè)新的流程,嚴(yán)重耦合并依賴各渠道商的玩法。實(shí)在受不了了,于是制定業(yè)務(wù)標(biāo)準(zhǔn),開(kāi)發(fā)分銷(xiāo)信息化系統(tǒng),只有符合這個(gè)標(biāo)準(zhǔn)的渠道商才能成為海爾的分銷(xiāo)商。讓各個(gè)渠道商反過(guò)來(lái)依賴自己標(biāo)準(zhǔn)。反轉(zhuǎn)了控制,倒置了依賴。

可見(jiàn),控制反轉(zhuǎn)和依賴倒置不單單的一種設(shè)計(jì)模式,反而更是一種管理模式。

在大公司中,有很多很多的團(tuán)隊(duì),這些團(tuán)隊(duì)開(kāi)發(fā)的軟件有很多依賴,跨團(tuán)隊(duì)合作是一件挺麻煩的事情,下面是一些比較真實(shí)的示例:

1)一個(gè)網(wǎng)頁(yè)會(huì)有很多頻道,于是,我們的前端工程師進(jìn)入到各個(gè)頁(yè)面為各種頻道開(kāi)發(fā)他們的頁(yè)面,隨著頻道越來(lái)越多,前端開(kāi)發(fā)工程師的人數(shù)也越來(lái)越多,每增加一個(gè)頻道,就要增加一個(gè)為這個(gè)頻道服務(wù)的前端團(tuán)隊(duì),于是,人數(shù)越來(lái)越多,干成了勞動(dòng)密集型。為什么不反轉(zhuǎn)控制,倒置依賴呢?前端的同學(xué)完全可以開(kāi)發(fā)出各種頁(yè)面的標(biāo)準(zhǔn)組件,布局,模板,以前與后端交互框架,然后,讓后端的同學(xué)反過(guò)來(lái)依賴于前端的標(biāo)準(zhǔn),使用前端的框架,前端的布局,模板,和組件,以向前端接入后端的模塊。

2)一個(gè)平臺(tái)需要接入各種各樣的業(yè)務(wù)系統(tǒng),這些垂直業(yè)務(wù)系統(tǒng)都有自己的賬號(hào)體系,于是這個(gè)平臺(tái)為了要兼這些垂直系統(tǒng)的賬號(hào)體系以做到權(quán)限控制,需要做各個(gè)系統(tǒng)和自己系統(tǒng)中的賬號(hào)映射,并為賬號(hào)和分配出來(lái)的資源設(shè)置各垂直系統(tǒng)的標(biāo)識(shí),還要在自己的代碼中要寫(xiě)很多很多的依賴于各種賬號(hào)體系的代碼。其實(shí),一個(gè)依賴倒置和反轉(zhuǎn)控制就很簡(jiǎn)單。開(kāi)發(fā)一個(gè)權(quán)限體系標(biāo)準(zhǔn),讓接入方的賬號(hào)系統(tǒng)反過(guò)來(lái)依賴并控制這個(gè)標(biāo)準(zhǔn)的權(quán)限系統(tǒng),從而做出一個(gè)干凈的系統(tǒng)。

3)還有一個(gè)云平臺(tái)中的管理模式,一些底層服務(wù)的開(kāi)發(fā)團(tuán)隊(duì)只管開(kāi)發(fā)底層的技術(shù),然后什么也不管了,就交給上層的開(kāi)發(fā)人員,在底層團(tuán)隊(duì)的開(kāi)發(fā)出來(lái)的產(chǎn)品上面開(kāi)發(fā)各種管理這個(gè)底層資源的東西,比如:生產(chǎn)底層資源的業(yè)務(wù),底層資源的控制臺(tái),底層資源的監(jiān)控系統(tǒng)。這個(gè)讓底層團(tuán)隊(duì)只干純技術(shù),不干與底層技術(shù)無(wú)關(guān)的東西,看似很科學(xué),其實(shí)是做錯(cuò)了。因?yàn)?,上層為各個(gè)云資源控制生產(chǎn),開(kāi)發(fā)控制臺(tái)和監(jiān)控的團(tuán)隊(duì),隨著接入的資源的越來(lái)越多,完全干不過(guò)來(lái)了,苦逼得一塌糊涂,因?yàn)榈讓拥馁Y源千差百怪,每接一個(gè)就要開(kāi)發(fā)一堆這個(gè)產(chǎn)品的代碼。這個(gè)時(shí)候依賴倒置和反轉(zhuǎn)控制又可以解決問(wèn)題了。很簡(jiǎn)單,上層為各個(gè)云資源控制生產(chǎn),開(kāi)發(fā)控制臺(tái),和監(jiān)控的團(tuán)隊(duì)?wèi)?yīng)該制定一個(gè)標(biāo)準(zhǔn),讓底層的IaaS云資源開(kāi)發(fā)團(tuán)隊(duì)反過(guò)來(lái)依賴這個(gè)標(biāo)準(zhǔn),統(tǒng)一接入方式,如果開(kāi)發(fā)的云資源不符我的生產(chǎn)控制模型,沒(méi)有控制臺(tái),不把監(jiān)控?cái)?shù)據(jù)喂入我的監(jiān)控系統(tǒng),對(duì)不起,請(qǐng)不要接入我這個(gè)PaaS平臺(tái)。

4)一個(gè)集中式的處理電子商務(wù)中的訂單的流程。各個(gè)垂直業(yè)務(wù)線都需要通過(guò)這個(gè)平臺(tái)來(lái)處理自己的訂單流程,但是垂直業(yè)務(wù)線上的個(gè)性化需求太多。于是,這個(gè)技術(shù)平臺(tái)開(kāi)始出現(xiàn)了黑魔法——“為了害怕改變數(shù)據(jù)庫(kù)表結(jié)構(gòu),不得不在數(shù)據(jù)庫(kù)中預(yù)留一些字段,里面存把業(yè)務(wù)方的個(gè)性化字段存成如JSON這樣的東西”,并為之自豪認(rèn)為可以快速解決業(yè)務(wù)問(wèn)題(WTF)。然而,惡夢(mèng)并沒(méi)就此結(jié)束,管理這個(gè)技術(shù)平臺(tái)的小組開(kāi)始發(fā)現(xiàn),對(duì)來(lái)自各個(gè)業(yè)務(wù)方的需求應(yīng)接不暇,各種變態(tài)需求嚴(yán)重干擾系統(tǒng),各種技術(shù)決定越來(lái)越不好做,導(dǎo)致需求排期排不過(guò)來(lái)。于是,不單單得到了各個(gè)業(yè)務(wù)方的各種抱怨,最可怕的是還有高層老大們壓過(guò)來(lái)的Deadline,加班加點(diǎn),苦逼之極。為什么不用依賴倒置和反轉(zhuǎn)控制的思想呢?開(kāi)發(fā)一個(gè)插件模型、工作流引擎和Pub/Sub系統(tǒng),讓業(yè)務(wù)方的個(gè)性化需求可以以插件的方式插入我的訂單流程中,業(yè)務(wù)方自的數(shù)據(jù)存在自己的庫(kù)中,業(yè)務(wù)邏輯也不要侵入我的系統(tǒng),并可以使用工作流引擎或Pub/Sub的協(xié)義標(biāo)準(zhǔn)來(lái)自己定義工作流的各個(gè)步驟(甚至把工作流引擎的各個(gè)步驟的Decider交給各個(gè)業(yè)務(wù)方自行處理)。讓各個(gè)業(yè)務(wù)方來(lái)依賴于我的標(biāo)準(zhǔn)插件和工作流接口,反轉(zhuǎn)迭控制,讓他們來(lái)控制我的系統(tǒng),依賴倒置,讓他們來(lái)依賴我的標(biāo)準(zhǔn)。(這個(gè)團(tuán)隊(duì)想過(guò)把自己的系統(tǒng)內(nèi)部開(kāi)源出去讓別的團(tuán)隊(duì)也進(jìn)來(lái)參與,可以是可以,但一定要用Linux/Git這種方式,允許出現(xiàn)多個(gè)分支,多個(gè)發(fā)行版。但多個(gè)版本又和業(yè)務(wù)相違背)

5)看過(guò)《SteveY對(duì)Amazon和Google平臺(tái)的吐槽》的人都知道,Amazon內(nèi)部系統(tǒng)的SOA架構(gòu)(這個(gè)SOA架構(gòu)離IBM定義的那個(gè)非常變態(tài)的SOA還有一定距離),但是這基本上都是依賴倒置和控制反轉(zhuǎn)的思路了—— 與其讓我來(lái)幫你實(shí)現(xiàn)你的業(yè)務(wù)邏輯,不如把我的業(yè)務(wù)邏輯開(kāi)放成服務(wù)的方式讓你來(lái)控制

6)再說(shuō)一個(gè)我在Amazon經(jīng)歷的例子。有一個(gè)項(xiàng)目是在給Amazon的各個(gè)商區(qū)(Marketplace)做國(guó)際出口的業(yè)務(wù),我們先把Media類的產(chǎn)品(書(shū),DVD之類的)做國(guó)際出口開(kāi)放,項(xiàng)目不難,就是讓商家同意一個(gè)法律協(xié)議(上傳自己的簽名),然后后臺(tái)小改一下。美國(guó)的,歐洲的做的都沒(méi)有問(wèn)題,物流團(tuán)隊(duì)在出口報(bào)關(guān)單上打的都是Amazon倉(cāng)庫(kù)的地址和商家的簽名(本來(lái)這就是錯(cuò)的,打的應(yīng)該是商家的地址和商家的簽名),但是到了日本,就出了問(wèn)題,因?yàn)槿毡竞jP(guān)即要日文信息,也要商家的英文名和英文地址,而我們的系統(tǒng)里面只有商家的日文信息。本來(lái),這是一個(gè)挺簡(jiǎn)單的事——數(shù)據(jù)庫(kù)里加兩個(gè)字段,在那個(gè)同意條款的網(wǎng)頁(yè)上收集一下商家的英文名和地址,然后把這些信息傳給后面的物流團(tuán)隊(duì)。物流團(tuán)隊(duì)一看這個(gè),發(fā)現(xiàn)搞不了,因?yàn)樗€要傳給倉(cāng)庫(kù),N多的地方都要加這兩個(gè)字段,還要寫(xiě)下各種if (site == JP)這樣的判斷。物流團(tuán)隊(duì)不蠻干,重新設(shè)計(jì)自己的系統(tǒng)。做一個(gè)Document Template的東西,這個(gè)就是那個(gè)那個(gè)要貼在物流盒子上的單子。再也不讓各個(gè)業(yè)務(wù)團(tuán)隊(duì)把那些信息傳過(guò)來(lái),而是把這個(gè)Document Template的東西傳給上面的業(yè)務(wù)方,他們想怎么寫(xiě)就怎么寫(xiě), 寫(xiě)完后,把這個(gè)東西傳回來(lái)。于是,大家依賴了一個(gè)標(biāo)準(zhǔn)的協(xié)議,而不是一其字段。(當(dāng)然,這個(gè)改動(dòng)過(guò)多,為此改了半年多,不過(guò)非常值)

所以說(shuō)啊,在跨團(tuán)隊(duì)的工作中,

  • 如果依賴和控制的東西過(guò)多了,就需要制定標(biāo)準(zhǔn),倒置依賴,反轉(zhuǎn)控制。
  • 控制欲望***不要太強(qiáng),不要想著能干所有的事情,要學(xué)會(huì)控制反轉(zhuǎn)和依賴倒置原則。否則只會(huì)引火燒身。
  • 反轉(zhuǎn)控制和依賴倒置是一種智慧。

原文鏈接:http://coolshell.cn/articles/9949.html

責(zé)任編輯:陳四芳 來(lái)源: 酷殼網(wǎng)
相關(guān)推薦

2015-09-06 08:51:10

2019-05-28 16:25:34

MySQL刪除操作數(shù)據(jù)庫(kù)

2016-08-22 13:22:11

混合云云計(jì)算

2013-03-15 13:33:06

2012-12-07 09:50:29

安全分析大數(shù)據(jù)

2014-06-12 09:20:31

大數(shù)據(jù)醫(yī)療

2020-11-29 18:53:15

Google 麒麟應(yīng)用

2009-03-13 11:34:56

2019-11-04 05:10:15

Wi-Fi網(wǎng)絡(luò)網(wǎng)速

2013-08-08 10:52:38

App平臺(tái)化超級(jí)App開(kāi)放平臺(tái)

2019-01-10 10:02:32

機(jī)器學(xué)習(xí)數(shù)據(jù)人工智能

2018-07-13 10:30:10

云計(jì)算阿里云廠商

2017-11-27 11:14:42

DNS上網(wǎng)IP地址

2015-05-20 14:01:27

程序程序會(huì)做飯

2019-04-11 15:00:11

區(qū)塊鏈比特幣加密貨幣

2015-05-08 10:52:39

2020-01-18 15:10:57

機(jī)器人人工智能系統(tǒng)

2015-03-17 09:41:57

2010-03-24 16:49:26

Python安裝
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)