在春天我種下了Clean Architecture,這是我秋天的收獲

什么是Clean Architecture

The Clean Architecture是《Clean Code》作者Uncle Bob提出的一種架構(gòu)。

開發(fā)高質(zhì)量的軟件一直是復(fù)雜而又困難的绵载。因?yàn)楦哔|(zhì)量的軟件設(shè)計(jì)不僅僅要滿足當(dāng)下的需求介陶,更需要強(qiáng)壯玉雾、易于測(cè)試跨算、強(qiáng)延展性。

The Clean Architecture正是一個(gè)滿足高質(zhì)量軟件設(shè)計(jì)的架構(gòu)鹉究。其主旨為

?? 框架的獨(dú)立

?? 易于測(cè)試

?? UI的獨(dú)立

?? 數(shù)據(jù)源的獨(dú)立

?? 業(yè)務(wù)的獨(dú)立

這篇文章關(guān)于The Clean Architecture的介紹到此宇立,具體內(nèi)容可以自行查詢。

我的實(shí)踐

我為什么應(yīng)用實(shí)踐The Clean Architecture

1.? 因?yàn)槲铱吹疥P(guān)于Clean Architecture的文章的時(shí)候項(xiàng)目青黃不接坊饶,我想搞事情泄伪。

2.? 我被它能干的事兒吸引

3.? 我所經(jīng)歷的Android程序設(shè)計(jì)混亂得令我感到絕望(后來我稱采用架構(gòu)之前的Android開發(fā)為黑暗時(shí)代)

4.? 當(dāng)時(shí)并沒有真正理解到它的核心,但我是一個(gè)先做起來的人

我怎么把The Clean Architecture這個(gè)普適的思想用在Android開發(fā)上

在進(jìn)行開發(fā)時(shí)我主要參考了

?文章Architecting Android...The clean way?

? 項(xiàng)目Android-CleanArchitecture

核心使用到的工具包含

?? Retrofit

?? RxJava

?? Dagger


如上圖匿级,整個(gè)項(xiàng)目最終分為了6個(gè)Module:

?? cleanarchitecture:這個(gè)Module是一個(gè)Java Library蟋滴。包含實(shí)現(xiàn)The Clean Architecture的基本類染厅,如Executer抽象,Presenter抽象等津函。

?? domain:這個(gè)Module是Java Library肖粮。包含了核心業(yè)務(wù)的抽象。

?? data:這個(gè)Module是Android Library尔苦。包含了核心業(yè)務(wù)相關(guān)的實(shí)現(xiàn)涩馆。

?? framework:這個(gè)Module是Android Library。是上拉更多下拉刷新允坚、JSON等通用組件的抽象實(shí)現(xiàn)魂那。

?? customer:這個(gè)Module是Android App。是這個(gè)項(xiàng)目的其中一個(gè)APP

?? merchant:這個(gè)Module是Android App稠项。是這個(gè)項(xiàng)目的另一個(gè)APP

結(jié)果怎么樣

我可以負(fù)責(zé)任的說:“效果拔群”涯雅。從幾個(gè)方面來說:

1.? 業(yè)務(wù)抽象。公司的核心業(yè)務(wù)完全抽象到了Domain展运。各個(gè)App基于核心業(yè)務(wù)進(jìn)行應(yīng)用業(yè)務(wù)的演繹活逆。

2.? 結(jié)構(gòu)層次清晰。整體的結(jié)構(gòu)非常清晰拗胜。上帝的歸上帝蔗候,凱撒的歸凱撒。

3.? 抽象與實(shí)現(xiàn)分離埂软。data與domain分離锈遥,想用file用file,想用cloud用cloud仰美,想用db用db

我獲得了什么

經(jīng)過刺激又新奇的實(shí)踐迷殿。這個(gè)架構(gòu)帶來了上文提到的三個(gè)好結(jié)果。其中第一個(gè)“業(yè)務(wù)抽象”讓我想到了一些不同的東西咖杂。

關(guān)注點(diǎn)

從前

從前開發(fā)關(guān)注點(diǎn)放在當(dāng)前sprint的需求庆寺、業(yè)務(wù)上。很多開發(fā)者只知道當(dāng)前要做的诉字,頂多了解未來也許要做什么懦尝,這個(gè)需求也許來自于客戶,也許來自于產(chǎn)品經(jīng)理壤圃。那么對(duì)于這些開發(fā)者來說陵霉,特別關(guān)注當(dāng)前的需求、當(dāng)前的業(yè)務(wù)無可厚非伍绳。

現(xiàn)在

我的關(guān)注點(diǎn)產(chǎn)生了轉(zhuǎn)變踊挠。我的關(guān)注點(diǎn)不再是當(dāng)前需求,當(dāng)前業(yè)務(wù),甚至不再是項(xiàng)目的需求項(xiàng)目的業(yè)務(wù)效床。而是核心領(lǐng)域睹酌。

什么是公司的核心領(lǐng)域?例如對(duì)于淘寶網(wǎng)來說剩檀,淘寶賣的是商品憋沿;淘寶買的也是商品;天貓賣的是商品沪猴;天貓買的也是商品辐啄;閑魚賣的也是商品;閑魚買的也是商品运嗜;商品是包含于核心領(lǐng)域壶辜。同樣的,訂單也是洗出,用戶也是士复。

若在設(shè)計(jì)系統(tǒng)時(shí),把公司核心領(lǐng)域抽象到系統(tǒng)內(nèi)翩活。各個(gè)業(yè)務(wù)系統(tǒng)(app)只需要在需求到來時(shí)各自演繹。還是以淘寶為例便贵,無論是買家還是賣家菠镇,無論天貓、淘寶還是閑魚承璃,商品就是核心領(lǐng)域的商品利耍,只是在各個(gè)業(yè)務(wù)系統(tǒng)進(jìn)行不同的展示和操作。這里說道操作盔粹,操作也是包含于核心領(lǐng)域的隘梨,如“買家取消訂單”操作。

我們的關(guān)注點(diǎn)從某個(gè)業(yè)務(wù)系統(tǒng)(app)的內(nèi)容舷嗡,轉(zhuǎn)移到了公司的業(yè)務(wù)轴猎。這樣,我們掌握了公司到底擁有什么进萄,到底會(huì)產(chǎn)出什么捻脖。只要不改動(dòng)公司的核心領(lǐng)域,無論產(chǎn)品經(jīng)理如何演繹中鼠,無論如何用戶要求多查看一些什么可婶,都在我們的掌控范圍之內(nèi)。

項(xiàng)目積累

成功的政治家必定需要積累政治資本援雇,成功的銷售人員必定需要積累客戶矛渴,在公司供職的開發(fā)者當(dāng)然也需要有所積累。一個(gè)項(xiàng)目除了做業(yè)務(wù)外也需要有積累惫搏。

之前我的迷思

有很長(zhǎng)一段時(shí)間我們嘗試抽象各種widget具温,json什么的蚕涤,做一套我當(dāng)時(shí)叫做“Android基礎(chǔ)設(shè)施”的東西,作為公司所有Android項(xiàng)目的基石桂躏。后來我們放棄了钻趋,隨著新的ui設(shè)計(jì)思想的誕生,新的Android SDK的發(fā)布剂习,一切都變得困難而無意義蛮位,甚至怨聲載道。

我不知道可以積累什么才能具有核心競(jìng)爭(zhēng)力鳞绕。

積累核心領(lǐng)域

我們可以積累核心領(lǐng)域失仁。

我們應(yīng)該不斷的積累核心領(lǐng)域,不斷的更新同步核心領(lǐng)域们何。以我對(duì)于后端開發(fā)有限的了解萄焦,他們就是在不斷的做這件事,甚至是定義核心領(lǐng)域冤竹,那么移動(dòng)端為什么不能做這個(gè)積累呢拂封?為什么移動(dòng)端一定要被后端牽著鼻子走呢?鹦蠕。

?? 如果我們面向核心領(lǐng)域編程(我們姑且把積累公司核心領(lǐng)域叫做面向核心領(lǐng)域編程)冒签,那么后端如何實(shí)現(xiàn),對(duì)移動(dòng)端來說不再起決定作用钟病,只是在于移動(dòng)開發(fā)演繹時(shí)如何把后端實(shí)現(xiàn)的領(lǐng)域接入移動(dòng)端抽象的領(lǐng)域萧恕,因?yàn)楹蠖艘矡o法走出領(lǐng)域的范圍。

?? 如果我們面向核心領(lǐng)域編程肠阱,我們可以預(yù)見需求票唆,在需求實(shí)際提出之前就做好準(zhǔn)備。

?? 如果我們面向核心領(lǐng)域編程屹徘,我們可以獨(dú)立的對(duì)核心領(lǐng)域進(jìn)行高強(qiáng)度測(cè)試走趋。

?? 如果我們面向核心領(lǐng)域編程,我們可以快速的開發(fā)出新的業(yè)務(wù)系統(tǒng)(就算是開發(fā)個(gè)咸蛋也逃不出這個(gè)核心領(lǐng)域)

個(gè)人要求的改變

為了實(shí)現(xiàn)這個(gè)積累缘回,對(duì)于移動(dòng)端開發(fā)者有了新的(我認(rèn)為一直存在)的要求

1.? 充分了解公司背景與所涉

2.? 充分了解核心領(lǐng)域的范圍

3.? 要想做測(cè)試覆蓋一樣去覆蓋核心領(lǐng)域的各個(gè)分支

4.? 把目光放的比以往任何時(shí)候都要遠(yuǎn)與廣

開發(fā)流程的改變

為了實(shí)現(xiàn)這個(gè)積累吆视,開發(fā)流程也應(yīng)該有改變

1.? 應(yīng)該自內(nèi)而外的開發(fā)。先定義核心領(lǐng)域酥宴,再在其上進(jìn)行演繹啦吧。

2.? 核心領(lǐng)域不應(yīng)該依賴于業(yè)務(wù)系統(tǒng)的任何部分,其至于公司實(shí)際業(yè)務(wù)有關(guān)拙寡。

3.? 應(yīng)該對(duì)于核心領(lǐng)域進(jìn)行高強(qiáng)度的測(cè)試授滓。

4.? UI開發(fā),工具開發(fā)等等都應(yīng)該服務(wù)于核心領(lǐng)域。甚至基于核心領(lǐng)域有預(yù)見行的進(jìn)行UI開發(fā)般堆。

我不是一個(gè)人

我發(fā)現(xiàn)這樣想的人并不只有我在孝。也許這樣的想法是每個(gè)真正理解The Clean Architecture的人都可能會(huì)認(rèn)同的。甚至有人認(rèn)為這個(gè)就是Domain Driven Design淮摔。提供一個(gè)視頻私沮,這是一個(gè)項(xiàng)目lead關(guān)于Domain Driven Design在Android開發(fā)中的例子,他使用的也是The Clean Architecture和橙,內(nèi)容比較詳細(xì)仔燕,包含了很多細(xì)節(jié)。

感謝

感謝我這篇文章提到的所有“巨人”魔招,讓我脫離了黑暗時(shí)代晰搀。

感謝能耐心看到這個(gè)地方的人。畢竟這篇文章幾乎都是字办斑,沒有圖外恕,也沒有‘Show you code’。內(nèi)容也只是個(gè)人的感想乡翅,對(duì)于大部分人來說枯燥無味鳞疲。

reference:

[The Clean Architecture]:https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

[Architecting Android...The clean way?]:https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

[Android-CleanArchitecture]:https://github.com/android10/Android-CleanArchitecture

[Domain Driven Design]:https://en.wikipedia.org/wiki/Domain-driven_design

[提供一個(gè)視頻]: https://www.youtube.com/watch?v=uwJRrJ2Hwqg

本文作者:本文作者:徐珺煒(點(diǎn)融黑幫),成都分公司開發(fā)者蠕蚜,負(fù)責(zé)Android應(yīng)用開發(fā)建丧。是Clean Architecture機(jī)構(gòu)實(shí)踐者,全棧玩家波势,最近喜歡看史,已經(jīng)胖得無法運(yùn)動(dòng)了橄维。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尺铣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子争舞,更是在濱河造成了極大的恐慌凛忿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竞川,死亡現(xiàn)場(chǎng)離奇詭異店溢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)委乌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門床牧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遭贸,你說我怎么就攤上這事戈咳。” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵著蛙,是天一觀的道長(zhǎng)删铃。 經(jīng)常有香客問我,道長(zhǎng)踏堡,這世上最難降的妖魔是什么猎唁? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮顷蟆,結(jié)果婚禮上诫隅,老公的妹妹穿的比我還像新娘。我一直安慰自己慕的,他們只是感情好阎肝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肮街,像睡著了一般风题。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫉父,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天沛硅,我揣著相機(jī)與錄音,去河邊找鬼绕辖。 笑死摇肌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仪际。 我是一名探鬼主播围小,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼树碱!你這毒婦竟也來了肯适?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤成榜,失蹤者是張志新(化名)和其女友劉穎框舔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎婚,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刘绣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挣输。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纬凤。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歧焦,靈堂內(nèi)的尸體忽然破棺而出移斩,到底是詐尸還是另有隱情肚医,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布向瓷,位于F島的核電站肠套,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猖任。R本人自食惡果不足惜你稚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朱躺。 院中可真熱鬧刁赖,春花似錦、人聲如沸长搀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)源请。三九已至枪芒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谁尸,已是汗流浹背舅踪。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留良蛮,地道東北人抽碌。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像决瞳,于是被迫代替她去往敵國(guó)和親货徙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容