我正在参加「启航计划」

1. 前语: 设计形式可以在大型项目中有哪些可落地的优化

  • 本人现在负责一个中大型iOS项目,用PPRows跑一下项目根文件,现在代码量约28W。
  • 在这样一个大型项目中,我们组用了哪些办法对事务逻辑及代码架构进行解耦呢?
  • 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
  • 在此抛砖引玉,欢迎大家一起相互探讨。

iOS老司机可落地的中大型iOS项目中的设计模式优化Tips

2. 落地: 采用职责链形式 应对产品大大提出的事务改变, 对事务代码进行解耦.

2.1 职责链形式导图

iOS老司机可落地的中大型iOS项目中的设计模式优化Tips

2.2 职责链形式解耦, 中心类文件构成

iOS老司机可落地的中大型iOS项目中的设计模式优化Tips

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,坑位有限,补白“网友”可被群管通过~