什么是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)了橄维。