“系统越复杂,越容易全面崩溃”。建筑师一般不会想要为一幢100层的大楼添加一个新的地下室,因为这样做成本会很高,无疑将失败,但让人吃惊的是,软件系统的用户提出类似的改动时,都不会多想一下,相反,他们会说,这是一个简单地编程问题。
对象是数据和允许的操作组成的包,面向对象的原则:
一、开放关闭原则
很多教程都把[开闭原则]作为这六大原则中最基本的原则,也就是说他是各个原则的核心。开闭原则指的是,一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
二、单一职责原则(Single Responsibility Principle)
指每个类都应该专注于做一件事情,而不是分散地同时做好几件事。
因为一个类只负责一项任务,其可以降低类的复杂度;提高类的可读性,提高系统的可维护性。
三、依赖倒置原则
这个原则也是讲究解耦,他指的是让高层模块不要依赖低层模块。这是个纯粹的面向接口,面向模块开发思路了,因为面向对象而言,各个对象自己的东西和外界是解耦的,因为封装特性把它们自己的属性都封装起来了,所以是不会和其他对象有耦合关系的(如c++的友元除外);但是各个对象仍然是相互耦合的,最强的耦合就属于继承耦合了,对象组合起码还是轻耦合,继承是个高耦合呀。依赖倒置就是让各个对象耦合度降低,高层模块不能继承底层模块,需要底层的东西也是外界注入而不是自己创建得到;同时调用的时候也是使用接口调用,而不是依赖具体实现,并且因为是接口调用,具体实现模块可以被任意替换了。
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。
面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。
这样做就可以降低各个模块的耦合,也可以确保里氏替换原则的实现。实现里氏替换原则有什么用?当然是可以方便扩展了。
四、里氏替换原则(Liskov Substitution Principle)
即超类存在的地方,子类是可以替换的。
里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
五、接口隔离原则(Interface Segregation Principle)
即应当为客户端提供尽可能小的单独的接口。
也就是要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。依赖几个专用的接口要比依赖一个综合的接口更灵活。
六、迪米特法则(Law Of Demeter)
即一个软件实体应当尽可能少的与其他实体发生相互作用。
一个对象对另一个对象知道的越少越好,即一个软件实体应当尽可能少的与其他实体发生相互作用,在一个类里能少用多少其他类就少用多少,尤其是局部变量的依赖类,能省略尽量省略。