目前流行的编程范式有面向对象,面向过程,和函数式编程。面向过程这种编程范式随着面向对象的出现,已经慢慢淡出。
详细对比下面向过程和面向对象这两种编程范式的区别,主要有以下几个问题:
1、什么是面向过程编程与面向过程编程语言?
面向对象是如何定义的?
面向对象是一种编程范式或编程风格,它以类或对象作为组织代码的基本单元,将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。
面向对象编程语言是支持类和对象的语法机制,请有现成的语法机制,能方便的实现面对象的四大特性的编程语言。
类比面向对象与面向对象编程的定义,面向过程有以下2个概念:
面向过程编程是一种编程范式或编码风格,它以过程作为组织代码的基本单元,以数据与方法想分离为主要的特点。面向过程风格片流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
面向过程编程语言是一种编程语言。其最大特点是不支持类和对象两个概念,没有丰富的面向对象编程特性,仅支持面向过程编程。
面向对象编程相比面向过程有哪些优势?
(1)OOp更大能够应对大规模复杂程序的开发. (2)OOP风格的代码更易复用、易扩展、易维护 (3)OOP语言更加人性化、更加高级、更加智能
课堂讨论问题,面向对象比面向过程编程,更加容易应对大规模复杂程序的开发。但想Unix\Linux这些复杂的系统,也都是基于c语言这种面向过程的编程语言开发,你怎么看待这个现象?
想法:之所以这些系统使用c语言来写,主要有以下几点:
1、系统属于底层的范畴,从底层的角度来说,使用接近于系统的语言能够更大的发挥其特性,免去其他语言需要运行环境的痛苦 2、机器本身需要更加高效的执行,但是从各个角度来说,比如网络,文件,内核等对硬件的支持,肯定是c语言来的强。
因此我觉得这个不矛盾,发挥语言的特性这个很关键
哪些代码设计看似是面向对象,实际是面向过程的?
(1)滥用get、set
public class ShoppingCart {
private int price;
private String name;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里的两个属性,name和price,虽然定义成private,但是提供了public的get和setter方法,这与两个属性定义成pubuic没两样。任何代码都可以随意调用setter方法来重新设置属性的值,这回导致其值不一致。
面向对象封装的定义:通过访问权限控制,隐藏内部数据,外部仅能通过类提供的有限的接口访问、修改内部数据。所以setter方法明显违反了封装特性。
在设计实现类的时候,除非真的需要,否则不要给属性定义setter方法。如果返回的数据是容器类,也要防范集合内部数据被修改的危险。
(2)滥用全局变量和全局方法
在面向对象编程中,常见的全局变量有单例类对象、静态成员变量、常量等,常见的全局方法有静态方法。
我们把程序中所有用到的常量,都集中的放到常量类中,会有什么问题?
首先,会影响代码的可维护性。 修改的人越多,就会导致该类越来越大,修改和查找变得比较浪费时间,而且还有冲突的概率。
其次,会增加编译时间。
当Constants类中包含很多常量定义的时候,依赖这个类的代码就会很多,会浪费很多不必要的编译时间。
最后,会影响代码的复用性。 如果要在另一个项目中,复用本项目开发的某个类,这个类又依赖Constants类,这样就会导致复用严重。
解决办法: 一种是:将Constants拆解成功能单一的多个类。
另外一种是类中的常量其他地方不会用到就直接定义在类中,这样可以提高设计的内聚性喝代码的复用性。
(3)Utils类
定义:有多个模块会用到同一个功能逻辑,为了避免代码重复,我们不应该在两个地方重复的实现两边。
在面向对象编程中,为什么容易写出面向过程风格的代码?
一个是思维方法,一个是面向对象需要对全局有个比较好的构思,设计等问题,所以会导致该问题。