WdBly Blog

懂事、有趣、保持理智

WdBly Blog

懂事、有趣、保持理智

周维 | Jim

603927378@qq.com

面向过程的程序设计和面向对象的程序设计

面向过程的程序设计和面向对象的程序设计思路

面向过程的程序设计(结构化程序设计)

结构化程序设计的基本思想是自顶向下、逐步求精,即将复杂的大问题层层分解为许多简单的小问题的组合。整个程序被划分成多个功能模块,不同的模块可以由不同的人员进行开发,只要合作者之间规定好模块之间相互通信和协作的接口即可。

结构化程序设计归根到底要考虑的就是如何将整个程序分成一个个函数,哪些函数之间要互相调用,以及每个函数内部将如何实现。

函数就是面向过程的程序设计的基本单元。

结构化程序在规模变大时会难以理解和维护。

在结构化的程序中,函数和其所操作的数据(全局变量)之间的关系没有清晰和直观的体现。随着程序规模的增加,程序逐渐难以理解,很难一下子看出来函数之间存在怎样的调用关系,某项数据到底有哪些函数可以对它进行操作,某个函数到底是用来操作哪些数据的。

在这种情况下,当某项数据的值不正确时,很难找出到底是哪个函数导致的,因而程序的查错也变得困难。

结构化的程序不利于修改和扩充(增加新功能)。

结构化程序设计没有“封装”和“隐藏”的概念,要访问某个变量时可以直接访问,当该变量的定义有改动时,就要把所有访问该变量的语句找出来修改,这些语句可能分散在上百个函数之中,这显然十分费时费力。

结构化程序不利于代码的重用。

在编写某个程序时,常常会发现其需要的某项功能在现有的某个程序中已经有了相同或类似的实现,因而自然希望能够将那部分源代码抽取出来,在新程序中使用,这就叫代码的重用。

但是在结构化程序设计中,随着程序规模的增大,大量函数、变量之间的关系错综复杂,要抽取可重用的代码往往变得十分困难。

函数式编程

Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

面向对象的程序设计

概念

面向对象的程序设计思路更接近于真实世界。真实世界是由各类不同的事物组成的,每一类事物都有共同的特点,各个事物互相作用构成了多彩的世界。

面向对象的程序则是由各类不同的对象组成,每一类的对象都有着不同的属性方法。

面向对象的程序设计方法要分析待解决的问题中有哪些类事物,每类事物都有哪些特点,不同的事物种类之间是什么关系,事物之间如何相互作用等。

特点

面向对象的程序设计有“抽象”、“封装”、“继承”、“多态”四个基本特点。

抽象

在面向对象的程序设计方法中,各种事物称为“对象”。将同一类事物的共同特点概括出来,这个过程就叫作“抽象”。

对象的特点包括两个方面:属性和方法。
属性指的是对象的静态特征,如员工的姓名、职位、薪水等,可以用变量表示;
方法指的是对象的行为,以及能对对象进行的操作,如员工可以请假、加班,员工可以被提拔、被加薪等,可以用函数表示。

封装

在完成抽象后,通过某种语法形式,将数据(即属性)和用以操作数据的算法(即方法)捆绑在一起,在形式上写成一个整体,即“类”,这个过程就叫作“封装”。

通过封装,数据和操作数据的算法紧密联系起来。

通过封装,还可以将对象的一部分属性和方法隐藏起来,让这部分属性和方法对外不可见,而留下另一些属性和方法对外可见,作为对对象进行操作的接口。这样就能合理安排数据的可访问范围,减少程序不同部分之间的耦合度,从而提高代码扩充、代码修改、代码重用的效率。

继承

以现有代码为基础方便地扩充出新的功能和特性,是所有软件开发者的需求。结构化的程序设计语言对此没有特殊支持。而面向对象的程序设计语言通过引入“继承”机制,较好地满足了开发者的需求。

所谓“继承”,就是在编写一个“类”的时候,以现有的类作为基础,使得新类从现有的类“派生”而来,从而达到代码扩充和代码重用的目的。

多态

“多态”则是指不同种类的对象都具有名称相同的行为,而具体行为的实现方式却有所不同。例如,游戏中的弓箭手和刀斧手都有名为“攻击”的方法,但是两者的实现方式不同,前者是通过射箭实现攻击,后者则是通过劈砍实现攻击。

多态实质上是继承的实现细节;那么让多态与封装、继承这两个概念并列,显然是不符合逻辑的