单一职责原则(SRP)
任何一个软件模块都应该只对某一类行为者负责,将不同行为者所依赖的代码放在一起容易引起混乱。
开闭原则(OCP)
一个设计良好的计算机系统应该在不需要修改的前提下就可以轻易被扩展,例如要增加一个功能时,可以增加代码,而尽量少修改旧代码,甚至不修改旧代码。
如何做到这一点呢,我们可以利用单一职责原则将代码分组,然后调整这些分组之间的依赖关系,使得高级组件不会因为低级组件被修改受到影响,例如依赖反转。
里氏替换原则(LSP)
将子类型替换为父类型时,程序的行为应该保持不变,例如正方形替换为长方形就会出现问题,因为正方形的宽和高需要一同修改,而长方形可以分别修改宽和高。
接口隔离原则(ISP)
任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。
依赖反转原则(DIP)
我们每次修改抽象接口时,一定也会去修改对应的具体实现,但反过来我们每次修改具体实现时,却很少需要修改对应的抽象接口,所以我们可以认为抽象接口比具体实现更稳定。如果想设计一个灵活的系统,在源代码层次的依赖关系中应该多引用抽象类型,而非具体实现。
当然,把这条设计原则当成金科玉律来严格执行是不现实的,软件在实际构造中不可避免地需要依赖到一些具体实现,例如Java中的String,这个类是非常稳定的,很少会被修改,应用依赖反转原则时,我们应该关注的是软件系统内部那些会经常变动的具体实现模块。
在编码中,应该多使用抽象接口,尽量避免使用那些多变的具体实现类,对象的创建过程也应该受到严格限制,例如使用抽象工厂模式创建。不要在具体实现类上创建衍生类,因为继承关系是所有源代码依赖关系中最强的,最难被修改的。
网友评论