美文网首页
iOS 面向对象六大设计原则(五)接口隔离原则

iOS 面向对象六大设计原则(五)接口隔离原则

作者: MQ_Twist | 来源:发表于2020-11-26 15:13 被阅读0次

    如果你在等着我放弃,那你一时半会儿走不了了。

    iOS 面向对象设计原则全集

    前言

    接上篇 iOS 面向对象六大设计原则(四)依赖倒置原则

    正文

    先上Demo

    定义

    接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

    根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的“接口”定义,有严格的定义和结构,比如Java语言中的interface、OC中的protocol。对于这两种不同的含义,ISP的表达方式以及含义都有所不同:

    (1) 当把“接口”理解成一个类型所提供的所有方法特征的集合的时候,这就是一种逻辑上的概念,接口的划分将直接带来类型的划分。可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口,此时,这个原则可以叫做“角色隔离原则”。

    (2) 如果把“接口”理解成狭义的特定语言的接口,那么ISP表达的意思是指接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

    举例

    举一个比较俗的例子,就说星探发掘美女。所谓美女咱们先来个简单的定义(仅为了Demo):长得好、身材好、中等身高、气质好。一切从简:
    定义一个美女特征的协议:

    @protocol Beautiful <NSObject>
    
    /** 长的好 */
    - (BOOL)goodLooking;
    /** 身材好 */
    - (BOOL)goodFigure;
    /** 中等身高 */
    - (BOOL)midHeight;
    /** 气质好 */
    - (BOOL)goodTemperament;
    
    @end
    

    女孩类

    @interface Gril : NSObject<Beautiful>
    
    
    @end
    
    @implementation Gril
    
    - (BOOL)goodLooking {
        return YES;
    }
    
    - (BOOL)goodFigure {
        return YES;
    }
    
    - (BOOL)midHeight {
        return YES;
    }
    
    - (BOOL)goodTemperament {
        return YES;
    }
    
    @end
    

    星探类

    @interface Scouter : NSObject
    
    - (void)search:(id<Beautiful>)gril;
    
    @end
    
    @implementation Scouter
    
    - (void)search:(id<Beautiful>)gril {
        if ([gril goodLooking] && [gril goodFigure] && [gril midHeight] && [gril goodTemperament]) {
            NSLog(@">>>这个女孩可以包装成明星");
        }else {
            NSLog(@">>>这个女孩不合适");
        }
    }
    
    @end
    

    看着没有啥问题,但是人们对美的定义不同,或者是各个行业需要的美女不同。例如:拍古装的要求长得好、中等身高,模特要求身材好、气质好(仅为了demo)。这时候会发现,Beautiful协议有点太广泛了,不是最小粒度,可以作以下修改。

    协议

    /*
     *  古装
     */
    @protocol Ancient <NSObject>
    
    /** 长的好 */
    - (BOOL)goodLooking;
    /** 中等身高 */
    - (BOOL)midHeight;
    
    @end
    
    
    /*
     *  模特
     */
    @protocol Model <NSObject>
    
    /** 身材好 */
    - (BOOL)goodFigure;
    /** 气质好 */
    - (BOOL)goodTemperament;
    
    @end
    

    女孩类

    @interface ISPGrilA : NSObject<Ancient>
    
    @end
    
    @implementation ISPGrilA
    
    - (BOOL)goodLooking {
        return YES;
    }
    
    - (BOOL)midHeight {
        return NO;
    }
    
    @end
    

    星探类

    @interface ISPScouter : NSObject
    
    /** 寻找古装女孩 */
    - (void)searchAncient:(id<Ancient>)gril;
    /** 寻找模特女孩 */
    - (void)searchModel:(id<Model>)gril;
    
    @end
    
    @implementation ISPScouter
    
    /** 寻找古装女孩 */
    - (void)searchAncient:(id<Ancient>)gril {
        if ([gril goodLooking] && [gril midHeight]) {
            NSLog(@">>>找到了古装女孩");
        }else {
            NSLog(@">>>这个女孩不适合古装");
        }
    }
    /** 寻找模特女孩 */
    - (void)searchModel:(id<Model>)gril {
        if ([gril goodFigure] && [gril goodTemperament]) {
            NSLog(@">>>找到了模特女孩");
        }else {
            NSLog(@">>>这个女孩不适合模特");
        }
    }
    
    @end
    

    总结

    采用接口隔离原则对接口进行约束时,要注意以下几点:

    • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
    • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
    • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

    运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。设计接口的时候,只有多花些时间去思考和筹划,才能准确地实践这一原则。

    感谢 -- 面向对象设计原则之接口隔离原则

    相关文章

      网友评论

          本文标题:iOS 面向对象六大设计原则(五)接口隔离原则

          本文链接:https://www.haomeiwen.com/subject/byyaiktx.html