成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用objection來模塊化開發(fā)iOS項(xiàng)目

移動(dòng)開發(fā) iOS
objection 是一個(gè)輕量級(jí)的依賴注入框架,受Guice的啟發(fā),Google Wallet 也是使用的該項(xiàng)目。「依賴注入」是面向?qū)ο缶幊痰囊环N設(shè)計(jì)模式,用來減少代碼之間的耦合度。通常基于接口來實(shí)現(xiàn),也就是說不需要new一個(gè)對(duì)象,而是通過 相關(guān)的控制器來獲取對(duì)象。2013年最火的PHP框架 laravel 就是其中的典型。

[[111939]]

objection 是一個(gè)輕量級(jí)的依賴注入框架,受Guice的啟發(fā),Google Wallet 也是使用的該項(xiàng)目。「依賴注入」是面向?qū)ο缶幊痰囊环N設(shè)計(jì)模式,用來減少代碼之間的耦合度。通常基于接口來實(shí)現(xiàn),也就是說不需要new一個(gè)對(duì)象,而是通過 相關(guān)的控制器來獲取對(duì)象。2013年最火的PHP框架 laravel 就是其中的典型。

假設(shè)有以下場(chǎng)景:ViewControllerA.view里有一個(gè)button,點(diǎn)擊之后push一個(gè)ViewControllerB,最簡單的寫法類似這樣:

  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.     UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 
  4.     button.frame = CGRectMake(100, 100, 100, 30); 
  5.     [button setTitle:@"Button" forState:UIControlStateNormal]; 
  6.     [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; 
  7.     [self.view addSubview:button]; 
  8.  
  9. - (void)buttonTapped 
  10.     ViewControllerB *vc = [[ViewControllerB alloc] init]; 
  11.     [self.navigationController pushViewController:vc animated:YES]; 

這樣寫的一個(gè)問題是,ViewControllerA需要import ViewControllerB,也就是對(duì)ViewControllerB產(chǎn)生了依賴。依賴的東西越多,維護(hù)起來就越麻煩,也容易出現(xiàn)循環(huán)依賴的問題,而objection正好可以處理這些問題。

實(shí)現(xiàn)方法是:先定義一個(gè)協(xié)議(protocol),然后通過objection來注冊(cè)這個(gè)協(xié)議對(duì)應(yīng)的class,需要的時(shí)候,可以獲取該協(xié)議對(duì) 應(yīng)的object。對(duì)于使用方無需關(guān)心到底使用的是哪個(gè)Class,反正該有的方法、屬性都有了(在協(xié)議中指定)。這樣就去除了對(duì)某個(gè)特定Class的依 賴。也就是通常所說的「面向接口編程」。

  1. JSObjectionInjector *injector = [JSObjection defaultInjector]; // [1] 
  2. UIViewController <ViewControllerAProtocol> *vc = [injector getObject:@protocol(ViewControllerAProtocol)]; // [2] 
  3. vc.backgroundColor = [UIColor lightGrayColor]; // [3] 
  4. UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc]; 
  5. self.window.rootViewController = nc; 

[1] 獲取默認(rèn)的injector,這個(gè)injector已經(jīng)注冊(cè)過ViewControllerAProtocol了。

[2] 獲取ViewControllerAProtocol對(duì)應(yīng)的Object。

[3] 拿到VC后,設(shè)置它的某些屬性,比如這里的backgroundColor,因?yàn)樵赩iewControllerAProtocol里有定義這個(gè)屬性,所以不會(huì)有warning。

可以看到這里沒有引用ViewControllerA。再來看看這個(gè)ViewControllerAProtocol是如何注冊(cè)到 injector中的,這里涉及到了Module,對(duì)Protocol的注冊(cè)都是在Module中完成的。Module只要繼承 JSObjectionModule這個(gè)Class即可。

  1. @interface ViewControllerAModule : JSObjectionModule 
  2. @end 
  3.  
  4. @implementation ViewControllerAModule 
  5. - (void)configure 
  6.     [self bindClass:[ViewControllerA class] toProtocol:@protocol(ViewControllerAProtocol)]; 
  7. @end

綁定操作是在configure方法里進(jìn)行的,這個(gè)方法在被添加到injector里時(shí)會(huì)被自動(dòng)觸發(fā)。

  1. JSObjectionInjector *injector = [JSObjection defaultInjector]; // [1] 
  2. injector = injector ? : [JSObjection createInjector]; // [2] 
  3. injector = [injector withModule:[[ViewControllerAModule alloc] init]]; // [3] 
  4. [JSObjection setDefaultInjector:injector]; // [4] 

[1] 獲取默認(rèn)的 injector

[2] 如果默認(rèn)的 injector 不存在,就新建一個(gè)

[3] 往這個(gè) injector 里注冊(cè)我們的 Module

[4] 設(shè)置該 injector 為默認(rèn)的 injector

這段代碼可以直接放到 + (void)load里執(zhí)行,這樣就可以避免在AppDelegate里import各種Module。

因?yàn)槲覀儫o法直接獲得對(duì)應(yīng)的Class,所以必須要在協(xié)議里定義好對(duì)外暴露的方法和屬性,然后該Class也要實(shí)現(xiàn)該協(xié)議。

  1. @protocol ViewControllerAProtocol <NSObject> 
  2. @property (nonatomic) NSUInteger currentIndex; 
  3. @property (nonatomic) UIColor *backgroundColor; 
  4. @end 
  5.  
  6. @interface ViewControllerA : UIViewController <ViewControllerAProtocol> 
  7. @end

通過objection實(shí)現(xiàn)依賴注入后,就能更好地實(shí)現(xiàn)SRP(Single Responsibility Principle),代碼更簡潔,心情更舒暢,生活更美好。拿Pinterest來說,下面的頁面就可以劃分為3個(gè)Section。

各個(gè)Section可以由不同的人負(fù)責(zé),然后串到一起就行,也能一定程度地避免MVC(Mess View Controller)的出現(xiàn)。

總體來說,這個(gè)lib還是挺靠譜的,已經(jīng)維護(hù)了兩年多,也有一些項(xiàng)目在用,對(duì)于提高開發(fā)成員的效率也會(huì)有不少的幫助,可以考慮嘗試下。

轉(zhuǎn)自無網(wǎng)不剩的博客

責(zé)任編輯:閆佳明 來源: blog.leezhong
相關(guān)推薦

2013-03-11 10:10:03

2013-03-11 10:00:13

前端模塊化

2013-08-20 16:33:52

前端模塊化

2010-08-02 09:21:48

Flex模塊化

2023-02-15 22:13:19

客戶端Android

2017-05-12 14:00:07

大數(shù)據(jù)前端模塊化開發(fā)

2023-11-08 13:55:27

2023-10-17 09:19:34

開發(fā)Java

2020-11-09 10:46:35

CommonJS

2019-09-02 10:51:59

Python腳本語言程序員

2010-08-02 09:10:36

Flex模塊化

2021-01-05 20:24:04

Git開源軟件開發(fā)

2024-01-25 09:00:00

DevOps人工智能

2011-01-11 13:40:44

webcssdiv

2019-01-30 14:04:57

Fedora存儲(chǔ)庫

2024-11-06 15:54:20

2019-08-28 16:18:39

JavaScriptJS前端

2025-06-06 01:00:00

Spring場(chǎng)景范式

2023-08-11 18:16:08

DevOps開發(fā)

2024-02-21 09:32:18

開發(fā)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久爱综合 | 韩日av在线 | 天天操夜夜操免费视频 | 91亚洲国产成人精品一区二三 | 欧美日韩亚洲一区 | 精品欧美一区二区三区免费观看 | 久久中文字幕一区 | 久久久精品一区二区三区 | 免费欧美 | 欧美区在线观看 | 精品国产欧美一区二区三区成人 | 一级欧美日韩 | 国产亚洲区 | 91色网站 | 亚洲欧美一区二区三区视频 | 日韩一区二区三区在线视频 | 欧美日韩一区在线 | 成人福利电影 | 九九热热九九 | 不卡一区二区三区四区 | 精品中文在线 | 一区二区三区四区免费观看 | 欧美人成在线视频 | 成人欧美一区二区 | a天堂在线 | 精品国产色| 97精品超碰一区二区三区 | 九九久久久 | 特级黄一级播放 | 日本成人午夜影院 | 亚洲国产精品视频 | 人碰人操 | 天天精品在线 | 97热在线 | 欧美日韩黄色一级片 | 亚洲欧美在线一区 | 精品久久久久久国产 | 久久精品一区 | 伊人久久精品一区二区三区 | 伊人无码高清 | 九色 在线 |