我正在参加「启航计划」
1. 前语: 设计形式可以在大型项目中有哪些可落地的优化?
- 本人现在负责一个中大型iOS项目,用PPRows跑一下项目根文件,现在代码量约28W。
- 在这样一个大型项目中,我们组用了哪些办法对事务逻辑及代码架构进行解耦呢?
- 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
- 在此抛砖引玉,欢迎大家一起相互探讨。
2. 落地: 采用职责链形式 应对产品大大提出的事务改变, 对事务代码进行解耦.
2.1 职责链形式导图
2.2 职责链形式解耦, 中心类文件构成
2.3 职责链形式解耦, 中心代码文件解说
2.3.1 界说一个抽象的基类BusinessObject
- BusinessObject.h文件
#import <Foundation/Foundation.h>
//NS_ASSUME_NONNULL_BEGIN
@class BusinessObject;
/// 某一事务完成之后, 回来的成果是否有处理掉这个事务
typedef void(^CompletionBlock)(BOOL handled);
/// 这个事务对应的处理者, 有没有处理好这个事务
typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled);
@interface BusinessObject : NSObject
/// 下一个呼应者(呼应链构成的关键)
@property (nonatomic, strong) BusinessObject *nextBusiness;
/// 呼应者的处理办法
- (void)handle:(ResultBlock)result;
/// 各个事务在该办法傍边做实践事务处理, 完成之后成果回来给调用方
- (void)handleBusiness:(CompletionBlock)completion;
@end
- BusinessObject.m文件
#import "BusinessObject.h"
@implementation BusinessObject
/// 职责链进口办法
-(void)handle:(ResultBlock)result {
CompletionBlock completion = ^(BOOL handled){
// 当时事务处理掉了,上抛成果
if (handled) {
result(self, handled);
}
else {
// 沿着职责链,指派给下一个事务处理
if (self.nextBusiness) {
[self.nextBusiness handle:result];
}
else {
// 没有事务处理,上抛
result(nil, NO);
}
}
};
// 当时事务进行处理
[self handleBusiness:completion];
}
- (void)handleBusiness:(CompletionBlock)completion {
/**
事务逻辑处理
例如异步网络恳求、异步本地照片查询等
交给子类复写
*/
}
@end
- 例如需要处理网络恳求的事务A
BusinessA
- 事务A的
BusinessObject.h
文件
#import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessA : BusinessObject
@end
NS_ASSUME_NONNULL_END
- 事务A的
BusinessObject.m
文件
#import "BusinessA.h"
@implementation BusinessA
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"处理事务A");
// 事务次序: A -> B -> C
// completion(NO);
// 事务次序: C -> B -> A
completion(YES);
}
@end
- 事务B的
BusinessObjectB.h
文件
#import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessB : BusinessObject
@end
NS_ASSUME_NONNULL_END
- 事务B的
BusinessObjectB.m
文件
#import "BusinessB.h"
@implementation BusinessB
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"处理事务B");
// 事务次序: A -> B -> C
// completion(NO);
// 事务次序: C -> B -> A
completion(NO);
}
@end
- 事务C的
BusinessObjectC.h
文件
#import "BusinessObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface BusinessC : BusinessObject
@end
NS_ASSUME_NONNULL_END
- 事务C的
BusinessObjectC.m
文件
#import "BusinessC.h"
@implementation BusinessC
- (void)handleBusiness:(CompletionBlock)completion {
NSLog(@"处理事务C");
// 事务次序: A -> B -> C
// completion(YES);
// 事务次序: C -> B -> A
completion(NO);
}
@end
2.3.2 实践事务运用职责链形式办法
//
// ViewController.m
// appDesignPattern
//
// Created by JackLee on 2022/9/21.
//
#import "ViewController.h"
#import "BusinessA.h"
#import "BusinessB.h"
#import "BusinessC.h"
#import "appDesignPattern-Swift.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self testBusiness];
}
- (void)testBusiness {
BusinessA *businessObjA = [BusinessA new];
BusinessB *businessObjB = [BusinessB new];
BusinessC *businessObjC = [BusinessC new];
// 事务次序: A -> B -> C
// businessObjA.nextBusiness = businessObjB;
// businessObjB.nextBusiness = businessObjC;
// 事务次序: C -> B -> A
businessObjC.nextBusiness = businessObjB;
businessObjB.nextBusiness = businessObjA;
// 呼应者的处理办法, 职责链进口办法
/*
1. 当时事务处理掉了, 上抛成果
2. 当时事务没处理掉, 沿着职责链, 指派给下一个事务处理, 假如没有事务处理, 持续上抛
3. 对当时事务进行处理
handler:
handled: 事务处理成果
*/
// 事务次序: A -> B -> C
// [businessObjA handle:^(BusinessObject *handler, BOOL handled) {
//
//
// }];
// 事务次序: C -> B -> A
[businessObjC handle:^(BusinessObject *handler, BOOL handled) {
// handler: <BusinessA: 0x6000003da650>
// handled: YES
}];
}
发文不易, 喜爱点赞的人更有好运气 :), 定时更新+重视不走失~
ps:欢迎加入笔者18年建立的研讨iOS审阅及前沿技术的三千人扣群:662339934,坑位有限,补白“网友”可被群管通过~