面向对象 和 面向过程

面向对象的思想是在面向过程之后才出现的,让我们首先来看看什么是面向过程吧!

面向过程

面向过程的程序设计思想的核心是功能的分解。
当程序员试图用 C 或 Pascal 语言来设计程序以解决一个实际问题时,第一步要做的工作就是将问题分解成若干个称为模块的功能块,然后根据模块功能来设计一系列用于存储数据的数据结构, 最后编写一些过程(或函数) 对这些数据进行操作。最终的程序就是由这些过程构成的。显然, 这种方法将数据结构和过程作为两个实体来对待,其着重点在过程, 设计人员首先考虑如何将功能分解,在每一个过程中又要着重安排程序的操作序列, 但同时程序员在编程时又必须时时考虑数据结构,因为毕竟要将操作作用于数据上。数据结构和过程的这种分离, 给软件人员造成沉重的负担。例如,我们不可能要求数据结构始终没有变化, 且不说在软件维护的时候数据结构有可能发生变化, 就是在软件开发的过程中也不能保证数据结构不变化。面向过程的程序设计的缺点之一就是一旦数据结构需要变更的时候, 必须修改与之有关的所有模块。因此,面向过程的程序的可重用性差, 维护代价高。

面向对象

面向对象程序设计是一种新的程序设计范型。面向对象程序的主要结构特点是: 第一,程序一般由类的定义和类的使用两部分组成, 在主程序中定义各对象并规定它们之间传递消息的规律;第二, 程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。
面向对象程序设计的最大优点就是软件具有可重用性。当人们对软件系统的要求有所改变时,并不需要程序员做大量的工作, 就能使系统做相应的变化。
类与对象是面向对象程序设计中最重要的概念,也是一个难点, 想要掌握面向对象程
序设计的技术,首先就要很好地理解这两个概念。究竟什么是对象 ? 什么是类呢 ?
有一个例子来明白面向过程和面向对象:
面向过程
考虑一个银行系统。该系统允许顾客开设不同类型的银行账户,其中包括现金账户、支票账户和贷款账户,同时允许顾客存款取款和转账。根据面向过程的程序设计方法,首先我们将银行系统分解成三个模块分别负责存款、取款和转账三项工作。这三个过程是 MakeDeposit、WithDraw 和 Transfer。接着, 建立一个简单的数据结构:

struct account
{
    char name;
    / * 姓名 */
    · unsigned long accountId;
    / * 账号 */
    float balance;
    / * 余额 */
    float interestYTD / * 年利息 */
    char accountType / * 账户类型 (现金、支票和贷款) * /
} ;

然后,对每个过程按照一定的操作顺序编写程序。
现在,我们来分析一下, 程序员所关心的是否与顾客一致。对于一个顾客来说, 他最关心的是账户中还有多少钱,利息是多少, 钱存在银行是否安全, 而不会对存钱和取钱的程序执行的过程感兴趣。对他而言, 只是需要知道存、取款手续, 并按照这些手续去做就足够了。但程序设计人员所关注的是如何写存、取款的代码, 如何在已经建立的数据结构中填写数据并管理它们。可见,程序员与顾客关心的事情是不一致的, 这是由于数据结构与“过程”的分离造成的。我们再进一步分析,顾客与他们的银行账户有没有特殊的关系。在软件系统中,由于顾客只不过是一串字符和数字, 因而不用考虑到底是谁拥有该账户,账户里的内容是什么,而银行账号也只不过是一个整数。显然, 这与实际的情况不符。
另外,我们还注意到, 由于数据结构与“过程”的分离, 程序员可以非常方便地修改账目,因为对他来说, 只不过是在修改数据结构中的数字, 实际上他可能通过修改数据而走顾客的钱 !
最后, 我们考虑如果数据结构发生了一些变化会产生什么样的结果。对于 accountType 数据项, 原来只有现金账户、支票账户和贷款账户三种取值, 程序只能识别这三种取值。由于账户类型的不同, 我们在编写存款等过程时, 将以不同的操作序列与之对应( 在
同一个过程中分情况处理)。对现金账户、支票账户和贷款账户的处理不会完全相同。假设现在需要增加一种账户类型———退休账户, 后果如何 ? 原来的程序肯定出错。因为在原来的程序中我们只考虑了以上三种账户的情况,对于新增加的账户类型, 原来的程序不会处理。也就是说, 每增加一种新的账户类型, 都必须重新编写程序代码, 可见其维护软件的开销是相当大的。
上述这些问题的出现都是由于面向过程程序设计的解决方法的着重点在功能, 而我们通过分析发现,数据对于客户( 尤其是顾客)似乎更重要。在这里, 程序员关心的是如何做( how to do) , 而顾客则关心的是做什么( what to do) ,这是由于过程和数据的分离造成
的。使用面向对象的程序设计技术是解决这些问题的最好方法。
面向对象
我们还是通过解决银行账户问题来讨论什么是面向对象的程序设计。用面向对象的程序设计方法解决银行账户问题, 我们的着重点应该放在银行账户上。我们要了解账户上的顾客想做什么,什么对于他们是最重要的, 等等。简而言之, 在面向对象的程序设计中,着重点在那些将要被操作的数据, 而不是在实现这些操作的过程。数据构成了软件分解的基础,而不是功能。我们首先要分析顾客在账户( 数据)中要做什么, 然后提供相应的操作,更重要的是不能将数据和相应操作看成两个分离的实体, 而是要把它们作为一个完整的实体来对待。数据与定义在它上面的用户需要的操作构成一个整体。同时, 数据本身不能被外部程序和过程直接存取。如果想修改银行账户中的数据, 惟一的办法是在该数据上提供修改操作, 这些修改操作是以用户应得到的利益为根据。当我们把对银行账户的操作定义在数据上,银行账户就是一个类, 称为银行账户类。作为其实例, 我们可以建立许多具体的银行账户,而每一个具体的银行账户就是银行账户类的一个对象。

总结

  1. 面向对象关心的是实现的过程,侧重于怎么做,而不是做什么,就像我们做个蛋炒饭,面向过程的程序会明确第一步起锅烧油,接着放入鸡蛋,最后再放米饭。关注的是整个程序的执行顺序,并按照顺序执行。
  2. 面向对象主要关注的对象是数据本身,我们编写一个数据集合,并在数据集合上定义可以进行的操作,并且外部不能更改数据的属性。当我们在要做蛋炒饭的时候,我们就直接找个厨师对象,叫他帮我们做就好了。

没有哪一种语言是纯面向对象的,因为程序要执行么就一定会有过程,就一定会有面向过程的思想。
但是面向对象易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护。

事实上,我们人类就是以面相对象的方式认识世界的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值