依赖注入 (DI) 在 iOS 开发中的应用
本文介绍如何应用依赖注入的思想,降低 iOS 代码耦合度
依赖注入(dependency injection)是一种面向对象编程中降低代码耦合度的技术。
这个技术的核心非常简单,就是对象所依赖的服务,要由接口提供注入,从而实现将这些系统服务从你编写的对象 class 里面解耦的目的。
这样做的最大好处是你写的类会将依赖剔除,变成独立的模块,所以易于复用以及测试。
在 iOS 开发中经常会使用到各种 sharedInstance
,如果我们在类里面用到这些 sharedInstance,这个类就会隐含了对它的依赖:
@interface MusicPlayer
@end
@implementation
- (void)playMusic
{
[[AVAudioSession sharedInstance] setCatgory:AVAudioSessionCategoryPlayAndRecord];
}
@end
应用依赖注入的思想,我们应该把 AVAudioSession 这个系统服务作为外部依赖,传入这个对象:
@interface MusicPlayer
@property (strong) AVAudioSession *session
@end
- (void)
- (instancetype)initWithAudioSession:(AVAudioSession *)session
{
self = [super init];
if (self) {
_session = session;
}
return self;
}
@implementation
- (void)playMusic
{
[self.session setCatgory:AVAudioSessionCategoryPlayAndRecord];
}
@end
这样,MusicPlayer 类将隐含对 AVAudioSession 的依赖,转换为一个注入的对象,从外部看来,可以清晰地看到这个类对 AVAudioSession 的依赖。
这时如果要测试 MusicPlayer ,就可以比较轻松传入一个 AVAudioSession 的 Mock 对象来实现测试目的。
这里只是以 AVAudioSession 为例子,事实上在项目中,我们会有各种各样的系统级、应用级自定义的公共服务,譬如:
NSNotificationCenter FileManager UserSessionManager …
这些服务都可以通过依赖注入的思想传入你编写的对象当中。
通过对依赖注入概念的理解,我们在 iOS 开发中不需要引入华丽的框架,只要在写代码的时候有这个思想,就自然会降低我们代码的耦合度。
推荐阅读:
Posted 2018-04-28