您的位置:首页 > 移动开发 > IOS开发

IOS博客项目搭建-19-项目重构-封装业务工具类

2016-06-02 00:00 375 查看
上一节对网络请求做了封装,但是还是存在一些问题,本节将对项目的业务逻辑进行重构。

#为何需要重构?
##第一个问题
上一节对网络请求做了封装,但是还是存在一些问题,我们可以看看首页,每一个方法都做具体的业务逻辑,如获取用户信息,控制器太关注业务信息了,如控制器对请求的URL知道的太清楚,GET:@"https://api.weibo.com/2/users/show.json" parameters:params,我们希望控制器不用太关注URL,如果以后该URL改变了,其他地方也在用,那么以后修改起来特别麻烦。

##第二个问题
我们现在是面向字典开发,这样有一个问题,就是字典的Key很容易写错。

// 2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"access_token"] = [IWAccountTool account].access_token;

还有,如下面这个方法,加载首页的数据方法,需要传一个字典类型的参数,但是通过这个字典我们不清楚字典里边应该放那些Key,放什么东东,不是很清楚,没有将业务逻辑描述很清楚,别人要使用你的方法,会一头雾水,所以这个方法写的很失败。那应该怎样处理呢?我觉得应该面向模型,用模型类封装这些属性。

+ (void)homeStatusesWithParams:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure;

###解决方法:
####在首页的Model目录下创建首页数据模型类 IWHomeStatusParam.h



//
//  IWHomeStatusParam.h
//  ItcastWeibo
//  Created by kaiyi on 16-6-3.
//  Copyright (c) 2016年 itcast. All rights reserved.
//
// 封装加载首页微博数据的参数
#import <Foundation/Foundation.h>

@interface IWHomeStatusParam : NSObject

// 授权token
@property (nonatomic, copy) NSString *access_token;

// 返回ID比since_id大的微博
@property (nonatomic, assign) long long since_id;

@end

###然后在Home(首页)/Tool/IWStatusTool.h文件中引入该模型类

//
// IWStatusTool.h
// ItcastWeibo
//
// Created by kaiyi on 16-6-3.
// Copyright (c) 2016年 itcast. All rights reserved.
//// 业务处理类(工具类)

#import <Foundation/Foundation.h>
@class IWHomeStatusParam; // ********引入数据模型类*******

@interface IWStatusTool : NSObject

// 新的传入模型参数方法
+ (void)homeStatusesWithParam:(IWHomeStatusParam *)param success:(void (^)(id))success failure:(void (^)(NSError *))failure;

@end

// 旧的字典参数方法
// + (void)homeStatusesWithParams:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure;

从以上的封装可以看出,模型类参数比字典参数更容易让人懂,因为我们可以根据参数的模型类型,直接找到源文件的封装的参数的属性。

##第三个问题
首页获取网络数据,通过我们之前封装的HttpTool网络工具发送http请求,如果后边我们需要添加本地缓存,即当用户下次进入到App后,先是从本地缓存的沙盒加载数据,然后再从网络请求数据,这样需要怎么处理呢?很显然,之前封装的层级关系已经不能适用了。



首页要显示微博数据,有两种可能,第一种从本地缓存沙盒种获取数据,如果本地没有,则发送网络请求获取数据,所以,这里就不一定利用HttpTool加载数据(如上图的业务逻辑),我们可以假设有一个沙盒工具类 shaheTool,则首页加载数据就需要使用两个工具类,HttpTool和shaheTool,如下图:



首页展示微博数据,需要通过两个工具类,如果还有第三、四种可能,那么逻辑就很复杂也很混乱,业务逻辑就会经常的改,那么该如何处理呢?

为了让控制器受到最小伤害,我们可以再搞一个工具类IWStatusTool,用该工具类屏蔽业务细节,以后究竟是从沙盒或网络获取数据,可以通过该业务工具类来选择获取,控制器不需要关心;这样做的另一个好处就是,如果以后某个业务的具体功能改了,也不会影响控制器。



###工具类用途:
####IWStatusTool:业务工具类,即用来完成功能或业务的工具类,屏蔽业务实现细节。

####IWHttpTool:通用工具类,用来完成某种通用的技术,如网络请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息