面向对象中的两种特有的耦合

一、内容:访问耦合与继承耦合
二、定调:这两种耦合与结构化方法中的六种耦合不是并立关系
三、发生场景:

1)访问耦合:

  • 隐式访问。例如:A.getBinstance().doSomething(),A隐式调用了B的方法。
  • 实现中访问。例如:B中的引用是A方法中的局部变量。
  • 成员变量访问。例如:B中的引用是A的成员变量。
  • 参数变量访问。例如:B中的引用是A方法中的参数变量。
  • 无访问。评价:理论最优。

2)继承耦合:

  • 修改:1.规格:任意修改继承于父类方法的接口。2.实现:任意修改继承于父类方法的实现。
  • 精化:1.规格:按定义的规则修改父类的方法,但至少一个方法的接口被改动。2.实现:按定义的规则修改父类的方法,但只改动了方法的实现。
  • 扩展:子类只增加新的成员变量和方法,对继承自父类的任何属性和方法不做任何修改
四、耦合的度量:

1)方法调用耦合:

  • CBO(双向):1.该类调用其他类的成员方法的数量。2.其他类调用该类的成员方法的数量。

2)访问耦合:

  • DAC:该类中其他类的实例对象的数量,除了继承来的实例对象。

3)继承耦合:

  • NOC:统计直接所属的子类的数量。数量越多越好,但是数量越多,父类越难抽象。(广度第一层)
  • DIT:统计继承树的根节点到叶节点的长度。(深度)

面向对象中的内聚类型

  • 方法的内聚:同结构化方法一致。
  • 类的内聚:指的是成员变量和方法的内聚。
  • 子类与父类的继承内聚:主要还是通过是否满足LSP(接口分离原则)来判定继承内聚的高低。

面向对象的七大设计原则:

  • 接口分离原则:将一个统一的接口分离为多个更独立的接口。
  • 迪米特法则(顺序图):一个软件实体应当尽可能少的与其他实体发生相互作用。
  • 里氏替换原则:1.子类能够替代基类型并起同样的作用。2.子类的前置条件比父类更少或相同,子类的后置条件比父类更多或相同。3. 违反该原则的场景:a).子类继承父类时重写了父类的方法 。b).子类的前置条件比父类更多,子类的后置条件比父类更少。c).不符合语义上的继承。例如,学生之于人符合语义上的继承,学生之于课程不符合语义上的继承。
  • 组合代替继承原则:不满足LSP时,用组合代替继承来实现代码的复用。
  • 单一职责原则:既信息内聚又功能内聚。(信息内聚的特征:抽象类、接口;功能内聚:只执行一个操作或达到一个单一的目的)
  • 开闭原则:对拓展开放,对修改关闭。
  • 依赖倒置原则:抽象不依赖于细节,高层不依赖于底层。

信息隐藏:

1)封装类的实现

  • 集中信息与行为
  • 分离对外接口和内部实现

2)抽象类的接口

最后修改:2023 年 09 月 29 日
无需 money,加油,你一定会变得更好!