1. 面向文档架构设计
文档要求:
-
视图操作需求, 包括页面中所有需要调用网络接口的逻辑, 比如跳转, 刷新等请求.
-
网络通信接口, 对于目前sender层的一次解耦封装, 目的是不过于依赖sender层, 避免一套请求逻辑写很多遍.
-
传输数据类型, 类似项目中的cachebean, 但不依赖cachebean. 针对不同需求可选添加状态机制, 页面遵循状态渲染.
文档协议样张:
#import <UIKit/UIKit.h> #import <WonderfulMallHome.pb.h> @protocol HYSpecialSaleViewOperation <NSObject> //定义视图操作需求 - (void)pushToNextViewController: (NSString *)targetUrl; - (void)pullDownRefresh; @end @protocol HYSpecialSaleModelInterface <NSObject> //定义传输数据类型 @property(nonatomic) NSInteger tabId ; @property(nonatomic,strong) NSMutableArray * activityTe mplates ; @end @protocol HYSpecialSaleViewModelInterface <NSObject> //定义网络通信接口 @property (nonatomic,strong) id<HYSpecialSaleModelInterface> model; - (void)initializeWithParameter:(NSDictionary *)parameter finishedCallBack:(void(^)())finishCallBack; - (void)pullDownRefreshWithFinishedCallBack:(void(^)())finishCallBack; @end @protocol HYSpecia
lSaleViewInterface <NSObject> @property (nonatomic,strong) id<HYSpecialSaleViewModelInterf
ace> hyspecialsaleViewModel; @property (nonatomic,strong) id<HYSpecialSaleViewOperation> hysp
ecialsaleOperation; @end
期望实现非开发人员通过阅读文档协议能够基础的了解该页面的大致逻辑功能, 并能够清晰的定位具体功能函数.
2. 架构设计模式浅析
├── Template //模板文件
│ ├── ControllerTemplate.h //控制器
│ ├── ControllerTemplate.m
│ ├── InterfaceTemplate.h //文档协议
│ ├── ModelTemplate.h //传输数据类型
│├── ModelTemplate.m
│ ├── PresenterTemplate.h //视图操作需求
│ ├── PresenterTemplate.m
│ ├── ViewModelTemplate.h //网络通信接口
│ ├── ViewModelTemplate.m
│├── ViewTemplate.h //UI层
│ └── ViewTemplate.m
根据文档协议, 生成各自的ModelTemplate, PresenterTemplate, ViewModelTemplate, ViewTemplate, 生成的对象必须遵循文档协议的定义, 控制器用来协调 PresenterTemplate, ViewModelTemplate, ViewTemplate 三者的通信
Model层
用来统筹页面使用的数据, 类似于项目中的cachebean, 但和cachebean不同的是, 可以在model中加入状态机制, UI逻辑可以根据网络请求后的状态机制来判断显示UI, 状态的制定根据具体产品文档的定义. 代码中可以使用枚举来区分状态.
#import <Foundation/Foundation.h> #import "HYSpecialSaleInterface.h" @interface HYSpecialSaleModel : NSObject <HYSpecialSaleModelInterface> @property(nonatomic) NSInteger tabId ; @property(nonatomic,strong) NSMutableArray * activityTemplates ; - (instancetype)initWithDictionary:(NSDictionary *)dictionary; + (HYSpecialSaleModel *)modelWithDictionary:(NSDictionary *)dictionary; @end
Presenter层
用于统筹页面的交互逻辑, 这里的交互逻辑是需要调用接口的交互逻辑, 本职工作是用于将ViewModel的数据正确传输到View的过程, 并在此更改状态机, 用来实现UI层逻辑在View层内实现. 上一页面传输来的参数通过控制器传输至Presenter层进行保存. 每次用户交互后重置ViewModel的数据, 实现单向的动态绑定.
#import <UIKit/UIKit.h> #import "HYSpecialSaleInterface.h" @interface HYSpecialSalePresenter : NSObject<HYSpecialSaleViewOperation> @property (nonatomic,assign) NSInteger tabId; @property (nonatomic,weak) id<HYSpecialSaleViewInterface> hyspecialsaleView; @property (nonatomic,weak) id<HYSpecialSaleViewModelInterface> hyspecialsaleViewModel; - (void)adapterWithHYSpecialSaleView:(id<HYSpecialSaleViewInterface>) hyspecialsaleView hyspecialsaleViewModel:(id<HYSpecialSale ViewModelInterface>)hyspecialsaleViewModel;
@end
ViewModel层
用于统筹页面的接口调用, 对Model进行持有, 使得Model不直接与任意对象进行交互,确保数据的安全性, 可将所有的数据获取及修改数据结构的逻辑封装在该层, 可以实现接口的互相调用.
#import <Foundation/Foundation.h>
#import "HYSpecialSaleInterface.h"
@interface HYSpecialSaleViewModel : NSObject
<HYSpecialSaleViewModelInterface>
@property (nonatomic,strong)
id<HYSpecialSaleModelInterface> model;
- (void)initializeWithParameter:(NSDictionary *)parameter
finishedCallBack:(void(^)())finishCallBack;
- (void)pullDownRefreshWithFinishedCallBack:(void(^)())finishCallBack;
@end
View层
用于UI层的展示, 所有的UI层都基于可复用的TableView, 持有用户交互操作及ViewModel数据的绑定. 在View层所有的用户交互实现直接调用文档协议中的视图操作函数即可, 不必关系具体的实现流程, 当请求完成后会更新ViewModel数据, 进行页面的刷新, 特殊的UI逻辑根据状态机进行判断即可.
#import <UIKit/UIKit.h> #import "HYSpecialSaleInterface.h"@interface HYSpecialSaleView : UIView <HYSpecialSaleViewInterface> @property (nonatomic,strong) id<HYSpecialSaleViewOperation> hyspecialsaleOperation;@property (nonatomic,strong) id<HYSpecia
lSaleViewModelInterface> hyspecialsaleViewModel;@end
3. 文档设计代码规范
所有的函数方法的命名使用驼峰式的命名方法, 避免使用缩写, 如之前的cachebean缩写成cb这种是绝对要避免的, 对于BOOL值得命名需要在参数名前加上is来进行区分, 期望做到代码即为注释, 让非开发人员通过仅仅看代码就能够知道业务逻辑.
#import <UIKit/UIKit.h>
@protocol <#Unit#>ViewOperation <NSObject>
<#ViewOperation#>
@end
@protocol <#Unit#>ModelInterface <NSObject>
<#ModelInterface#>
@end
@protocol <#Unit#>ViewModelInterface <NSObject>
@property (nonatomic,strong) id<<#Unit#>ModelInterface> model;
-(void)initializeWithParameter:(NSDictionary *)parameter finishedCallBack:(void(^)())finishCallBack;
<#ViewModelInterface#>@end@protocol <#Unit#>ViewInterface <NSObject>
@property (nonatomic,strong) id<<#Unit#>ViewModelInterface>
<#unit#>ViewModel;
@property (nonatomic,strong) id<<#Unit#>ViewOperation> <#unit#>Operation;
@end
{ "super" : "", //父类的前缀 "controller" : "Home", //控制器的前缀名 "model" : { //模型的属性定义 "models" : "Array" }, "viewModel" : [ //获取数据的方法定义 "register", "login", "exit", "refresh" ], "presenter" : [ //用户交互的方法定义 "pushToNextViewController", "popToRootViewController", "showAlert", "closeButtonClick" ] }
文档模板可以通过任意数据结构进行生成, 文档模板中的<#Unit#>为该页面的前缀名, 如"HYHome", "HYSpecialSale"等.