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