iOS设计原则之接口隔离原则

2024-04-12  本文已影响0人  点滴86

接口隔离原则

接口隔离原则的英文是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

如果部分接口只被部分调用者使用,我们就需要将这部分接口隔离出来,单独给这部分调用者使用,而不强迫其他调用者也依赖这部分不被用到的接口。

上一篇 下一篇

猜你喜欢

热点阅读