架構(gòu) - iOS架構(gòu)設(shè)計(jì)之模塊間的解耦嘗試

前言

工程大了以后,就需要分拆茶袒,不管是組件化還是插件化,還是什么凉馆,解耦是第一步薪寓,而且是各個(gè)維度的解耦。

模塊解耦合的方式

【1】Runtime 運(yùn)行時(shí)調(diào)用

    Class targetClass = NSClassFromString(@"TestViewController");
    id instance = [[targetClass alloc]init];
    //屬性賦值
    SEL sel = NSSelectorFromString(@"setImageName:");
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [instance performSelector:sel withObject:@"測試參數(shù)"];
    #pragma clang diagnostic pop
    [self.navigationController pushViewController:instance animated:YES];

    /*
     Runtime 這樣的機(jī)制增加了程序的靈活性澜共,可以通過給一個(gè)方法傳遞sel參數(shù),
    讓這個(gè)方法動(dòng)態(tài)的執(zhí)行某一個(gè)方法向叉,我們也可以通過配置文件制定需要執(zhí)行的方法,
    程序讀取配置文件之后把方法的字符串翻譯成sel變量然后給相應(yīng)的對(duì)象發(fā)送這個(gè)消息嗦董。
     */
    
    //當(dāng)然屬性的賦值還可以通過 KVC 母谎,比上面的performSelector:sel 屬性的set方法更方便!
    [instance setValue:infoDic[attributeName] forKey:attributeName];

【2】接口隔離京革,機(jī)制與策略分離奇唤,面向接口調(diào)用

雖然說公共模塊可以通過架構(gòu)設(shè)計(jì)來避免耦合業(yè)務(wù),但是業(yè)務(wù)模塊之間還是會(huì)有耦合匹摇,而且這種情況是最多的咬扇,比如頁面跳轉(zhuǎn)啊,數(shù)據(jù)傳遞啊廊勃,這些情況前面的方法已經(jīng)不夠用了懈贺。那如何解耦不同業(yè)務(wù)模塊之間的代碼調(diào)用呢?

那就是面向接口調(diào)用,我們知道只要直接引用代碼梭灿,就會(huì)有依賴画侣,比如:

// A 模塊
- (void)getSomeDataFromB {
    B.getSomeData();
}

// B 模塊
- (void)getSomeData {
    return self.data;
}
那么我們可以實(shí)現(xiàn)一個(gè) getSomeDataFromB 的接口,讓 A 只依賴這個(gè)接口堡妒,而 B 來實(shí)現(xiàn)這個(gè)接口配乱,這樣就實(shí)現(xiàn)了 A 與 B 的解耦。

// 接口
@protocol BService <NSObject>
- (void)getSomeData;
@end

// A 模塊, 只依賴接口
- (void)getSomeDataFromB {
    id  b = findService(@protocol(BService));
    b.getSomeData;
}

// B 模塊涕蚤,實(shí)現(xiàn)BService接口
@interface B : NSObject <BService>

- (void)getSomeData {
    return self.data;
}

@end

    這樣就可以實(shí)現(xiàn)了即滿足了模塊之間調(diào)用宪卿,也實(shí)現(xiàn)了解耦

協(xié)議與實(shí)現(xiàn)做成了一個(gè)機(jī)制與策略分離
所謂機(jī)制即是抽象出來的規(guī)則,比如:
f(x)=x^2 x屬于R
所謂策略即是在具體場景中的應(yīng)用的诵,比如當(dāng)x=2的時(shí)候:
f(2)=4 x=2

【3】中間件的路由通信解耦

A :推薦CTMediator 方式的組件化解耦
可以看我這篇文章:iOS組件化設(shè)計(jì)與開發(fā)

B:URL路由式組件化解耦
還有一種手段就是通過定義一套協(xié)議來實(shí)現(xiàn)模塊間的通信万栅,比如app里面的任何頁面,或者任何操作都是通過一個(gè)URL來喚起的話西疤,這樣是不是就把各個(gè)復(fù)雜的業(yè)務(wù)之間解耦了呢烦粒,通信都使用URL.

為何如此URL(統(tǒng)一資源定位符)?

  回到最開始我們描述的問題中第一點(diǎn): 模塊發(fā)現(xiàn)。其實(shí)也就是模塊這種資源的定位問題代赁,
  這個(gè)和URL設(shè)計(jì)的初衷是不謀而合的扰她。URL整套的設(shè)計(jì)思路就是在整體的互聯(lián)網(wǎng)中解決信息孤島,
  讓各個(gè)信息孤島之間能夠進(jìn)行資源發(fā)現(xiàn)和資源調(diào)用而設(shè)計(jì)芭碍。而我們目前所要處理的模塊間通信問題徒役,
  其實(shí)是這個(gè)宏大問題域的一個(gè)子集。因而選用URL協(xié)議窖壕,是一個(gè)非常順理成章的事情忧勿。

可以方便地在頁面之間構(gòu)建高內(nèi)聚和低耦合開發(fā)模式。他的核心思想是將每個(gè)頁面視為一種資源瞻讽,并通過標(biāo)準(zhǔn)URL協(xié)議(統(tǒng)一資源定位器)定位每個(gè)可訪問的頁面(資源)鸳吸。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市速勇,隨后出現(xiàn)的幾起案子晌砾,更是在濱河造成了極大的恐慌,老刑警劉巖烦磁,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件养匈,死亡現(xiàn)場離奇詭異,居然都是意外死亡都伪,警方通過查閱死者的電腦和手機(jī)乖寒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來院溺,“玉大人楣嘁,你說我怎么就攤上這事。” “怎么了逐虚?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵聋溜,是天一觀的道長。 經(jīng)常有香客問我叭爱,道長撮躁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任买雾,我火速辦了婚禮把曼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漓穿。我一直安慰自己嗤军,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布晃危。 她就那樣靜靜地躺著叙赚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僚饭。 梳的紋絲不亂的頭發(fā)上震叮,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音鳍鸵,去河邊找鬼苇瓣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛偿乖,可吹牛的內(nèi)容都是我干的击罪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼汹想,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼外邓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起古掏,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤损话,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后槽唾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丧枪,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年庞萍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拧烦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钝计,死狀恐怖恋博,靈堂內(nèi)的尸體忽然破棺而出齐佳,到底是詐尸還是另有隱情,我是刑警寧澤债沮,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布炼吴,位于F島的核電站,受9級(jí)特大地震影響疫衩,放射性物質(zhì)發(fā)生泄漏硅蹦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一闷煤、第九天 我趴在偏房一處隱蔽的房頂上張望童芹。 院中可真熱鬧,春花似錦鲤拿、人聲如沸假褪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗜价。三九已至艇抠,卻和暖如春幕庐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背家淤。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工异剥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人絮重。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓冤寿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親青伤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子督怜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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