面试官:“你真的会面向对象开发吗?”,我沉默了...

hello,你好呀,我是灰小猿,一个超会写bug的程序猿。

一听到面向对象这个词,大家肯定都不会陌生,并且我们平常在进行的开发大多数也都是以面向对象为基础的,但是在进行面向对象程序设计和开发的时候,你真的有按照面向对象的设计原则来开发吗?

面向对象设计有七大原则,分别是:单一职责原则,开放封闭原则,李氏替换原则,依赖倒置原则,接口隔离原则,组合重用原则和迪米特原则,

下面我们简单分析介绍一下这些原则。看看你在平常的开发中有哪些方法是不平常不会注意到的呢?


(1)单一职责原则(SRP)

就一个类来说,应该仅有一个引起它变化的原因。也就是说,一个类应该只有一个职责。 如果有多个职责,那么就相当于把这些指责耦合在起,一个职责的变化就可能削弱或抑制了这个类完成其他职责的能力,引起类的变化的原因就会有多个。所以在构造一个类时, 将类的不同职责分离至两个或多个类中(或者接口中),确保引起该类变化的原因只有一个。


(2)开闭原则(OCP)

软件组成实体应该是可扩展的,但是不可修改。开放-封闭原则认为应该试图设计永远也不需要改变的模块。可以添加新代码来打展系统的行为,不能对已有的代码进行修改。这个原则很好的实现了面向对象的封装性和可重用性。


(3)替换原则(LSP)

子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC(Design by Contract)的概念推出。以圆和椭圆为例,圆是椭圆的一一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。

但反过来就可能行不通。运用替换原则时,尽量把类B设计为抽象类或者接口,让C类继承类B (接口B)并实现操作A和操作B,运行时,类C实例替换B,这样即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。


(4)依赖倒置原则(DIP)

在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。在结构化设计中,可以看到底层的模块是对高层抽象模块的实现,这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个“硬伤”。

但面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。为此,在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。


(5)接口分离原则(ISP)

采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。ISP 原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP组件类的可用性和移植性将大打折扣。这个原则的本质相当简单。如果拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。


(6)组合重用原则

就是能用组合实现的地方,尽量用组合来实现,而不要使用继承来扩展功能,因为组合能更好地实现封装,比继承具有更大的灵活性和更稳定的结构。


(7)迪米特原则

指一个对象应该对于其他对象有最少的了解,这样做的好处就是可以有效地降低类之间的耦合要求。

看完之后你是否还会觉得自己真正懂得面向对象开发的精髓呢?有不足或者见解的小伙伴欢迎在评论区留言!

觉得不错记得点赞关注哟!

灰小猿陪你一起进步!

(完)