Android clean architecting

更多 Android 博文請關注我的博客 http://xuyushi.github.io

本文為翻譯,在原文的基礎上略有改動

http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

Getting Started

當你寫一個軟件時不僅要滿足需求,還要使得系統健壯、易于測試、方便修改。這樣才能滿足需求的變化。寫滿足這些條件的程序通常是很難很復雜的。這就是為什么提出 “the clean architecture”,這可能是在開發任何應用程序時都是一個不錯的辦法


理念很簡單。clean 架構 代表了一組擁有如下特點的實踐

  • 框架獨立
  • 容易測試
  • UI獨立
  • 數據庫獨立
  • 不依賴任何中介


實際情況可能和上圖不一致,圖片只是示意,不是一定要分為4層,我們需要考慮的是依賴規則依賴關系只能是外層依賴內層,內層不應該知道外層的存在

為了更方便的理解,下面是一些名詞解釋

  • Entities: APP 的業務邏輯
  • Use Cases:這些用例從Entities中流入流出,也被稱作Interactors
  • Interface Adapters:這些 adapter 將data 轉換為方便 Use Cases使用的結構。Presenters 和 Controllers 都屬于這里
  • Frameworks and Drivers: 所有 UI 細節、工具、框架

Our Scenario

...(作者例子的視頻展示)

Android Architecture

我們的目標是分離業務邏輯,使得業務邏輯對外部不感知。這樣我們在外部可以獨立對業務代碼進行測試

為了達成這個目標,我們的目的是將項目分為三層,每層都有自己的目的并且獨立于其它層

值得一提的是為了達到每層都獨立,每一層都有自己的數據結構。(在代碼可以看到通過 mapper來進行層與層之間的數據變換)

框架大致是這樣

NOTE: 我沒有使用任何的第三方庫(除了使用 gson 來解析數據,junit,mockito,robolectric 和 espresso 來測試),不使用第三庫的原因是我希望例子能更清晰。不用猶豫使用 ORMs做存儲,或者依賴注入框架,或者任何使你更方便的的工具(記住重復造輪子并不好)。

Presentation Layer

view 和動畫的邏輯的地方。使用了 MVP 模式(可以看這篇 http://xuyushi.github.io/2016/02/28/MVP/ ),你也可以使用 MVC,MVVM。我不會深入講解這部分。fragments、activities都只是 view,沒用業務邏輯, ,渲染的邏輯也在這

其中的Presenters是由** interactors (use cases)**組成的,這些 use cases 在 UI 線程之外的其他線程做一些工作,并且在回調中更新 view

Domain Layer

所有的業務邏輯都在這一層,對于 Android 工程,所有的interactors (use cases)的實現都在這一層。

這一層是純 java 的,沒用 android 的相關依賴,所有的外部交互都是通過接口實現的

Data Layer

所有應用需要的數據都通過這一層的UserRepository(domain 層定義接口的實現)獲取,這里使用了 Repository Pattern 模式,通過 factory 選取不同的 data 的數據源

舉個栗子,當我們需要獲取一個 userID,如果disk 緩存有則使用他,若沒有,則獲取數據,并把數據保存在 disk 緩存中

核心的思想是 data 的獲取對客戶端透明,客戶端無需關注數據的來源,內存,disk,或者網絡。客戶端只需要獲取數據

NOTE:同上個 NOTE,數據庫的實現比較簡單,可以使用第三方庫。 不要重復造輪子

Error Handling

這一直是一個值得討論的話題,我在這里分享一下我的解決方案。我的策略是使用回調,舉個栗子,如果在repository產生事件之后,callback中包含兩個方法,onResponse()onError(),后者把錯誤封裝在 ErrorBundle 類里:這樣帶來一個問題,因為錯誤通過層層傳遞導致代碼可讀性變差。

另一方面,我們可以實現一個 event bus 系統來拋出錯誤,這種解決方法類似于 GOTO 語句。在我的觀點中,當你訂閱了多個事件是你很容易弄混

Testing

對于測試,對于每層我都給出了不同的解決方案

  • Presentation Layer: 使用 android instrumentatioespresso 做集成 和功能測試
  • Domain Layer: 使用JUnitmockito做單元測試
  • Data Layer: 使用Robolectric(因為這層有 Android 的依賴)和 junit、mockito做集成和單元測試。

Show me the code

https://github.com/android10/Android-CleanArchitecture
通過 module 來表示不同的層

  • presentation: Android Module
  • domain: 沒有 依賴Android的 java Module
  • data: Android Module,獲取數據的地方
  • data-test: Data 的測試。

Conclusion

就像Bob大叔所說的,『Architecture is About Intent, not Frameworks』。

確保的應用滿足以下幾點:

  • 易維護 Easy to maintain
  • 易測試 Easy to test.
  • 高聚合Very cohesive.
  • 低耦合 Decoupled.

**我現在根據這個架構為模板做一個開源 APP,完成以后會開源,詳見請見 http://xuyushi.github.io/tags/從零開始/ **

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容