2021-12-05面向对象与面向过程总结
面向对象
面向对象编程(OOP)
面向对象编程:是一种编程范式,它以类和对象作为组织代码的单元,以封装、抽象、继承、多态四大特性作为代码设计和实现的基石。注意:面向对象编程更加关注组织代码的单元是否为类或对象的方式,即使编写的代码中没有全部引用四大特性也是面试对象编程。
面向对象编程语言(OOPL)
面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
面向对象分析(OOA)、设计(OOD)
面向对象分析的目的是搞清楚做什么;面向对象设计是搞清楚怎么做;面向对象编程是将两者的结果(类的设计)翻译成代码,三种正好对应软件开发的三个阶段;
四大特性及其作用
封装
目的:信息隐藏、数据保护。
要求:编程语言提供权限访问控制语法来支持,如public 、private等关键词。
意义:一方面:保护数据不被任意修改,提高了代码的可维护性;另一方面:仅暴露有限的必要接口,提高了代码的易用性。
抽象
目的:隐藏方法细节,使调用者关注方法的功能。
要求:抽象通过接口类或者抽象类来实现,不需要特殊的语法机制来支持。
意义:一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。
继承
定义:表示 is-a 关系,分为单继承和多继承;Java为单继承。
要求:编程语言需要指出继承的特性,如Java 的 ”extends“。
意义:解决代码复用性。
多态
定义:多态是指子类替换父类,调用子类的方法实现。
要求:编程语言需要具备继承和抽象的语法支持,如Java中的继承/接口 + 方法重写的组合。
意义:提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。
面向过程
面向过程编程
面向过程编程:相较于面向对象编程以类为基本的编程单元,面向过程是以方法作为编程的基本单元,她最大的特点是数据和方法分离,且不支持丰富的面向对象编程特性(封装、继承、多态)。
面向对象和面向过程比较
面向对象编程相较于面向过程编程来说主要有三大优势:
- 支持丰富的面向对象编程特性,利用这些特性编写的代码,更易复用、扩展和维护。
- 对于大规模复杂程序的开发,程序的处理流程并非单一主线,而是复杂的网状结构,因为面向对象编程是基于类作为编程单元进行编程,所以更适用这种复杂类型的开发。
- 从编程语言和机器打交道的情况来看,面向对象编程比面向过程编程更加高级、更加人性化。
面向过程编程相较于面向对象编程来说主要的优势:从和机器适配的情况来看,面向过程编程相较于面向对象编程拥有更好的适配性,所以相应的执行效率更高。
面向对象编程中哪些设计实际上是面向过程的
-
滥用getter、setter方法 -- 违反了封装特性
getter、setter方法的设计初衷是:对类属性进行保护,通过暴露有限的getter、setter方法作为外面客户访问入口;
所以在设计类的时候,除非真的需要否则尽量不要给属性定义setter方法;属性如果属是容器类,定义getter方法的时候也需要防范容器内部数据被修改的风险。
public class ShoppingCart { private int itemsCount; private double totalPrice; private List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(); public List<ShoppingCartItem> getItems() { return items; } public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); //外部代码还是能修改 items 中的数据 cart.getItems().clear(); } } public class ShoppingCartItem{ }
-
Utils类、Constants类设计问题
Constants类、Utils类作用:解决代码复用问题;对于这两类的设计,我们尽量做到职责单一,尽量定义一下细化的小类,如DataSourceConstants类,不要定义大而全的类(定义大而全的类容易造成代码的维护性下降、编译时间过长、代码开发易冲突和代码复用性问题),除此之外,如果能将这些类中的属性和方法划归到业务类最好不过,这样可以极大提供类的内聚性和代码的复用性。
比如:如果两个不相干的类用引用了相同的一段功能逻辑,这时候使用继承就无法解决这个问题,这时候就可以将这段功能逻辑定义到Utils类中,从中我们也可以看出只包含静态方法不包含任何属性的Utils类是面向过程编程风格,同时这里也要说明一点在面向对象编程过程中并不是要杜绝面向过程编程,如果能解决我们的实际编码问题就可以直接使用的,使用他们的标准就是:如果我们常用的面向对象4大特性无法很好的解决编程过程中遇到的问题,如不相干类引用相同代码或者使用共享变量等场景,就可以直接使用面向过程进行编程。
-
基于贫血模型(MVC)的开发模式
MVC这种数据和方法分类的开发模式就是面向过程编程风格,但是因为MVC开发模式对应新手开发人员具有上手快,逻辑清晰等特点,所以得以大量使用。
面向对象编程为什么容易写出面向过程的代码,包含了2点原因?
- 面向过程编程更符合人们流程化的思维方式,而面向对象编程是一种自下而上的思考方式,它是将任务拆分为一个个小的模块(类),设计类之间的最后按照流程将类组装起来完成任务。
- 面向对象编程比面向过程编程更难一些,面向对象编程需要考虑如何设置合适的属性和方法到类中,类之间的关系、交互如何设计,对开发人员来说需要一定的设计经验和技巧。
总结
无论是面向对象编程还是面向过程编程,我们的目的都是写出易维护、易扩展、易读和易复用的高质量代码,只要在开发过程避免面向过程编程的弊端,在掌控范围内使用,大可不用担心在面向对象编程中写出面向过程编程的代码。