从代码拆分到VIPER架构演化

减小焦点,叠加信息

《ViewController代码拆分实践》
http://www.jianshu.com/p/f30438b89bc6

上篇文章里,我们把ViewController按视图、网络请求、本地存储、页面跳转四层进行拆分。

拆分之后,ViewController的代码足够少,而因为是采用协议对象的方式进行拆分,后续的可维护性和可扩展性又足够高。

今天,我们多走一步:实现VIPER架构。

我们看看拆分代码后的ViewController.h。

#import "ViewInterface.h"
#import "APIInterface.h"
#import "StoreInterface.h"
#import "RouteInterface.h"

@interface ViewController : UIViewController<ViewInterface>

@property (nonatomic, weak) id<ViewInterface> viewModel;
@property (nonatomic, weak) id<APIInterface> apiHandle;
@property (nonatomic, weak) id<StoreInterface> storeHandle;
@property (nonatomic, weak) id<RouteInterface> routeHandle;
@end

引用4个Interface,声明了4个协议对象。把ViewControler里的4个层次的事件消息通过4个协议对象进行分发。

4个,我们还是嫌太多。如果只有1个就好了,这样我们做ViewController消息分发时就不用考虑向哪个协议对象分发了。

说干就干,把4个协议对象合成1个:

@interface ViewController : UIViewController<ViewInterface>

@property (nonatomic, weak) id<ViewInterface,APIInterface,StoreInterface,RouteInterface> eventHandle;
@end

把原来由4个协议对象分别引用方法的地方,全部改为由eventHandle引用。

self.hotList = [self.eventHandle unarchive];
[self.eventHandle loadData];
return [self.eventHandle configureWithCell:cell data:data];
[self.eventHandle pushDetailInterfaceFromViewController:self detailData:detailData];
[self.eventHandle archiveWithObject:self.hotList];

把4个Interface的引用,合并成一个:

#import <UIKit/UIKit.h>

#ifndef ViewControllerSplit_EventInterface_h
#define ViewControllerSplit_EventInterface_h
@protocol ViewInterface <NSObject>

@optional
- (void)hotListWtihData:(NSArray *)data;
- (UITableViewCell *)configureWithCell:(UITableViewCell *)cell data:(NSDictionary *)data;
@end

@protocol APIInterface <NSObject>

@optional
- (void)loadData;
@end

@protocol StoreInterface <NSObject>

@optional
- (id)unarchive;
- (void)archiveWithObject:(id)object;
@end

@protocol RouteInterface <NSObject>

@optional
- (void)pushDetailInterfaceFromViewController:(UIViewController *)viewController detailData:(NSDictionary *)detailData;
@end
#endif

于是ViewController.h被简化到了极致:

#import <UIKit/UIKit.h>
#import "EventInterface.h"

@interface ViewController : UIViewController<ViewInterface>

@property (nonatomic, weak) id<ViewInterface,APIInterface,StoreInterface,RouteInterface> eventHandle;
@end

我们新建一个实际处理四层消息的类,名字为Presenter:

#import <Foundation/Foundation.h>
#import "EventInterface.h"

@interface Presenter : NSObject<ViewInterface,APIInterface,StoreInterface,RouteInterface>
@end

至此,我们完成了土制代码拆分到高大上的VIPER架构演化的全部过程。

VIPER,无非是通过Presenter统一转发ViewController的消息,使ViewController从臃肿和紧耦合中解脱出来,让ViewController更小更少依赖,方便维护、复用。

Presenter收到ViewController转发过来的消息,分别向Interactor(API, Store)、WireFrame(View, Route)转发处理。

本质上都一样:通过消息转发,把代码扔出本类,进行黑箱复用。

后记(下面以聊家常为主,没时间没兴趣的朋友请直接忽略):

准确地说,我前天晚上非常开心。因为我从《无头骑士异闻录×2》想到了:只有深钻才能摆脱无聊。

我们很害怕生活很普通。普通得自己像没在这个世界存在过一样。但如果我们继续肤浅、表面地活着,不管我们多么有钱有势,还是无法摆脱恐怖的无聊感。

而那些但凡有任何一件事情可以去深钻的人,却不会有这样的无聊感,他们只有深钻精彩的忙碌感。只擅长这个啊。时间不够用不够用啊。

从此,我努去让自己把关注的焦点一再减少缩小,然后把所有时间精力人脉全部投入到这个足够小的点上。通过高强度的信息轰炸,消灭掉这一个点。彻底解决掉它。

随着我越钻越深,自然会有越来越多有趣的人和事会找到我。那时,我只需要随随便便地忙碌着,生活就会被得足够有趣。

我自己做了一家三口焦点表,没有这方面经验的朋友可以参考一下:

我:
老婆| 儿子| 健身| 读书| 编程
日语| 玩具| 腹腰| 算法| 项目

老婆:
老公| 儿子| 健身| 读书| 手工
日语| 玩具| 瑜珈| 天文| 科技

儿子:
妈妈| 爸爸| 健身| 读书| 外出
日语| 玩具| 跑步| 科技| 艺术

世界上的所有事情,无论什么基础,无论什么背景,无论什么环境,通通全部都必须按两步去解决:
1、减小焦点
2、叠加信息

今天想明白一件事情:粉丝群的功能。
粉丝群只有一个功能:粉丝帮助群主思考,粉丝帮助群主做事。

没错,我建粉丝群,不是为了帮任何人,而只是希望能得到别人的帮助。如果你觉得我值得你帮,欢迎进来。如果你只希望我或我的粉丝群友帮你,请你滚开,我踢不留情:)

iOS开发,读书狂魔
清醒疯子利炳根粉丝群:147043528

长久以来,我一直害怕别人觉得我是新手、太弱。其实没关系,我现在确实还很新手很菜很弱啊。但,不管怎么样,我会继续努力啦。

分享一部纪录片《中国的秘密》
http://qianmo.com/u/6292/5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容