序
沒(méi)有創(chuàng)新就沒(méi)有進(jìn)步,在熱火朝天的大數(shù)據(jù)時(shí)代,我們需要的是沉住氣掀鹅,以不變應(yīng)萬(wàn)變计维,以簡(jiǎn)單迎接復(fù)雜,用共性創(chuàng)造多樣性疚顷。讓架構(gòu)變成共享,讓架構(gòu)形成組裝。
背景
在參與過(guò)很多app的研發(fā)的基礎(chǔ)上薯酝,以及對(duì)很多互聯(lián)產(chǎn)品的業(yè)務(wù)方向的摸索下,分析對(duì)比目前比較流行的app框架設(shè)計(jì)模式后爽柒,自研了自己的app項(xiàng)目吴菠,在此項(xiàng)目的研發(fā)過(guò)程中悟出總結(jié)了一種全新的架構(gòu)模式,UDN(UI - Data - Network)架構(gòu)設(shè)計(jì)模式又稱(chēng)之為:面向?qū)ο蟮募軜?gòu)模式-- OOA(Object Oriented Architecture)
理念
UDN架構(gòu)除了遵循低耦合浩村,高內(nèi)聚的思想之外做葵,還融入了全新的思想模式,面向獨(dú)立業(yè)務(wù)心墅,面向獨(dú)立編程酿矢,高度封裝,傻瓜式運(yùn)用怎燥,業(yè)務(wù)隔離瘫筐,技術(shù)隔離,看似瓜分三國(guó)铐姚,實(shí)際一統(tǒng)天下策肝。全局順,部分散隐绵,序中有亂之众,亂中有序。
鑒于以上UDN設(shè)計(jì)思想可以看出依许,整個(gè)UDN的架構(gòu)是一套耦合度特別低的架構(gòu)棺禾,他不僅僅單純的從技術(shù)出發(fā),更是從產(chǎn)品的業(yè)務(wù)方向整合的一套適合快速迭代峭跳,使用方便的上層app架構(gòu)膘婶。
現(xiàn)有架構(gòu)的缺陷
現(xiàn)有的技術(shù)架構(gòu)大家都是模仿,改進(jìn)坦康,隨著業(yè)務(wù)的發(fā)展竣付,架構(gòu)變的越來(lái)越復(fù)雜,越來(lái)越深不可測(cè)滞欠,增加了架構(gòu)的難度古胆,尤其是隨著新技術(shù)的更新,架構(gòu)的重構(gòu)變的是家常便飯,增加了額外的研發(fā)成本逸绎,一定程度上降低了工作效率惹恃。
另外一個(gè)重大缺陷是現(xiàn)在是技術(shù)共享的時(shí)代,每家公司各自研發(fā)著自己的架構(gòu)模式棺牧,讓整個(gè)業(yè)界的架構(gòu)得不到一個(gè)統(tǒng)一的標(biāo)準(zhǔn)巫糙,讓架構(gòu)顯的獨(dú)立又冗余,不是一個(gè)良性的技術(shù)共享模式颊乘,恰是起到一個(gè)干擾的作用参淹,導(dǎo)致一家公司新架構(gòu)的出現(xiàn),其他公司盲目崇拜和模仿并不一定提高了工作效率反而很有可能降低了工作效率乏悄。
最后浙值,架構(gòu)技術(shù)至今沒(méi)有一套規(guī)范的共享模式,隨著互聯(lián)大數(shù)據(jù)時(shí)代的到來(lái)檩小,架構(gòu)需要演變成人人可架構(gòu)的形式而不是專(zhuān)注于某個(gè)架構(gòu)師的責(zé)任开呐。
詳解
UDN概要:
首先,作為一個(gè)架構(gòu)師必須明確以下兩個(gè)問(wèn)題规求。
問(wèn)題1:何為架構(gòu)筐付?
‘架構(gòu)’兩個(gè)字眼。不僅在開(kāi)發(fā)界阻肿,甚至在每個(gè)領(lǐng)域都隨處可聞瓦戚,隨處可見(jiàn)。前端談架構(gòu)冕茅,客戶(hù)端談架構(gòu)伤极,服務(wù)端談架構(gòu),甚至連產(chǎn)品設(shè)計(jì)也會(huì)談架構(gòu)姨伤。架構(gòu)似乎不再是針對(duì)某一個(gè)大的框架而言,而是已經(jīng)深入到每一個(gè)細(xì)小的模塊庸疾,比如我們?cè)陂_(kāi)始編碼前都會(huì)說(shuō):先把架構(gòu)想好乍楚。
但是,何為架構(gòu)届慈?一千個(gè)人有一千種想法徒溪,也會(huì)有一千個(gè)結(jié)論,所以沒(méi)有固定的答案和標(biāo)準(zhǔn)金顿,才會(huì)讓架構(gòu)顯的那么重要和神圣臊泌,同時(shí)也是那么的難。
哲學(xué)上有句話:世界萬(wàn)物都有他的自然規(guī)律揍拆,有多樣性也必當(dāng)存在共性渠概。因此架構(gòu)也是如此。
所以,抽出共性播揪,一個(gè)好的架構(gòu)必須滿(mǎn)足以下條件:
1. 可維護(hù)性贮喧。
一個(gè)好的架構(gòu)一定要具有可維護(hù)性,并且維護(hù)成本低猪狈。對(duì)于快速迭代的產(chǎn)品箱沦,公司是不會(huì)花費(fèi)太多時(shí)間去做維護(hù)的事。
2. 可擴(kuò)展性:
在互聯(lián)網(wǎng)爆炸的時(shí)代雇庙,用戶(hù)的需求千奇百怪谓形,日益變更,良好的擴(kuò)展性可以解決多態(tài)的需求疆前。
3. 方便性:
一套完整架構(gòu)代碼套耕,是給研發(fā)人員提供便捷入口的,而不是讓開(kāi)發(fā)人員來(lái)學(xué)習(xí)android源碼的峡继,使用一定要方便冯袍,工作效率才會(huì)提高。
4. 安全性:
一切沒(méi)有安全的設(shè)計(jì)如同一個(gè)紙老虎碾牌,隨時(shí)都有可能被斃命的危險(xiǎn)康愤。所以安全性是一款產(chǎn)品的命脈,尤其是金融產(chǎn)品舶吗。
問(wèn)題2:技術(shù)如何選型征冷?
了解到了何為架構(gòu),當(dāng)開(kāi)始入手的時(shí)候還必須想清楚一個(gè)問(wèn)題:技術(shù)如何選型誓琼?
現(xiàn)在的軟件技術(shù)革新快之又快检激,很可能一夜之間,你所謂最新的技術(shù)都直接被貼上out的標(biāo)簽腹侣。如此看來(lái)叔收,大家是不是又慌了?
但是傲隶,我想說(shuō)的是誰(shuí)說(shuō)好的架構(gòu)一定要用最新的技術(shù)饺律?達(dá)爾文在生物進(jìn)化論上早就說(shuō)過(guò):適者生存。
這句話仔細(xì)琢磨的話跺株,并不一定是詮釋競(jìng)爭(zhēng)環(huán)境的复濒,他也詮釋著另外一句話:鞋合不合適,腳穿了才知道乒省。因此對(duì)于一個(gè)好的架構(gòu)巧颈,個(gè)人認(rèn)為并不是求新,而是求存袖扛。
如何存砸泛,怎樣存。不是技術(shù)說(shuō)了算,而是產(chǎn)品的說(shuō)了算晾嘶。因此業(yè)務(wù)的方向直接決定你的技術(shù)選型妓雾。
總結(jié)一下,技術(shù)如何選型垒迂,作為一個(gè)架構(gòu)師械姻,你不能只顧沉迷技術(shù),你還一定要清楚以下幾點(diǎn):
不懂技術(shù)的架構(gòu)師連碼農(nóng)的資格都談不上机断,而只懂技術(shù)不懂業(yè)務(wù)的架構(gòu)師就像是花瓶楷拳,易碎。現(xiàn)在所有的公司幾乎都是以結(jié)果為導(dǎo)向吏奸,所有的產(chǎn)品最終都是以商業(yè)化為目的欢揖,無(wú)論是是直接的還是間接的,天下沒(méi)有免費(fèi)的午餐奋蔚,記住一句話:掙不到錢(qián)的產(chǎn)品都不是好產(chǎn)品她混!
所以作為架構(gòu)師,你在設(shè)計(jì)你的架構(gòu)之前一定要明確產(chǎn)品的方向泊碑,能一眼看到技術(shù)坤按,也一定要有一眼看到盈利模式。
解答了以上兩個(gè)問(wèn)題馒过,讓我們回到UDN的架構(gòu)設(shè)計(jì)模式臭脓。UDN的架構(gòu)思想就是很直白的融合了這樣一種思想,前面也有提到:面向業(yè)務(wù)腹忽。他的分層更簡(jiǎn)單明了来累。融入的是技術(shù),彰顯的是業(yè)務(wù)窘奏。技術(shù)獨(dú)立嘹锁,業(yè)務(wù)鮮明,使用簡(jiǎn)單蔼夜。
UDN的架構(gòu)總概:
圖解:
如圖所示兼耀,UDN的整個(gè)架構(gòu)思想特別簡(jiǎn)單清晰。以網(wǎng)絡(luò)為基點(diǎn)求冷,以數(shù)據(jù)為支撐,以UI為展現(xiàn)的三層組合結(jié)構(gòu)窍霞。囊括了目前所有架構(gòu)的必備因素匠题,也是UDN核心的哲學(xué)思想:從多樣性找出共性,從復(fù)雜到簡(jiǎn)單但金。
下面針對(duì)每一層的思想做詳細(xì)闡述韭山。
1. UI:
在這里我為何不稱(chēng)之為View?View太狹隘,UDN想闡述的是所有能展現(xiàn)給用戶(hù)的東西統(tǒng)稱(chēng)為UI钱磅,這是站在用戶(hù)的角度抽象出來(lái)架構(gòu)之一的組件梦裂。
從圖中可以看出UI包含列表和圖片,而圖片和列表的組合稱(chēng)之為:內(nèi)容盖淡。也就是用戶(hù)最關(guān)心的東西和上層app的終極體現(xiàn)年柠。
所有的互聯(lián)產(chǎn)品,甚至非互聯(lián)產(chǎn)品只要能讓用戶(hù)觸及和看到的東西就是內(nèi)容褪迟,而組成app的宏觀展現(xiàn)其實(shí)就兩種元素:列表和圖片冗恨。
因此UI層的設(shè)計(jì),說(shuō)白了就是列表和圖片的設(shè)計(jì)味赃∠颇ǎ可見(jiàn)UI層瞬間變的再簡(jiǎn)單不過(guò)了。
2. Data:
數(shù)據(jù)是UI的支撐層心俗,是UI層的心臟傲武。這一層是站在研發(fā)和技術(shù)的角度抽象出來(lái)的架構(gòu)之一的又一組件。
所有對(duì)數(shù)據(jù)的設(shè)計(jì)城榛,以及和上層UI的交互揪利,綁定等。這是研發(fā)需要很了解UI展現(xiàn)前提下去設(shè)計(jì)特定的數(shù)據(jù)模型吠谢。
這一層的設(shè)計(jì)可歸結(jié)為接口Api的設(shè)計(jì)和數(shù)據(jù)的綁定設(shè)計(jì)土童。因此,Data層瞬間也變的很簡(jiǎn)單了工坊。
3. Network:
網(wǎng)絡(luò)是Data層的支持献汗,所有的數(shù)據(jù)來(lái)源主要都是基于網(wǎng)絡(luò),數(shù)據(jù)的獲取和傳輸王污,安全性都在這里實(shí)現(xiàn)罢吃。
4. 總結(jié):
UDN架構(gòu)思想層次化,每一層又簡(jiǎn)單化昭齐,各層之間負(fù)責(zé)各自該干的事情尿招,互不影響,只需要給上層提供api接口即可阱驾。理解起來(lái)簡(jiǎn)單就谜,設(shè)計(jì)起來(lái)有針對(duì)性,每一層業(yè)務(wù)的角度也都不一樣里覆,同時(shí)也彰顯了業(yè)務(wù)的獨(dú)立性丧荐,不僅降低了技術(shù)的耦合,也降低了業(yè)務(wù)的耦合喧枷。
UDN的業(yè)務(wù)模型:
圖解:業(yè)務(wù)模型在UDN的架構(gòu)層上著重凸顯在UI層虹统,UI一層可以說(shuō)全是業(yè)務(wù)層弓坞。所謂需求都是很多決策和調(diào)研的刺激結(jié)果,因此在UI層設(shè)計(jì)的時(shí)候车荔,列表的設(shè)計(jì)渡冻,圖片的設(shè)計(jì)要結(jié)合真實(shí)的業(yè)務(wù)模型,以不變應(yīng)萬(wàn)變忧便。針對(duì)于上層app族吻,UI層是最需要花心思設(shè)計(jì)的一層。
UDN數(shù)據(jù)模型:
圖解:UDN的數(shù)據(jù)層茬腿,以上提過(guò)主要來(lái)源于網(wǎng)絡(luò)呼奢,還有本地?cái)?shù)據(jù)庫(kù)。這一層是站在技術(shù)的角度切平,是數(shù)據(jù)核心發(fā)電站也是UI內(nèi)容填充的倉(cāng)庫(kù)握础。
UDN的技術(shù)模型:
圖解:每一層互不干擾,只需要提供Api供上層調(diào)用悴品。
亮點(diǎn):
業(yè)務(wù)和技術(shù)融合且相對(duì)應(yīng)
耦合度極低
架構(gòu)清晰
編碼獨(dú)立禀综,每一層的技術(shù)使用和設(shè)計(jì)可以隨心所欲
擴(kuò)展性極高,每一層都可以組件化甚至插件化
代碼可讀性高苔严,使用方便定枷。
難點(diǎn):
較強(qiáng)的業(yè)務(wù)知識(shí)和業(yè)務(wù)邏輯
全面的技術(shù)點(diǎn),比如UI層不僅考慮到naitive的東西還要兼顧web的東西
超高的封裝水平
發(fā)散的架構(gòu)思維
嫻熟的技術(shù)能力
實(shí)現(xiàn)
圖解:
1. UI層其實(shí)就是布局届氢,layout的多樣性即是布局的多樣性欠窒,在這一層要求極高的業(yè)務(wù)知識(shí),要求很清楚產(chǎn)品的業(yè)務(wù)走向退子。讓架構(gòu)掌握全局岖妄,而不是代碼堆積需求。
2. Data層完全的數(shù)據(jù)層寂祥,只是提供給UI一個(gè)接口荐虐。這一層可以暴露很多可以定制的接口,比如server端的接口等丸凭,最大可能的做到擴(kuò)展性福扬,不是針對(duì)于一款app,而是所有的都可以套用這個(gè)框架惜犀。
3. Network層也僅僅是提供接口铛碑,也要最大可能的做到擴(kuò)展性和定制性,甚至可以直接插件化虽界,以一種sdk的形式對(duì)內(nèi)或者對(duì)外開(kāi)發(fā)亚茬。
前景
UDN的架構(gòu)設(shè)計(jì)目前只是一種思想,還未形成完整的架構(gòu)框架浓恳。但是縱觀目前所有的上層app框架刹缝,無(wú)外乎就是UI,data以及Network這三個(gè)支撐點(diǎn)颈将,而截至目前各個(gè)公司都有自己一套架構(gòu)模式梢夯,卻從來(lái)沒(méi)有人針對(duì)最直接的app三要素進(jìn)行架構(gòu)嘗試。
UDN的架構(gòu)思想是源于本人總結(jié)很多晴圾,對(duì)比很多以及項(xiàng)目自己實(shí)踐總結(jié)出來(lái)的一套架構(gòu)模式颂砸,沒(méi)有所謂的高大上,就是利用哲學(xué)的思想從復(fù)雜到簡(jiǎn)單死姚,從無(wú)序到有序人乓,從多樣到共性而得出的一種新型的架構(gòu)嘗試。
UDN架構(gòu)可以說(shuō)是一種很接地氣的架構(gòu)都毒,他的可組件化是對(duì)此架構(gòu)的最大挑戰(zhàn)色罚,也是最大亮點(diǎn),因?yàn)閺膩?lái)沒(méi)有一棟建筑可以把中間的房子單獨(dú)領(lǐng)出來(lái)账劲。所有的建筑師都認(rèn)為架構(gòu)不可動(dòng)戳护,都是有一個(gè)整體,牽一發(fā)而動(dòng)全身瀑焦,而UDN恰恰嘗試了這種不可能腌且,采取了組裝式的玩法,模仿模型游戲的組件拼接法榛瓮,讓架構(gòu)更接地氣铺董,讓結(jié)構(gòu)更有層次,讓架構(gòu)更業(yè)務(wù)化和簡(jiǎn)單化禀晓。
如果UDN一旦形成可套用的框架精续,可想而知整個(gè)移動(dòng)互聯(lián)的app迭代是有多么的快,可能到后來(lái)不是大家各自研發(fā)屬于自己的架構(gòu)而是整個(gè)互聯(lián)的架構(gòu)組件都可以公用匆绣。
也許將來(lái)有一天驻右,我們app的開(kāi)發(fā)僅僅是用A家的UI組件,用B家的Data組件崎淳,用C家的Network組件堪夭,而你家可能單純的就是組裝。
這不是不可能拣凹,想想大數(shù)據(jù)時(shí)代森爽,云服務(wù),一切皆有可能嚣镜,有共享才有機(jī)遇爬迟,有創(chuàng)新才能進(jìn)步,有利益才能達(dá)成共贏菊匿。而UDN帶來(lái)的是快速迭代付呕,高效工作计福,資源和技術(shù)共享,恰恰順應(yīng)了時(shí)代的需要徽职。用戶(hù)都越來(lái)越懶了象颖,開(kāi)發(fā)同樣也想越來(lái)越懶。
技術(shù)改變社會(huì)姆钉,創(chuàng)新讓一切成為可能说订,UDN的架構(gòu)思想是隨時(shí)代而進(jìn)化的產(chǎn)物。一旦演變成功潮瓶,全互聯(lián)受益陶冷。所以前景還是很看好的。
備注
UDN的架構(gòu)思想毯辅,專(zhuān)屬個(gè)人所有埂伦。如果你認(rèn)同求轉(zhuǎn)發(fā),不喜勿噴悉罕!