学了一年的VB和数据库等面向过程的结构化语言,终于学到了C#、Java,初识便有一种相见恨晚的感觉,通过看教学视频以及自己敲出来的一些例子的体会,也发现了自己面向过程的思维方式有多么根深蒂固。以前编写代码都是先想我这个程序有什么功能,根据功能去划分功能模块,然后对具体的功能细节一步步的实现,每实现一步需要写哪些代码,完全是自顶向下,逐步求精的结构化思想。
但是到了C#、Java,才真正体会到了什么是面向对象,它和我以前设计代码的思想有颠覆性的改变,在这里更加注重的是如何去分析系统中的对象并进行对象的抽象—类的划分,类与类之间会给人一种联系很松的的感觉,我想这就是高内聚、低耦合的作用吧。
接下来,我想用一个很经典的把大象装进冰箱的例子来体现一下面向过程与面向对象的区别,
定义需求: 把大象装进冰箱
解决方法:
一、面向过程:
面向过程思想更注重过程,将事件分成许多小模块,强调每个模块的功能,所以用面向过程的思想来实现这个事件,步骤为:
1、打开冰箱门
2、装进大象
3、关闭冰箱门
用代码实现为:
<span style="font-size:14px;">public class ProceDemo {
public static void main(String[] args) {
open();
into();
close();
}
//打开冰箱门
public static void open(){
System.out.println("打开冰箱门");
}
//把大象装进去
public static void into(){
System.out.println("把大象装进冰箱");
}
//关上冰箱门
public static void close(){
System.out.println("关闭冰箱门");
}
}</span>
但是,这三个方法定义在了一个类里,但是方法之间看起来根本就没有什么关系,显得杂乱无章,而且,不论我是想要给大象增加方法、还是给冰箱增加方法、都要在这同一个类中去添加,那么就更乱了,而且可能会将其它方法不注意改错,系统的可维护性差。
二、面向对象:
面向对象更加注重对象,强调对象的功能,它的分析过程为:
1、分析该系统中包含哪些对象?
可以得出系统中的对象为大象、冰箱。
2、明确每个对象可以做什么?
明确分工,大象可以做的是“进入冰箱”,而冰箱可以做的是“打开冰箱门”、“关闭冰箱门”。
3、分析对象之间的关系是什么?
大象可以进入冰箱。
代码实现:
<span style="font-size:14px;">public class textDemo {
public static void main(String[] args) {
//冰箱开门
refrigerator.open();
//大象进冰箱
elephant.into();
//冰箱关门
refrigerator.close();
}
}
public class elephant {
//大象进入冰箱
public static void into(){
System.out.println("进入冰箱");
}
}
public class refrigerator{
//打开冰箱门
public static void open(){
System.out.println("打开冰箱门");
}
//关上冰箱门
public static void close(){
System.out.println("关闭冰箱门");
}
}</span>
注:应该将大象类、冰箱类对应方法为非静态方法,且用大象实例、冰箱实例调用方法,此处为了简便,如上表示。
附:面向过程中,我是去打开冰箱门,装进大象、关上冰箱门,而在面向对象中,是冰箱.open,大象.into,冰箱.close,变成了冰箱和大象的动作,我让冰箱开,让大象进,让冰箱关,而具体的动作却是由大象和冰箱去完成,可以理解为:面向对象由动作的执行者变成了指挥者。
小结:面向对象相对于面向过程来说,明确了各个类的分工,使得程序的可维护性和可扩展性增强了,而且从动作的执行者转换为了动作的指挥者,更加符合生活中的实际,更加容易理解。