我正在参与「启航计划」
1. 前语: 规划形式可以在大型项目中有哪些可落地的优化?
- 笔者目前担任一个中大型iOS项目,用PPRows跑一下项目根文件,目前代码量约28W。
- 在这样一个大型项目中,我们组用了哪些办法对事务逻辑及代码架构进行解耦呢?
- 在这种代码量级的项目中,有哪些接地气的,可落地的优化经验呢?
- 在此抛砖引玉,欢迎我们一同彼此讨论。
2. 落地
2.1 选用单例形式 做一个更加单一责任的广告管理类.
2.1.1 单例形式导图
2.1.2 单例形式, 中心类文件构成
2.1.3 选用单例形式解耦, 中心代码文件解说
2.1.3.1 界说一个继承自NSObject
的单例广告管理类ADManager
- ADManager.h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ADManager : NSObject
/// 供外部一致运用的单例类办法
+ (instancetype)sharedInstance;
@end
NS_ASSUME_NONNULL_END
- ADManager.m文件
#import "ADManager.h"
@implementation ADManager
+ (instancetype)sharedInstance {
// 静态局部变量
static ADManager *adManager = nil;
// 经过dispatch_once办法, 保证instance在多线程环境下只被创立一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 调用父类的办法创立实例, 避免跟重写本身的allocWithZone发生循环调用
adManager = [[super allocWithZone:NULL] init];
});
return adManager;
}
// 重写本身的allocWithZone, 应对不运用sharedInstance办法直接经过alloc创立对象的状况
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [self sharedInstance];
}
// MRC下重写copyWithZone, 应对经过copy仿制对象的状况, OBJC_ARC_UNAVAILABLE
+ (id)copyWithZone:(struct _NSZone *)zone {
return self;
}
@end
2.1.3.2 实践事务运用单例形式示例
//
// Viewontroller.m
// appDesignPattern
//
// Created by JackLee on 2022/9/21.
//
#import "ViewController.h"
#import "ADManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 测验单例形式
[self testSingleADManager];
}
/// 测验单例形式
- (void)testSingleADManager {
ADManager *adManager = [ADManager sharedInstance];
ADManager *adManager2 = [ADManager new];
NSLog(@"adManager === %@ ptr === %p", adManager, adManager);
NSLog(@"adManager2 === %@ ptr === %p", adManager2, adManager2);
}
2.2 选用指令形式使行为参数化, 下降代码重合度
2.2.1 指令形式导图
2.2.2 指令形式, 中心类文件构成
2.2.3 指令形式对行为进行参数化处理以解耦, 中心代码文件解说
2.2.3.1 界说一个笼统指令类Command
- Command.h文件
#import <Foundation/Foundation.h>
@class Command;
typedef void(^CommandCompletionCallBack)(Command *cmd);
@interface Command : NSObject
// 指令完结的回调
@property (nonatomic, copy) CommandCompletionCallBack completion;
/// 履行指令
- (void)execute;
/// 撤销指令
- (void)cancel;
/// 完结指令
- (void)done;
@end
- Command.m文件
#import "Command.h"
#import "CommandManager.h"
@implementation Command
- (void)execute {
// override to subclass, 交给子类复写详细完结
// [self done];
}
- (void)cancel {
self.completion = nil;
}
- (void)done {
// 考虑到多线程的状况, 异步回到主行列
dispatch_async(dispatch_get_main_queue(), ^{
if (self.completion) {
self.completion(self);
}
// 释放
self.completion = nil;
[[CommandManager sharedInstance].arrayCommands removeObject:self];
});
}
@end
- 详细的点赞指令
LikedCommand.h
#import "Command.h"
NS_ASSUME_NONNULL_BEGIN
@interface LikedCommand : Command
@end
NS_ASSUME_NONNULL_END
- 详细的点赞指令
LikedCommand.m
#import "LikedCommand.h"
@implementation LikedCommand
- (void)execute {
NSLog(@"履行点赞操作 ====");
[self done];
}
@end
- 详细的共享指令
ShareCommand.h
#import "Command.h"
NS_ASSUME_NONNULL_BEGIN
@interface ShareCommand : Command
@end
NS_ASSUME_NONNULL_END
- 详细的共享指令
ShareCommand.m
#import "ShareCommand.h"
@implementation ShareCommand
- (void)execute {
NSLog(@"履行共享操作 ====");
[self done];
}
@end
- 指令管理类
CommandManager.h
#import <Foundation/Foundation.h>
#import "Command.h"
NS_ASSUME_NONNULL_BEGIN
@interface CommandManager : NSObject
/// 指令管理容器
@property(nonatomic, copy) NSMutableArray <Command *>*arrayCommands;
/// 指令管理者提供单例办法供运用者调用
+ (instancetype)sharedInstance;
/// 履行指令
+ (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion;
/// 撤销指令
+ (void)cancelCommand:(Command *)cmd;
@end
NS_ASSUME_NONNULL_END
- 指令管理类
CommandManager.m
#import "CommandManager.h"
@implementation CommandManager
+ (instancetype)sharedInstance {
static CommandManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init];
});
return instance;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [self sharedInstance];
}
+ (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion {
if (cmd) {
// 假如指令正在履行不做处理, 否则增加并履行指令
if (![self _isExecutingCommand:cmd]) {
// 增加到指令容器傍边
[[[self sharedInstance] arrayCommands] addObject:cmd];
// 设置详细指令履行完结后的回调
cmd.completion = completion;
// 调用详细指令履行办法
[cmd execute];
}
}
}
+ (void)cancelCommand:(Command *)cmd {
if (cmd) {
// 从指令容器傍边移除
[[[self sharedInstance] arrayCommands] removeObject:cmd];
// 撤销指令履行
[cmd cancel];
}
}
+ (BOOL)_isExecutingCommand:(Command *)cmd {
if (cmd) {
NSArray *cmds = [[self sharedInstance] arrayCommands];
for (Command *aCmd in cmds) {
// 当前指令正在履行
if (cmd == aCmd) {
return YES;
}
}
}
return NO;
}
@end
2.2.3.2 实践事务运用指令形式示例
//
// Viewontroller.m
// appDesignPattern
//
// Created by JackLee on 2022/9/21.
//
#import "ViewController.h"
#import "LikedCommand.h"
#import "ShareCommand.h"
#import "CommandManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 测验指令形式
[self testCommand];
}
/// 测验指令形式
- (void)testCommand {
LikedCommand *liked = [LikedCommand new];
ShareCommand *share = [ShareCommand new];
[CommandManager executeCommand:liked completion:^(Command *cmd) {
NSLog(@"点赞指令完结回调 cmd === %@", cmd);
}];
[CommandManager executeCommand:share completion:^(Command *cmd) {
NSLog(@"共享指令完结回调 cmd === %@", cmd);
}];
}
@end
发文不易, 喜爱点赞的人更有好运气 :), 定时更新+关注不迷路~
ps:欢迎参加笔者18年树立的研讨iOS审阅及前沿技术的三千人扣群:662339934,坑位有限,补白“网友”可被群管经过~