一、关于协议的思考
协议,就是一个方法列表,它声明了可以被任意类实现的方法。换句话来说,就是所有的对象,只要遵循了该协议,则拥有了这个方法列表的方法的声明即对外的接口。
注:在iOS当中,协议经常与代理委托结合使用,但是,这两者之间不要混为一谈。
使用协议,可以给大家提供一种编写组件的思路,能让我们对项目的耦合性加深认识,先举一个例子.
/**
定义一套协议列表
*/
@protocol LBEmptyDataProtocol
- (void)lb_setEmptyNoData:(NSAttributedString *)title;
- (void)lb_setEmptyNoData:(NSAttributedString *)title
block:(LBEmptyDataBlock)block;
- (void)lb_setCustomView:(__kindof UIView *)customView;
- (void)lb_removeEmptyData;
@end
/**
让这个分类去实现这个协议,从而获得了接口
*/
@interface UIScrollView (LBEmptyData) <LBEmptyDataProtocol>
@end
// 功能的定制
@implementation UIScrollView (LBEmptyData)
- (void)lb_setEmptyNoData:(NSAttributedString *)title block:(LBEmptyDataBlock)block {
// ...
}
@end
// 其他类的功能补充与扩展.
@implementation UIView (LBEmptyData)
- (void)lb_setEmptyNoData:(NSAttributedString *)title block:(LBEmptyDataBlock)block {
// 不同的实现逻辑
}
@end
可以运用这个协议,很方便的对我们的组件进行扩展(这里是针对分类进行的扩展)。这样的扩展,可以让不同实现的功能逻辑,保留相同的对外接口,是可以对组件进行拓展,而不会污染原来的代码、也不会引起已有功能逻辑产生改变的一种实现方式。
组件写完自然是要做成Spec私有库的,方便自己或者别人进行维护;而关于协议的其他东西, 这里就不啰嗦了,网上有太多的讲解了。
二、关于继承与协议的思考
继承是面向对象的三大特性之一(其实读书是真的有用,书本的概念能得到的转化,是十分收益的),我们在写代码的时候,它能发挥快速开发的巨大作用。但是不加以思考,乱用继承,将会给项目的扩展带来耦合灾难。
我们在使用继承的时候,应该将一下几点考虑在内:
- 父类作为服务的提供者,不应该参与到子类的业务逻辑,业务逻辑与服务的区分,需要在项目中多多练习;
- 父类的继承应当考虑2层或2层以上的情况,同一级的逻辑应当处于同一级继承树之中;
- 父类的改动会引起子类的变化,这种耦合性是必需的,我们需要的是把这种耦合性考虑成制作父类的需求,简单的来说,耦合是一种特征,但它不是贬义的,当耦合变成需求的时候,耦合就不再是缺陷了;
我们常常会使用继承来使得对象能够响应某个函数,举个例子:
我们制作视频聊天有一个开启视频的方法play,调用后会让后台的推送通知响应者接收视频进入聊天室。当业务发生变化,允许一些指定的监标人(观众)观看整个视频直播的过程,这时候开启视频的方法将会不同,使用继承的实现如下:
#import <Foundation/Foundation.h>
@class LBVideoChatMeetingManager;
// 视频会议成员
@interface LBVideoChatMeetingManager : NSObject
- (void)play;
@end
// 视频会议监标人(观众)
@interface LBSupervisorVideoChatMeetingManager : LBVideoChatMeetingManager
@end
但是这两个类对于函数的实现,并没有太多共同的代码,他们所需要的只是具有相同的外部接口而已。这时候使用协议,将是十分合理而准确的做法:
#import <Foundation/Foundation.h>
@class LBVideoChatMeetingManager;
@protocol LBVideoChatMeetingProtocol <NSObject>
- (void)play;
@end
// 视频会议成员
@interface LBVideoChatMeetingManager : NSObject <LBVideoChatMeetingProtocol>
@end
// 视频会议监标人(观众)
@interface LBSupervisorVideoChatMeetingManager : NSObject <LBVideoChatMeetingProtocol>
@end
我们在写代码的时候,不仅要考虑的怎么样快速开发,方便迭代,还养成思考项目架构的习惯,对于iOS架构的思考,还需要不断的前行。。。
@end