何为面向对象,何为面向过程——看我如何掰扯它们

 CSDN首页搞了个专题叫“十年IT生涯感情祭”,这让我想起两个月以前我在给一批即将毕业和已经毕业的理工科大学生上C#oo特性时的一个场景,我说“同学们你们都学过C的,你们老师有没有说过C是一门面向过程的语言。”底下的学生齐口回答:“说过。”我接着问:“大家都学过java与C#的语法结构了,都知道C#与java是基于面向对象的编程语言。那么有谁可以告诉我什么是面向过程、什么是面向对象?”结果没人愿意接过这个话茬,底下悄然无声。我为什么会问这个问题呢,因为在讲解C#oo的时候我突然想到大约十年前,我的大学老师在给我讲C的时候曾经告诉我C是一门面向过程的语言,然后它有个升级版本C++是面向对象的,然后我来到csdn,当时的csdn上面最热闹的话题之一是如何学习C++,有些大牛们在坛子里说了,学习C++不是盯着它的语法,而是掌握C++的oo思想。当时有本很火的书叫《C++编程思想》(后来这个作者又写了本更火的书《Java编程思想》,当然他也和别人合著过《C#编程思想》,只不过国内没有引进这本书,不知道是不是因为合著的原因而影响了书的质量,造成国内出版社不愿出版这本书)。但是当我学完C又看完《C++编程思想》,依然搞不清楚如何建立oo编程思想,这让我苦恼了很长一段时间。这次轮到我讲oo了,我很想知道现在的大学老师有没有把这件事情讲清楚,还是说丢出两个很学术化的概念让学生以崇拜的眼光看着你,然后所有的学生照样满头雾水。结果很明显至少我教的那批学生搞不定这两个概念。当时我也有点后悔抛出这个问题,因为我也没有准备如何去讲,只是一时冲动随口说出,唉冲动是魔鬼啊。但是既然引出这个问题了,我也只好硬着头皮去讲,大家看看我是如何讲的算是抛砖引玉了。

我举了这样一个例子:假设我们要编写这样一个程序,需求是:输入圆形的半径,输出圆形的面积。

如果是面向过程的思想编程,他会这么想,输入数据:圆形半径,用double类型存储。输出数据:圆形的面积,也是用double类型变量存储。圆形面积的计算公式PI*R*R,这个就是算法,所以吻合我们编程界的名言程序=数据结构+算法。这里的数据结构很简单两个double类型数据,算法就是上面的计算公式。多perfect。

那么面向对象的思想又是如何考虑上面的需求呢?首先这里有三个关键名词圆形,半径,面积,两个动词输入和输出。所以他会建立一个圆形类,里面有两个属性:半径,和面积,然后至少有两个方法,1、给半径赋值的方法,2、计算圆形面积并且把计算结果返回的方法。多考虑一点话应该有带参数的构造方法重载,方便程序员在实例化圆形对象的时候就对半径做初始化赋值。这样就可以了吗?这个只是刚入门的oo程序员,这里也只体现了oo中的封装思想。更深入一点,我们应该考虑,这个需求在以后有没有可能扩充,比如求圆形的周长等。会不会还要求矩形的面积,如果以后有可能要计算矩形,三角形等形状的面积。我们是不是要对图形做抽象,抽象出Shape这个父类,这个父类是抽象类吗?还是用接口更合适。等等这就上升到了继承和多态的高度了。如果再往后考虑,求什么样的图形面积是项目部署的时候由客户动态决定的吗,那这里需不需要用到配置文件,需不需要用到设计模式,如工厂等。

可见面向对象的出现是为了应对越来越复杂多变的客户需求。在考虑问题的解决方案时,不在用以前解数学题的方式,不在首先考虑用什么样的数据结构来表示和存储需求中的数据,而是首先考虑如何划分功能模块。如何在模块与模块之间做成解耦合的效果等。看问题的角度更加的宏观。但并不是说面向对象和面向过程是对立的,在编程时基本单元如具体某个方法,它的编程方法依然是使用过程化思维的。就好像现在正在讨论中的面向方面编程,组件化编程等,它们的根基依然来源于我们的面向对象。

好了,说了这么多不知道对大家有没有帮助,或者你们有更好的方法来讲解这两个概念,请不要忘了通知我,谢谢。

 

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值