[ASP.NET]91之ASP.NET由浅入深 不负责讲座 Day20 – ISP 界面隔离原则

[ASP.NET]91之ASP.NET由浅入深 不负责讲座 Day20 – ISP 界面隔离原则


前言
前面介绍了单一职责原则、开放封闭原则、最少知识原则,今天要介绍的是Interface Segregation Principle, ISP (界面隔离原则)。

界面隔离原则,与单一职责原则和最少知识原则有一点关系,而SOLID原则的总纲是开放封闭原则,所以如果对这些观念还不够熟悉的朋友们,可以参考一下前面几篇文章:

  1. [ASP.NET]91之ASP.NET由浅入深 不负责讲座 Day17 – 单一职责原则
  2. [ASP.NET]91之ASP.NET由浅入深 不负责讲座 Day18 – 开放封闭原则
  3. [ASP.NET]91之ASP.NET由浅入深 不负责讲座 Day19 – LoD/LKP 最少知识原则


Issues

  1. 定义
    1. Clients should not be forced to depend upon interfaces that they don't use.
      也就是Client不应该依赖它不需要的界面。
    2. The dependency of one class to another one should depend on the smallest possible interface.
      也就是Class之间的依赖关系应该建立在最小的interface上。

  2. 简单的说
    Class与外部的关系,应只依赖它需要的最小界面,所以界面不能太肥,应该要细化,不然会强迫中奖。每一个interface的方法数目应该尽可能地降到最低。

  3. 与单一职责原则的矛盾
    1. 单一职责是指属于同一个职责的方法应该放在一起,且一个class/interface只负责一个职责。
      可能产生一种情况,实践interface的class,用不到该interface的所有方法。
    2. 相对于界面隔离原则,则是每一个class实践了某个界面,就应该代表会用到该界面所有的方法,如果不会用到所有方法,代表该interface可以再继续细化。

  4. 目的
    对interface的scope进行约束。

  5. 基本原则
    1. interface尽量小
      • 粒度越小代表系统可以越灵活,但也代表结构越复杂,开发难度提升
      • 最小的情况就是一个interface只有一个method,但违反单一职责原则
      • 细分interface的前提,就是不能违反单一职责原则

    2. interface应高内聚
      • 粒度应该符合环境与未来需求中,细分到最细
      • interface就是contract的观念,对外承诺的function越少,变动风险越低,就越稳定

    3. 订制服务
      • interface只提供访问者需要的方法

    4. 粒度大小的细分标准
      • 因地因时制宜,取舍需求、开发与结构的平衡点

  6. 结论
    杀鸡焉用牛刀,但书:
    • 如果是为了杀鸡,就不需要用到牛刀
    • 如果是为了用牛刀,那就还是得用牛刀

  7. 举例
    我们用下面这张class diagram(点图可放大)来看,可以看到以工作上所需的技能来分,一个ExcellentWorker,应同时具备HardSkill与SoftSkill。
    然而,不是每一样工作,都需要excellent的worker才能做事。一个健康的团队,应该有将有兵,分工合作,各司其职,互助互补。

    如果今天工作需要的是协助测试,那可以找QA,也可以找Joey。最好是先找QA,因为如果找Joey,他的对外方法不只测试的界面,还有许多其他的功用,就很有可能被其他任务插单。

    相对的,以界面来说,一个QA可能只需要具备测试的界面,而不需具备Leadership或是Integrity。

    我自己的原则是,宁可多实践几个interface,保留弹性,也要避免未来因为继承或extend造成强耦合而无法修改的风险。
    但interface的本身,还是要尽量符合单一职责的原则。

    workerSkills


或许您会对下列培训课程感兴趣:

  1. 2019/7/27(六)~2019/7/28(日):演化式设计:测试驱动开发与持续重构 第六梯次(中国台北)
  2. 2019/8/16(五)~2019/8/18(日):【C#进阶设计-从重构学会高易用性与高弹性API设计】第二梯次(中国台北)
  3. 2019/9/21(六)~2019/9/22(日):Clean Coder:DI 与 AOP 进阶实战 第二梯次(中国台北)
  4. 2019/10/19(六):【针对遗留代码加入单元测试的艺术】第七梯次(中国台北)
  5. 2019/10/20(日):【极速开发】第八梯次(中国台北)

想收到第一手公开培训课程资讯,或想询问企业内训、顾问、教练、咨询服务的,请洽 Facebook 粉丝专页:91敏捷开发之路。