?App架構(gòu)設(shè)計(jì)經(jīng)驗(yàn)談:技術(shù)選型

當(dāng)你做架構(gòu)設(shè)計(jì)時(shí),必然會(huì)面臨技術(shù)選型的抉擇染坯,不同的技術(shù)方案均芽,架構(gòu)也可能完全不同。有哪些技術(shù)選型需要做決策呢单鹿?比如掀宋,App是純?cè)_(kāi)發(fā),還是Web App,抑或Hybrid App布朦?iOS開(kāi)發(fā)囤萤,語(yǔ)言上是選擇Objective-C還是Swift?架構(gòu)模式用MVC是趴,還是MVP涛舍,或者M(jìn)VVM?下面根據(jù)我的一些經(jīng)驗(yàn)對(duì)某些方面做點(diǎn)總結(jié)分享唆途。

原生/H5

關(guān)于用原生好富雅,還是用H5好的爭(zhēng)論從沒(méi)間斷過(guò)。但我覺(jué)得肛搬,脫離了實(shí)際場(chǎng)景來(lái)討論孰好孰壞意義不大没佑。就說(shuō)我們目前正在做的項(xiàng)目,先說(shuō)明下背景:

不止要做Android和iOS App温赔,也要做微信公眾號(hào)蛤奢;

H5人員缺乏,只有一兩個(gè)兼職的可用陶贼,而且不可控因素很高啤贩;

我們對(duì)原生比較熟;

開(kāi)發(fā)時(shí)間只有半個(gè)月拜秧。

首先痹屹,需求上來(lái)說(shuō),大部分頁(yè)面用H5實(shí)現(xiàn)枉氮,可以減少很多工作量志衍。但因?yàn)椴豢煽匾蛩靥撸鴷r(shí)間又短聊替,風(fēng)險(xiǎn)太大楼肪。而我們對(duì)原生比較熟,開(kāi)發(fā)效率比較高佃牛,很多東西我也控制得了淹辞,風(fēng)險(xiǎn)相對(duì)比較低。而且俘侠,我們的主推產(chǎn)品是App象缀,微信屬于輔助性產(chǎn)品,所以爷速,微信要求也沒(méi)那么高央星。因此,我決定以原生為主惫东,H5為輔莉给,App大部分頁(yè)面用原生完成毙石,小部分用WebView加載H5。

另外颓遏,WebView加載H5也有兩種模式徐矩,一種是加載服務(wù)器的H5頁(yè)面,一種是加載本地的H5頁(yè)面叁幢。加載服務(wù)器的H5頁(yè)面比較簡(jiǎn)單滤灯,WebView只要load一下URL就可以了。加載本地的H5頁(yè)面曼玩,則需要將H5文件存放在本地鳞骤,包括關(guān)聯(lián)的CSS和JS文件。這種方式相對(duì)比較復(fù)雜黍判,不過(guò)豫尽,加載速度會(huì)比第一種快很多。我們當(dāng)前項(xiàng)目基于上面考慮顷帖,只能選擇第一種方案美旧。

如果人員和時(shí)間資源充足的話,那又如何選型呢窟她?毫無(wú)疑問(wèn)陈症,我會(huì)以H5為主,微信和App都有的頁(yè)面統(tǒng)一用H5震糖,App專(zhuān)有的部分,比如導(dǎo)航欄趴腋、標(biāo)題欄吊说、登錄等,才用原生實(shí)現(xiàn)优炬。另外颁井,WebView里的H5有點(diǎn)擊事件時(shí),也許是URL鏈接蠢护,也許是調(diào)用JS的雅宾,都不會(huì)讓它直接在該WebView里做跳轉(zhuǎn),需要攔截下來(lái)做些原生處理后跳轉(zhuǎn)到一個(gè)新的原生頁(yè)面葵硕,原生頁(yè)面也許嵌入另一個(gè)WebView眉抬,用來(lái)展示新的H5頁(yè)面。這是簡(jiǎn)單的例子懈凹,關(guān)于Hybrid App詳細(xì)的設(shè)計(jì)蜀变,以后再講。另外介评,關(guān)于H5库北,絕對(duì)是大趨勢(shì)爬舰,強(qiáng)烈建議所有App開(kāi)發(fā)人員都去學(xué)習(xí)。

Objective-C/Swift

我在項(xiàng)目中選擇了Swift寒瓦,主要基于三個(gè)原因:

Swift真的很簡(jiǎn)潔情屹,生產(chǎn)效率很高;

Swift取代Objective-C是必然的趨勢(shì)杂腰;

目前iOS只有我一個(gè)人開(kāi)發(fā)垃你,不需要顧慮到團(tuán)隊(duì)里沒(méi)人懂Swift。

如果你的團(tuán)隊(duì)里沒(méi)人懂Swift颈墅,那還是乖乖用Objective-C吧蜡镶;如果有一兩個(gè)懂Swift的,那可以混合開(kāi)發(fā)恤筛,并讓不懂的人盡快學(xué)會(huì)Swift官还;如果都懂了,不用想了毒坛,直接上Swift吧望伦。

當(dāng)語(yǔ)言上選擇了Swift,相應(yīng)的一些第三方庫(kù)也面臨著選型煎殷。比如屯伞,依賴(lài)庫(kù)管理,Objective-C時(shí)代大部分用CocoaPods豪直,Swift時(shí)代劣摇,我更喜歡Carthage。Carhage是用Swift寫(xiě)的弓乙,和CocoaPods相比末融,輕耦合,也更靈活暇韧。我個(gè)人也不太喜歡CocoaPods勾习,使用起來(lái)比較麻煩,耦合性也較高懈玻,我使用過(guò)程中也經(jīng)常出問(wèn)題巧婶,而且還總是不知道該怎么解決,要移除時(shí)也是非常麻煩涂乌。

再推薦幾個(gè)關(guān)于Swift的第三方庫(kù):

Alamofire:Swift版本的網(wǎng)絡(luò)基礎(chǔ)庫(kù)艺栈,和AFNetworking是同一個(gè)作者

AlamofireImage:基于Alamofire的圖片加載庫(kù)

ObjectMapper:Swift版本的Json和Model轉(zhuǎn)換庫(kù)

AlamofireObjectMapper:Alamofire的擴(kuò)展庫(kù),結(jié)合了ObjectMapper骂倘,自動(dòng)將JSON的Response數(shù)據(jù)轉(zhuǎn)換為了Swift對(duì)象

MVC/MVP/MVVM

先分別簡(jiǎn)單介紹下這三個(gè)架構(gòu)模式吧:

MVC:Model-View-Controller眼滤,經(jīng)典模式,很容易理解历涝,主要缺點(diǎn)有兩個(gè):

View對(duì)Model的依賴(lài)诅需,會(huì)導(dǎo)致View也包含了業(yè)務(wù)邏輯漾唉;

Controller會(huì)變得很厚很復(fù)雜。

MVP:Model-View-Presenter堰塌,MVC的一個(gè)演變模式赵刑,將Controller換成了Presenter,主要為了解決上述第一個(gè)缺點(diǎn)场刑,將View和Model解耦般此,不過(guò)第二個(gè)缺點(diǎn)依然沒(méi)有解決。

MVVM:Model-View-ViewModel牵现,是對(duì)MVP的一個(gè)優(yōu)化模式铐懊,采用了雙向綁定:View的變動(dòng),自動(dòng)反映在ViewModel瞎疼,反之亦然科乎。

架構(gòu)模式上,我不會(huì)推崇說(shuō)哪種模式好贼急,每種模式都各有優(yōu)點(diǎn)茅茂,也各有極限性。越高級(jí)的模式復(fù)雜性越高太抓,實(shí)現(xiàn)起來(lái)也越難空闲。最近火熱的微服務(wù)架構(gòu),比起MVC走敌,復(fù)雜度不知增加了多少倍碴倾。

我在實(shí)際項(xiàng)目中思考架構(gòu)時(shí),也不會(huì)想著要用哪種模式掉丽,我只思考現(xiàn)階段影斑,以現(xiàn)有的人力資源和時(shí)間資源,如何才能更快更好地完成需求机打,適當(dāng)考慮下如何為后期擴(kuò)展或重構(gòu)做準(zhǔn)備。就說(shuō)我前段時(shí)間分享的Android項(xiàng)目重構(gòu)之路系列中講的那個(gè)架構(gòu)片迅,確切地說(shuō)残邀,都不屬于上面三種架構(gòu)模式之一。

寫(xiě)在最后

技術(shù)選型柑蛇,決策關(guān)鍵不在于每種技術(shù)方案的優(yōu)劣如何芥挣,而在于你團(tuán)隊(duì)的水平、資源的多寡耻台,要根據(jù)實(shí)際情況選擇最適合你們當(dāng)前階段的架構(gòu)方案空免。當(dāng)團(tuán)隊(duì)拓展了,資源也充足了盆耽,肯定也是需要再重構(gòu)的蹋砚,到時(shí)再思考其他更合適更優(yōu)秀的方案扼菠。

來(lái)源:Keegan小鋼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坝咐,隨后出現(xiàn)的幾起案子循榆,更是在濱河造成了極大的恐慌,老刑警劉巖墨坚,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秧饮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泽篮,警方通過(guò)查閱死者的電腦和手機(jī)盗尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帽撑,“玉大人泼各,你說(shuō)我怎么就攤上這事∮涂瘢” “怎么了历恐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)专筷。 經(jīng)常有香客問(wèn)我弱贼,道長(zhǎng),這世上最難降的妖魔是什么磷蛹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任吮旅,我火速辦了婚禮,結(jié)果婚禮上味咳,老公的妹妹穿的比我還像新娘庇勃。我一直安慰自己,他們只是感情好槽驶,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布责嚷。 她就那樣靜靜地躺著,像睡著了一般掂铐。 火紅的嫁衣襯著肌膚如雪罕拂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天全陨,我揣著相機(jī)與錄音爆班,去河邊找鬼。 笑死辱姨,一個(gè)胖子當(dāng)著我的面吹牛柿菩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雨涛,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枢舶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懦胞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起祟辟,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤医瘫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后旧困,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體醇份,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年吼具,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僚纷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拗盒,死狀恐怖怖竭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陡蝇,我是刑警寧澤痊臭,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站登夫,受9級(jí)特大地震影響广匙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恼策,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一鸦致、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涣楷,春花似錦分唾、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至碳褒,卻和暖如春迄汛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骤视。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃觉,地道東北人专酗。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盗扇,于是被迫代替她去往敵國(guó)和親祷肯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沉填,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,325評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件佑笋、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • 我想 被電話吵醒 那是一種折磨 卻也是一種幸福 因?yàn)?那是一種信任 更或是一種無(wú)可替代 除非 是騙子 是騷擾 但我...
    卡在樹(shù)叉上的豬閱讀 229評(píng)論 0 0
  • 礪劍長(zhǎng)白山翼闹,匆匆年復(fù)年。 大雪漫天舞蒋纬,朔風(fēng)透骨寒猎荠。 青春路未悔,相思夜難眠蜀备。 遙看月正圓关摇,莫問(wèn)何時(shí)還!
    長(zhǎng)白雪0924閱讀 206評(píng)論 0 0
  • Set類(lèi)型語(yǔ)法 Swift中的Set類(lèi)型被寫(xiě)為Set<T>,這里的T表示Set中允許存儲(chǔ)的類(lèi)型碾阁。 創(chuàng)建和構(gòu)造一個(gè)空...
    JaneJie閱讀 8,028評(píng)論 4 5