wordpress手机网站插件,网站首页设计要求,承德网站制作加盟,用记事本做网站怎么添加表格定义
依赖倒置#xff1f;大家可能会觉得高深莫测。但是相信听我一翻解说之后#xff0c;你就会恍然大悟#xff0c;甚至你早已掌握到它的精髓了。我们先看一下依赖倒置原则的定义#xff1a; High level modules should not depend upon low level modules. Both should …定义
依赖倒置大家可能会觉得高深莫测。但是相信听我一翻解说之后你就会恍然大悟甚至你早已掌握到它的精髓了。我们先看一下依赖倒置原则的定义 High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.高层模块不应该依赖低层模块它们都应该依赖其抽象。抽象不应该依赖细节细节应该依赖抽象。 意思就是说无论是高层模块、低层模块还是细节都应该依赖抽象所以依赖倒置原则也可以理解为“依赖抽象原则”。那么什么是依赖呢假设我们有类A和类B如果类A需要使用到类BB是A的属性或者A会调用到B的方法等那么可以说类A依赖类B。那么什么又是抽象呢抽象类、协议都属于抽象。所以“依赖抽象”就是说当类A用到类B时尽量引用类B的抽象类或者协议。把依赖倒置原则理解为依赖抽象原则更有助于理解。
大家可能会觉得奇怪为什么说依赖抽象就是依赖倒置呢因为在日常生活中人们习惯于依赖于具体事务细节而不是抽象。比如说我们说开车就是具体的车用电脑就是用具体的电脑。那么如果要倒过来去依赖抽象就是依赖倒置。
那么为什么要依赖倒置呢按照人们的直觉依赖正置依赖具体事务不好吗下面就举个依赖正置的例子来说明依赖正置的问题。
很简单我们的任务是声明一个司机类和一个奔驰车类然后让司机开车。我们按照我们现实生活的直觉来两个类都是具体类司机就是司机奔驰车就是奔驰车没有抽象类的存在。
宝马车类
interface BMWCar : NSObject
- (void)run;
endimplementation BMWCar
- (void)run{NSLog(宝马车开动了);
}
end司机类
#import BMWCar.hinterface Driver : NSObject
- (void)driveCar:(BMWCar *)car;
endimplementation Driver
- (void)driveCar:(BMWCar *)car{[car run];
}
end这样就可以让我们的老司机老王开车了
Driver *wang [Driver new];
BMWCar *bmw [BMWCar new];
[wang driveCar:bmw];上面的代码好像没有什么问题。但是如果现在新增一辆奔驰车我们的老司机老王却没办法开因为他目前只有开宝马车的方法如果要开奔驰车可能需要为他新增开奔驰车的方法。那么如果现在又要新增特斯拉、奥迪、罗斯莱斯等车呢难道要为每一辆新增的车去修改司机类这显然是荒唐的。依赖于具体类会导致类之间的耦合性太强这就是在代码中依赖具体类的问题。
虽然说代码是现实世界的反映但是代码和现实世界还是有所区别的你需要“倒置”一下。解决上述问题的方法自然是依赖倒置让司机依赖于抽象的车而不是具体的车。
抽象车类 interface Car : NSObject
- (void)run;
endimplementation Car
- (void)run{
}
end司机类记得司机类现在依赖的是抽象的车类而不是具体的车类
#import Car.hinterface Driver : NSObject
- (void)driveCar:(Car *)car;
endimplementation Driver
- (void)driveCar:(Car *)car{[car run];
}
end然后就是我们的具体车类了。只要具体的车类继承自抽象车类那么无论它是奔驰车还是宝马车...我们的司机都可以开。
奔驰车
interface BenzCar : Car
endimplementation BenzCar
- (void)run{NSLog(奔驰车开动了);
}
end让我们的老王开开奔驰
Driver *wang [Driver new];
Car *benz [BenzCar new];
[wang driveCar:benz];宝马车
interface BMWCar : Car
endimplementation BenzCar
- (void)run{NSLog(宝马车开动了);
}
end让我们的老王也开开宝马
Driver *wang [Driver new];
Car *bmw [BMWCar new];
[wang driveCar:bmw];可见通过依赖倒置现在无论新增多少种车都不需要去修改司机类了。
优点
通过上面的例子相信大家已经领略到在代码中使用依赖倒置原则的重要性了。总结一下依赖倒置原则的优点
减少类之间的耦合降低并行开发引起的风险提高代码的可读性和可维护性。
关于上面第2点需要强调一下依赖倒置对于并行开发非常重要可以说是必不可少。因为在多个人一起进行开发的时候如果没有抽象类或者接口你要等到别人完成具体的类才能进行开发那么谈何并行开发相反我们只需要先定好抽象类或者接口大家就能开工了。所以在并行开发的时候一定要遵守依赖倒置原则。
实践
到这里相信大家已经知道依赖倒置原则是怎么回事了。也许这你是第一次听说依赖倒置原则但是你很可能听说过面向接口编程。面向接口编程是依赖倒置原则的最佳实践如果你熟悉面向接口编程那么恭喜你已经掌握了依赖倒置原则的精髓。
如果还是觉得抽象下面列举一些具体的点让大家可以有法可依
每个类尽量都有接口或抽象类或者两者具备。抽象是依赖倒置原则的基本要求变量的表面类型尽量是接口或者抽象类任何类都尽量不要从具体类派生。如果一个类是从具体类派生那么这个类和它的非抽象的父类就形成强耦合尽量不要覆写基类的方法。如果基类是一个抽象类而且这个方法已经实现了子类尽量不要覆写。类间的依赖是抽象覆写了抽象方法会影响依赖的稳定性结合里氏替换原则使用。
注意
依赖倒置原则的优点很难在小项目中体现出来在大型项目才能感受到它的重要性依赖倒置原则是6大设计原则中最难实现的有些情况还是需要依赖于细节。