农民和码农の故事

农民和码农の故事

一、什么是面向对象

在用面向对象思想写代码之前,先了解一下什么是面向对象?

个人理解:

面向对象:把现实世界里的具体物体或者逻辑世界的逻辑物体,用抽象手段,把这些物体抽象成程序能够识别的类,使类具备物体的属性和行为,把物体与物体之间的关联转换成类与类之间的关联,用编程逻辑把这些关联表示出来设计成程序,也就是面向对象设计。

什么样的设计才是面向对象的呢:

符合封装、继承、多态特征的设计

为什么要用面向对象:

通过定义我们知道面向对象是用来解决物体与物体之间的关联的一种方式,除了这种方式还有很多其他方式比如面向过程。解决问题的方式很多,但是最好的只有一个,在代码的世界里我们不仅要考虑功能的实现,还要考虑后期的维护,用面向对象的思想编写代码比其它方式,能让程序更好的维护。

二、如何用面向对象思想编写代码

抽象-----实现面向对象思想设计程序

如何抽象,抽象层次:

第一层 抽象 :把现实世界存在的物体或者逻辑物体通过抽象封装成一个具体类,体现了面向对象封装特征,如下图

【原创】如何用面向对象思想编写代码-LMLPHP

这两个类把现实世界具体动物转换成程序里的具体类或者实例类

第二层 抽象 : 第二层抽象是必须的吗,不是的,因为第一层中不同的具体类之间有相同或相似部分,又有不同的部分,它们之间有联系,好像是一个事物呈现了多种形态,也就是一个事物有变化才会有第二层抽象出现

此时我们需要抽象出来相似部分,去封装成一个对象,然后被子类继承,这也体现了面向对象继承特征,子类中的方法也体现了面向对象多态特征,如下图

【原创】如何用面向对象思想编写代码-LMLPHP

可能有人会问Car里和Cat里都有Run有相似部分不也可以抽象吗,我们不能这样做,因为现实世界Cat和Car之间没有任何联系,而面向对象只能抽象现实世界或或逻辑世界有关联的对象,然后解决这些关联对象间的逻辑处理。

Cat和Car虽然有相似部分但是没有关联关系也就不存在逻辑关系,抽象在一起也没啥意义。

所以第二层抽象关键点在于判断具体对象间是否有关联关系或逻辑关系-----通过现实世界物体间是否有关联关系来决定具体对象是否有关联关系

Cat和Bird在现实世界都属于动物,他们之间是有关联的。

第三层 抽象 : 对第二层抽象出来的相似部分进一步抽象。大家都知道相似部分是子类共用的一但变化所有的子类都将受到影响,此时我们需要对相似部分做抽象分离,通常把状态相关和行为相关分离,行为稳定的和行为不稳定的分离,粒度越细越好。

粒度越细复杂度越高,此时需要复杂度和稳定性之间找个平衡点。

第四层 抽象:  对子类变化进行抽象,相似的部分我们封装了,针对变化的部分,此时会考虑一些设计模式,来解决子类的变化问题,比如某个方法的内部实现用策略模式等。一般解决类结构变化是新增接口文件,解决类状态变化或者行为逻辑的变化直接修改即可。

一般抽象到这一层应该就满足需求了。

第五层 抽象:

......

第N层 抽象:最后每一个对象都符合面向对象的设计原则

三、如何判断一个对象是否合理

1、 如果对象只有一种呈现形态:也就是说程序里无论是什么时候我们就只使用对象一种实例,这个对象只要符合单一职责的原则就好了,不用再去抽象

2、 如果对象有多种呈现形态:也就是说程序里我们根据不同的情景或者上下文会使用对象的不同呈现形态(实例),这个对象除了满足单一职责,还要考虑这个对象是否符合其它设计原则

四、面向对象的设计原则

为了让文章更完整我就补上了,很多博文都有讲解

1、SRP-Single Responsibility Principle  单一职责原则

2、OCP-Open Close Principle   开闭原则

3、LSP-Liskov Substitution Principle  里氏替换原则

4、DIP-Dependence Inversion Principle  依赖倒置原则

5、ISP-Interface Segregation Principle   接口分离原则

6、LOD-Law Of Demeter  最少知识原则(迪米特原则)

7、CARP-Composite/Aggregate Reuse Principle 优先复用原则

这些设计原则是为了判断抽象出来的对象是否合理,也就是说判断创建的类是否合理。程序符合这些原则就更加符合面向对象设计。

单一职责原则是每个对象每个类需要满足的最基本原则,下面也谈下自己的理解

五、单一职责原则

职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

为什么出现这一原则呢?我们经常会遇到以下情景:

T负责两个不同的职责:职责P1,职责P2,当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障,也就是说职责P1和P2被耦合在了一起,导致程序很脆弱

作用:单一职责用来给对象瘦身的,类的结构瘦身,类的细节瘦身,把不属于它的职责彻底剥离

它包含两层意思:

1、一个类只负责做属于它自己的事

2、引起一个类变化的原因只能有一个,就是属于这个类的职责需求变化了

单一职责不是说一个类只做一件事,这个类可以做多件事情,但是这些事情需要都属于这个类的职责,也就是说只做它该做的,不该做的就剥离。

如何判断一个类是否多于一个职责:

1、Information holder –该对象设计为存储对象并提供对象信息给其它对象。

2、Structurer –该对象设计为维护对象和信息之间的关系

3、Service provider –该对象设计为处理工作并提供服务给其它对象

4、Controller –该对象设计为控制决策一系列负责的任务处理

5、 Coordinator--该对象不做任何决策处理工作,只是delegate工作到其它对象上

6、Interfacer--该对象设计为在系统的各个部分转化信息(或请求)

一个对象应该有且只有一个上面的职责

六、总结

面向对象整体设计思路:抽象---->具体对象---->变化---->对象的多种呈现形态---->抽象---->抽象---->符合设计原则---->单一职责具体对象

面向对象核心:针对变化进行抽象封装

备注:如若转载请说明文章出处

03-15 23:06