对于稳定依赖原则的深入思考

包的稳定性I=Ce/(Ca+Ce),Ce是传出耦合数,Ca是传入耦合数,但在深入分析后,我感到并非这么简单,因为传入的依赖Ca中,有一种依赖叫做“实现”,例如,A的实现有a1和a2,如果存在B对A的调用,那么a1和a2的变更肯定会影响B的稳定性, 所以,对于I=Ce/(Ca+Ce)的定义,应该是独立性(或易变性),而不是稳定性,独立性是“不因其它包改变而改变的能力”,稳定性是“不因其它包的改变而使运行结果受影响的能力”,这二者是不同的,前者是包的变更灵活性的指标,是编译期的变更影响指标,后者是系统质量指标,是运行期的变更影响指标;所以,对于稳定性的度量应该将“实现”类型的依赖当做传出而不是传入了;

那么,再进一步,稳定依赖原则要求包的稳定性必须沿着依赖链递增,最底下的最稳定,如果我所提出的看法成立,那么沿着依赖链递增的所谓稳定性度量,同样要将“实现”类型的依赖当做传出而不是传入;

反过来再看,独立性需要沿着依赖链递增吗?我想是的,因为无论是稳定性还是独立性,都是关于“变更影响”的度量指标,不同的仅仅是“运行期”还是“编译期”,所以,应该都是朝向受变更影响小的的那个方向依赖;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
依赖倒置原则(DIP)是面向对象设计中的一个重要原则,它指导我们在设计时要遵循高层模块不依赖于底层模块的具体实现,而是通过抽象接口进行通信,从而实现模块间的解耦。 下面我们通过一个 Java 代码演示来深入理解依赖倒置原则。 假设我们有一个图形类 `Shape`,它有两个子类 `Rectangle` 和 `Circle`,并且我们需要一个类 `AreaCalculator` 来计算这些图形的面积。一开始我们可能会这样设计代码: ```java public abstract class Shape { public abstract double area(); } public class Rectangle extends Shape { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double area() { return width * height; } } public class Circle extends Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } public class AreaCalculator { public double calculate(Shape[] shapes) { double totalArea = 0; for (Shape shape : shapes) { totalArea += shape.area(); } return totalArea; } } ``` 上述代码实现了我们的需求,但是我们发现 `AreaCalculator` 类直接依赖于 `Shape` 类及其子类的具体实现,这违反了依赖倒置原则,因为高层模块 `AreaCalculator` 依赖于底层模块 `Shape` 的具体实现。 为了遵循依赖倒置原则,我们需要通过抽象接口来解耦 `AreaCalculator` 和 `Shape`: ```java public interface Shape { double area(); } public class Rectangle implements Shape { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double area() { return width * height; } } public class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } public class AreaCalculator { public double calculate(Shape[] shapes) { double totalArea = 0; for (Shape shape : shapes) { totalArea += shape.area(); } return totalArea; } } ``` 现在我们将 `Shape` 抽象成一个接口,`Rectangle` 和 `Circle` 类实现这个接口,并且 `AreaCalculator` 类只依赖于 `Shape` 接口,而不是具体的实现类,这样就做到了高层模块不依赖于底层模块的具体实现的目的。 总结一下,依赖倒置原则是面向对象设计中非常重要的原则之一,遵循依赖倒置原则可以使我们的设计更加灵活、可扩展和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值