接口隔离原则
接口隔离原则的英文是Interface Segregation Principle,缩写为ISP。英文描述为Clients should not be forced to depend upon interfaces that they do not use。翻译成中文就是:客户端不应该被强迫依赖它不需要的接口。客户端可以理解为接口的调用者或者使用者。
微服务用户系统提供了一组跟用户相关的API给其他系统使用,比如:注册、登录、获取用户信息等。代码如下
@protocol DMUserService <NSObject>
- (BOOL)registerWithCellPhone:(NSString *)cellPhone password:(NSString *)password;
- (BOOL)loginWithCellPhone:(NSString *)cellPhone password:(NSString *)password;
- (DMUserInfo *)getUserInfoByUserId:(NSString *)userId;
- (DMUserInfo *)getUserInfoByCellPhone:(NSString *)cellPhone;
@end
@interface DMUserServiceImpl : NSObject <DMUserService>
@end
@implementation DMUserServiceImpl
- (BOOL)registerWithCellPhone:(NSString *)cellPhone password:(NSString *)password {
return YES;
}
- (BOOL)loginWithCellPhone:(NSString *)cellPhone password:(NSString *)password {
return YES;
}
- (DMUserInfo *)getUserInfoByUserId:(NSString *)userId {
DMUserInfo *userInfo;
return userInfo;
}
- (DMUserInfo *)getUserInfoByCellPhone:(NSString *)cellPhone {
DMUserInfo *userInfo;
return userInfo;
}
@end
现在我们的后台管理系统要实现删除用户的功能,希望用户系统提供一个删除用户的接口。这个时候我们该如何做呢?你可能说,这不是很简单吗,只需要在DMUserService中添加一个- (BOOL)deleteUserByUserId:(NSString *)userId或者- (BOOL)deleteUserByCellPhone:(NSString *)cellPhone接口就可以了。这个方法可以解决问题,但是也隐藏了一些安全隐患。
删除用户是一个非常重要的操作,我们只希望通过后台管理系统来执行,所以这个接口只限于给后台管理系统使用。如果我们把它放到DMUserService中,那所有使用到DMUserService的系统,都可以调用这个接口。不加限制地被其他业务系统调用,就可能导致误删除用户。
我们参照接口调用隔离原则,调用者不应该强迫依赖它不需要的接口,将删除接口单独放到另一个接口DMRestrictedUserService中,让后将DMRestrictedUserService只打包提供给后台管理系统来使用。代码如下
@protocol DMUserService <NSObject>
- (BOOL)registerWithCellPhone:(NSString *)cellPhone password:(NSString *)password;
- (BOOL)loginWithCellPhone:(NSString *)cellPhone password:(NSString *)password;
- (DMUserInfo *)getUserInfoByUserId:(NSString *)userId;
- (DMUserInfo *)getUserInfoByCellPhone:(NSString *)cellPhone;
@end
@protocol DMRestrictedUserService <NSObject>
- (BOOL)deleteUserByUserId:(NSString *)userId;
- (BOOL)deleteUserByCellPhone:(NSString *)cellPhone;
@end
@interface DMUserServiceImpl : NSObject <DMUserService, DMRestrictedUserService>
@end
@implementation DMUserServiceImpl
- (BOOL)registerWithCellPhone:(NSString *)cellPhone password:(NSString *)password {
return YES;
}
- (BOOL)loginWithCellPhone:(NSString *)cellPhone password:(NSString *)password {
return YES;
}
- (DMUserInfo *)getUserInfoByUserId:(NSString *)userId {
DMUserInfo *userInfo;
return userInfo;
}
- (DMUserInfo *)getUserInfoByCellPhone:(NSString *)cellPhone {
DMUserInfo *userInfo;
return userInfo;
}
- (BOOL)deleteUserByUserId:(NSString *)userId {
return YES;
}
- (BOOL)deleteUserByCellPhone:(NSString *)cellPhone {
return YES;
}
@end
如果部分接口只被部分调用者使用,我们就需要将这部分接口隔离出来,单独给这部分调用者使用,而不强迫其他调用者也依赖这部分不被用到的接口。
网友评论