Atitit 依賴管理之道
Atitit ?依賴管理之道
1. 概念 依賴管理,是指在什么地方以什么形式引入外部代碼。 1
1.1.1. 理解模塊化和依賴管理: 1
1.2. 依賴管理,有三個(gè)層面。?單一職責(zé)原則,協(xié)議對(duì)象引用,依賴邏輯關(guān)系 2
2. 五大數(shù)據(jù)解耦?視圖、數(shù)據(jù)模型、網(wǎng)絡(luò)請(qǐng)求、本地存儲(chǔ)、頁(yè)面跳轉(zhuǎn)五塊代碼 2
3. Maven 2
4. Maven最佳實(shí)踐:管理依賴 1 3
4.1. 最簡(jiǎn)單的依賴 2 4
4.2. 依賴歸類 2 4
4.3. 依賴范圍(scope) 3 4
4.4. 分類器(classifer) 5 4
4.5. 依賴管理(dependencyManagement) 6 4
5. 與其他工具的區(qū)別 4
5.1. Ruby的gem,Node的npm,Python的pip,iOS的CocoaPods都類似,只是配置文件語(yǔ)法和坐標(biāo)命名規(guī)則有些差異。 4
5.2. App store 4
6. 依賴管理工具,設(shè)計(jì) 4
7. 組合層次?fun》jobj,pkg,namespae,modu 5
8. 參考資料 5
?
1.?概念 依賴管理,是指在什么地方以什么形式引入外部代碼。
?
依賴管理為什么重要呢? 因?yàn)?,依賴在哪里,處理代碼就會(huì)那里,而bug也就會(huì)出現(xiàn)在那里。 于是,反過來(lái),為了讓bug集中,就需要讓處理代碼集中,也就需要管理好代碼的依賴關(guān)系。
1.1.1.?理解模塊化和依賴管理:
·?應(yīng)用一般都會(huì)依賴外部庫(kù)(jQuery和AngularJs),這些庫(kù)應(yīng)該使用包管理器處理和更新,而不是手動(dòng)下載。
·?應(yīng)用本身也可以分解成為多個(gè)相互交互的小部分,學(xué)習(xí)封裝代碼的技能,把代碼視作自成一體的組件,學(xué)習(xí)如何設(shè)計(jì)優(yōu)秀的接口,如何安排接口;學(xué)習(xí)如何隱藏?cái)?shù)據(jù),只開放用戶需要的部分。
·?如何解析依賴,避免手動(dòng)維護(hù)一組有序的script標(biāo)簽。
?
1.1.?依賴管理,有三個(gè)層面。?單一職責(zé)原則,協(xié)議對(duì)象引用,依賴邏輯關(guān)系
1?相同的代碼,只出現(xiàn)在一個(gè)地方,也叫單一職責(zé)原則。
2?通過引用協(xié)議對(duì)象,讓依賴關(guān)系中的組件更容易更換。
3?從邏輯上安排依賴關(guān)系,讓依賴關(guān)系更容易被人理解。
單一職責(zé)原則,是最基本的原則。它是代碼模塊化,設(shè)計(jì)模式的根本。
協(xié)議對(duì)象引用,使得功能變更時(shí),只需要在一個(gè)統(tǒng)一的地方做最少的修改。
依賴邏輯關(guān)系,則主要是為了更方便人腦去理解代碼之間的關(guān)系。
?
2.?五大數(shù)據(jù)解耦?視圖、數(shù)據(jù)模型、網(wǎng)絡(luò)請(qǐng)求、本地存儲(chǔ)、頁(yè)面跳轉(zhuǎn)五塊代碼
?
3.?Maven
Atitit maven使用總結(jié)attilax總結(jié).docx
atitit 項(xiàng)目管理 ?package 模塊管理 maven attilax總結(jié).docx
?
Maven誕生于2004年(來(lái)源維基),查詢了下,應(yīng)該是各語(yǔ)言的依賴管理工具中早的。Ruby的gem也是2004年出現(xiàn)的,但gem離完備的依賴管理工具還差些,直到Ruby的bundler出現(xiàn)。Python的pip出現(xiàn)的更晚。
Maven的習(xí)慣是通過 groupID(一般是組織的域名倒寫,遵循Java package的命名習(xí)慣)+ artifactId(庫(kù)本身的名稱) + version(版本)來(lái)定義坐標(biāo),通過xml來(lái)做配置文件,提供了中心倉(cāng)庫(kù)(repo.maven.org)以及本地工具(mvn)。
依賴定義:????repo定義:???
同時(shí),為了避免依賴沖突的問題,Maven的依賴配置提供了exclude配置機(jī)制,用于阻斷部分庫(kù)的傳遞依賴。
?
?
4.?Maven最佳實(shí)踐:管理依賴 1
Maven最佳實(shí)踐:管理依賴 1
4.1.?最簡(jiǎn)單的依賴 24.2.?依賴歸類 24.3.?依賴范圍(scope) 34.4.?分類器(classifer) 54.5.?依賴管理(dependencyManagement) 65.?與其他工具的區(qū)別5.1.?Ruby的gem,Node的npm,Python的pip,iOS的CocoaPods都類似,只是配置文件語(yǔ)法和坐標(biāo)命名規(guī)則有些差異。5.2.?App store6.?依賴管理工具,設(shè)計(jì)
1.要有一種依賴庫(kù)的命名規(guī)則,或者叫坐標(biāo)(Coordinates)的定義規(guī)則,可以通過坐標(biāo)準(zhǔn)確找到依賴的庫(kù)。
2.要有對(duì)應(yīng)的配置文件規(guī)則,來(lái)描述和定義依賴。
3.要有中心倉(cāng)庫(kù)保存這些依賴庫(kù),以及依賴庫(kù)的元數(shù)據(jù)(metadata),供使用方拉取。
4.還需要一個(gè)本地工具去解析這個(gè)配置文件,實(shí)現(xiàn)依賴的拉取。
以上其實(shí)就是各依賴管理工具的核心要素。
?
7.?組合層次?fun》jobj,pkg,namespae,modu
function用于組合代碼塊邏輯,有了object用于組合一組方法,有了package,namespace用于組合一組相關(guān)對(duì)象,但其實(shí)還需要有更高一個(gè)層次的組合定義 —– module,或者叫子項(xiàng)目
?
8.?可選擇性依賴
的另一個(gè)原因,是Android 框架已經(jīng)提供了一種解決方案,但是某個(gè)外部庫(kù)提供的解決方案性能更好。如果用戶本就依賴于該外部庫(kù),或者愿意增加方法數(shù)量以獲得更好的性能,就可以添加可選擇性依賴。
我最近看到的PlacesAutocompleteTextView庫(kù),就屬于這種情況。該庫(kù)使用的內(nèi)部 HTTP 客戶端,既可以是 OkHttpClient,也可以是 HttpURLConnection。通常,前者的性能更好,但是需要添加?OkHttp?作為依賴。 如果用戶不想包含該依賴,可以自動(dòng)從標(biāo)準(zhǔn)庫(kù)回退到 HttpURLConnection。
該類被加載時(shí),會(huì)檢查 OkHttpClient 的完全限定類名是否可用。如果拋出 ClassNotFoundException,我們就知道用戶沒有添加 OkHttp,于是回退到 HttpURLConnection。PlacesHttpClient 是包裝以上兩種實(shí)現(xiàn)方式的公共接口,因此在整個(gè)代碼庫(kù)中,這兩種實(shí)現(xiàn)方式可以交換使用。JSON 解析也采用了同樣的方法,Gson?可選擇性地作為依賴包含在庫(kù)中。
如果性能表現(xiàn)與庫(kù)的大小之間的權(quán)衡系數(shù)很大,這個(gè)方法確實(shí)不錯(cuò)。但是,如果回退的實(shí)現(xiàn)方式比較困難(比如 JSON 解析就是這種情況),筆者建議你先使用外部庫(kù)來(lái)節(jié)省時(shí)間,在后續(xù)的版本中再考慮添加回退實(shí)現(xiàn)。