架構(gòu)模式的一些學(xué)習(xí)和思考

前言

最近讀到羅琦的架構(gòu)分享:VIP模式,感覺是個"性價比"非常高的架構(gòu)模式.在此記錄一些學(xué)習(xí)和思考.

當(dāng)前模式

MVC的詬病很清晰,所以都在尋找更好的模式.后來的MVP,并沒有解決MVC的問題.然后MVVM,乃至更多的模式.我個人覺得似乎都或多或少有一些缺陷.而我目前沿用單項MVVM+P的模式,在VIP模式下,似乎通暢了不少.

MVC作為蘋果推薦模式,controller代碼爆炸,無法測試等詬病很清晰.

MVP把controller作為presenter,并沒有實際改善MVC中C的問題.

MVVM很熱,有RAC支持,能夠非常好的解決問題,但是我不喜歡.

其余的模式,例如視頻中提到的viper模式,不太常見,理解不深.借用視頻中的話:Over Design

MVVM

MVVM = Model + View + ViewModel
Model為數(shù)據(jù)存儲,也就是各種property
View為顯示,各種UIView和其subclass的組合
ViewModel為粘合劑.我所理解的為:就是以前的business.

我不喜歡的原因是,MVVM還具備一個特性:雙向性.也就是說View的變化,會反映在ViewMode上;ViewModel變化,也會導(dǎo)致View變化.
為了實現(xiàn)這個特性,一般依賴RAC(KVO).

我不成熟的理解:設(shè)計模式是對工作(代碼)的拆分與組合,以達(dá)到"高內(nèi)聚,低耦合"的目的,而并不希望它依賴某個東西.因為學(xué)習(xí)并且維護(hù)某個依賴項是有成本的.

RAC的優(yōu)勢極度明顯,雖也有一定的劣勢:

  • 學(xué)習(xí)曲線(其實這不算是問題,通過學(xué)習(xí)解決)
  • 大量的KVO,效率問題(無法解決,但是效率瓶頸一般不在這里)
  • 調(diào)用棧長(通過經(jīng)驗解決)

但是這并不是最主要的原因.最主要的原因是RAC是改變的一個編程思想:響應(yīng)式.包括信號,觀察,訂閱等.如果要使用RAC,那么是否整個工程都要改變思想呢?

朋友所在的某擁有2億+用戶的知名創(chuàng)業(yè)公司,曾經(jīng)為了引入RAC,花了一個多月的時間將工程整體改造.

VIP

看到這個模式,感覺把我自己采用的模式進(jìn)行了一個非常不錯的升級.通過對項目的初步實驗和改造,以下為我的學(xué)習(xí)和理解.

VIP = View + Interactor + Presenter

換個說法可以理解為依賴Protocol的,單向的ViewController + Model + View + Fetcher(Interactor) + Transformer(Presenter)

主要依賴2個Protocol(視頻中是3個):
1.FetcherOutput
2.TransformerOutput
意思是,當(dāng)fetcher去獲取(fetch)數(shù)據(jù)完成后,通過FetcherOutput進(jìn)行數(shù)據(jù)輸出;同理,當(dāng)Transformer進(jìn)行數(shù)據(jù)轉(zhuǎn)換(transform)后,也通過代理進(jìn)行數(shù)據(jù)輸出.

總體來看,因為是單向的,所以不存在雙向數(shù)據(jù)綁定的問題.由ViewController在合適的時機(jī)(生命周期/點(diǎn)擊按鈕等),通過fetcher調(diào)用數(shù)據(jù).調(diào)用成功后,此時的數(shù)據(jù)為原始數(shù)據(jù).將原始數(shù)據(jù)交付給delegate,既:transformer.通過transformer進(jìn)行數(shù)據(jù)運(yùn)算和轉(zhuǎn)換(dict/model)后,交給delegate進(jìn)行displayer.當(dāng)然這里的delegate即為ViewController本身.

偽代碼:

在ViewController中:

- (void)viewDidLoad {
 [self setupVIP];
 [self.datafetcher fetchData];
}

- (void)setupVIP {
 self.fetcher = [Fetcher new];
 self.transformer = [Transformer new];

//設(shè)置fetcher的output代理
 self.fetcher.output = self.transformer;
//設(shè)置transformer的output代理
 self.transformer.output = self;
}

//transformer的代理方法:display
- (void)displayData:(id)data {
 //display by tableview,etc...
}

在Fetcher中:

- (void)fetchData {
 /*
 在視頻中專門為獲取數(shù)據(jù)封裝了一個worker類,目的是可以方便的切換數(shù)據(jù)來源.
 沒有需求的話或許也可以簡化.
 */
 xxxx (fetch data from api/db)
 [self.dataformatter tranformData:data];
}

在Transformer中:

- (void)tranformData:(id)data {
 xxxx(transform data)
 [self.displayer displayData:data]
}

感受

設(shè)計模式最終是為了更好的維護(hù)項目.從實際出發(fā)我覺得最好能達(dá)到幾個效果.

  • 團(tuán)隊基本能寫出風(fēng)格一致的代碼,容易修改/維護(hù)
  • 新人能夠迅速的理解并且加入
  • 接手的人能夠快速的接手并且修改/維護(hù)
  • 能夠更加容易的進(jìn)行測試

我稱之為"性價比",VIP模式我個人認(rèn)為"性價比"還蠻高的.我會繼續(xù)學(xué)習(xí)和使用,也推薦大家測試一番.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茂卦,一起剝皮案震驚了整個濱河市三痰,隨后出現(xiàn)的幾起案子布轿,更是在濱河造成了極大的恐慌,老刑警劉巖谭羔,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲸匿,警方通過查閱死者的電腦和手機(jī)究驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門镊绪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洒忧,你說我怎么就攤上這事蝴韭。” “怎么了熙侍?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵万皿,是天一觀的道長摧找。 經(jīng)常有香客問我,道長牢硅,這世上最難降的妖魔是什么蹬耘? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮减余,結(jié)果婚禮上综苔,老公的妹妹穿的比我還像新娘。我一直安慰自己位岔,他們只是感情好如筛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抒抬,像睡著了一般杨刨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擦剑,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天妖胀,我揣著相機(jī)與錄音,去河邊找鬼惠勒。 笑死赚抡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纠屋。 我是一名探鬼主播涂臣,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼售担!你這毒婦竟也來了赁遗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤族铆,失蹤者是張志新(化名)和其女友劉穎吼和,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骑素,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫乓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了献丑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末捣。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖创橄,靈堂內(nèi)的尸體忽然破棺而出箩做,到底是詐尸還是另有隱情,我是刑警寧澤妥畏,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布邦邦,位于F島的核電站安吁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏燃辖。R本人自食惡果不足惜鬼店,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黔龟。 院中可真熱鬧妇智,春花似錦、人聲如沸氏身。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛋欣。三九已至航徙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陷虎,已是汗流浹背到踏。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泻红,地道東北人夭禽。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓霞掺,卻偏偏與公主長得像谊路,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菩彬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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