IOS博客项目搭建-19-项目重构-封装业务工具类
2016-06-02 00:00
375 查看
上一节对网络请求做了封装,但是还是存在一些问题,本节将对项目的业务逻辑进行重构。
#为何需要重构?
##第一个问题
上一节对网络请求做了封装,但是还是存在一些问题,我们可以看看首页,每一个方法都做具体的业务逻辑,如获取用户信息,控制器太关注业务信息了,如控制器对请求的URL知道的太清楚,GET:@"https://api.weibo.com/2/users/show.json" parameters:params,我们希望控制器不用太关注URL,如果以后该URL改变了,其他地方也在用,那么以后修改起来特别麻烦。
##第二个问题
我们现在是面向字典开发,这样有一个问题,就是字典的Key很容易写错。
还有,如下面这个方法,加载首页的数据方法,需要传一个字典类型的参数,但是通过这个字典我们不清楚字典里边应该放那些Key,放什么东东,不是很清楚,没有将业务逻辑描述很清楚,别人要使用你的方法,会一头雾水,所以这个方法写的很失败。那应该怎样处理呢?我觉得应该面向模型,用模型类封装这些属性。
###解决方法:
####在首页的Model目录下创建首页数据模型类 IWHomeStatusParam.h
###然后在Home(首页)/Tool/IWStatusTool.h文件中引入该模型类
从以上的封装可以看出,模型类参数比字典参数更容易让人懂,因为我们可以根据参数的模型类型,直接找到源文件的封装的参数的属性。
##第三个问题
首页获取网络数据,通过我们之前封装的HttpTool网络工具发送http请求,如果后边我们需要添加本地缓存,即当用户下次进入到App后,先是从本地缓存的沙盒加载数据,然后再从网络请求数据,这样需要怎么处理呢?很显然,之前封装的层级关系已经不能适用了。
首页要显示微博数据,有两种可能,第一种从本地缓存沙盒种获取数据,如果本地没有,则发送网络请求获取数据,所以,这里就不一定利用HttpTool加载数据(如上图的业务逻辑),我们可以假设有一个沙盒工具类 shaheTool,则首页加载数据就需要使用两个工具类,HttpTool和shaheTool,如下图:
首页展示微博数据,需要通过两个工具类,如果还有第三、四种可能,那么逻辑就很复杂也很混乱,业务逻辑就会经常的改,那么该如何处理呢?
为了让控制器受到最小伤害,我们可以再搞一个工具类IWStatusTool,用该工具类屏蔽业务细节,以后究竟是从沙盒或网络获取数据,可以通过该业务工具类来选择获取,控制器不需要关心;这样做的另一个好处就是,如果以后某个业务的具体功能改了,也不会影响控制器。
###工具类用途:
####IWStatusTool:业务工具类,即用来完成功能或业务的工具类,屏蔽业务实现细节。
####IWHttpTool:通用工具类,用来完成某种通用的技术,如网络请求。
#为何需要重构?
##第一个问题
上一节对网络请求做了封装,但是还是存在一些问题,我们可以看看首页,每一个方法都做具体的业务逻辑,如获取用户信息,控制器太关注业务信息了,如控制器对请求的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:通用工具类,用来完成某种通用的技术,如网络请求。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 超越Jquery_01_isPlainObject分析与重构
- 探讨Android与iOS,我们将何去何从?