面向对象与面向过程程序设计方法的比较
面向对象和面向过程程序设计理解及区别

⾯向对象和⾯向过程程序设计理解及区别项⽬名称⾯向对象程序设计⾯向过程程序设计(也叫结构化编程)定义是把构成问题事务分解成各个对象,建⽴对象的⽬的不是为了完成⼀个步骤,⽽是为了描叙某个事物在整个解决问题的步骤中的⾏为就是分析出解决问题所需要的步骤,然后⽤函数把这些步骤⼀步⼀步实现,使⽤的时候⼀个⼀个依次调⽤就可以了特点封装、继承、多态算法+数据结构优势适⽤于⼤型复杂系统,⽅便复⽤适⽤于简单系统,容易理解劣势⽐较抽象难以应对复杂系统,难以复⽤设计语⾔Java、Smalltalk、EIFFEL、C++、Objective-、C#、Python等C、Fortran使⽤场景30种编程语⾔的⽐较选择问题是把构成问题事务分解成各个对象,建⽴对象的⽬的不是为了完成⼀个步骤,⽽是为了描叙某个事物在整个解决问题的步骤中的⾏为。
扩展资料(Object Oriented,OO)是当前计算机界关⼼的重点,它是90年代软件开发⽅法的主流。
的概念和应⽤已超越了程序设计和软件开发,扩展到很宽的范围。
如数据库系统、交互式界⾯、应⽤结构、应⽤平台、分布式系统、⽹络管理结构、CAD技术、⼈⼯智能等领域。
⾯向对象,这⽅⾯的⽂章⾮常多。
但是,明确地给出对象的定义或说明对象的定义的⾮常少,⾄少现在还没有发现。
起初,“⾯向对象”是专指在程序设计中采⽤封装、继承、抽象等设计。
”(Procedure Oriented)是⼀种以过程为中⼼的编程思想。
“”也可称之为“⾯向记录”编程思想,他们不⽀持丰富的“⾯向对象”特性(⽐如继承、多态),并且它们不允许混合持久化状态和域逻辑。
参考资料收起2014-04-042017-11-10评论(18) 本回答被提问者采纳评论(356)更多回答(8)其他类似问题147199分享java118推荐于2017-09-22⾯向过程就是分析出解决问题所需要的步骤,然后⽤函数把这些步骤⼀步⼀步实现,使⽤的时候⼀个⼀个依次调⽤就可以了。
面向对象和面向过程的本质区别

面向对象和面向过程的本质区别面向对象(Object-oriented Programming,简称OOP)与面向过程(Procedure-oriented Programming,简称POP)是两种不同的编程范式,其本质区别主要体现在程序组织、设计思想和代码编写方式上。
1.程序组织方式:面向对象:程序被组织成对象的集合,每个对象拥有自己的属性和方法,并通过交互来完成任务。
对象将数据和操作封装在一起,形成一个独立的实体。
对象之间通过消息传递进行通信。
面向过程:程序被组织成一系列的过程或函数,每个过程执行特定的任务。
数据和操作是分离的,数据作为参数传递给过程,并返回处理后的结果。
2.设计思想:面向对象:强调的是对现实世界的建模,将问题的解决方案看作对象之间的协作。
通过将系统拆分成多个对象,每个对象负责完成特定的功能,并通过封装、继承、多态等机制来实现高内聚、低耦合的设计。
面向过程:以解决问题的步骤为中心,强调过程和函数的设计。
按任务顺序编写一系列步骤,通过数据传递和操作来解决问题。
设计上较为简单直接,适合小型程序。
3.抽象程度:面向对象:可以理解为一种更高层次的抽象。
通过将现实世界的实体抽象为对象,并定义对象之间的关系和行为,从而实现对问题的模拟和建模。
面向过程:着重于任务的具体实现步骤,在程序中以函数或过程的形式直接体现出来。
4.代码编写方式:面向对象:重点在于对象之间的交互和协作。
代码主要由类、对象、方法和消息等组成。
通过类的定义来创建对象,调用对象的方法来实现具体功能,实现了代码的重用性。
面向过程:代码主要由函数、变量和控制流程语句等组成。
强调算法和步骤,代码的编写比较直接,相对简单。
5.扩展性和维护性:面向对象:封装、继承和多态的机制使得代码易于扩展和维护。
对系统的修改和扩展只需添加新的类或修改现有类的方法,不会影响到其他部分的代码。
通过继承和多态可以实现代码的重用和灵活性。
面向过程:代码的耦合性较高,修改和扩展可能需要改动多个函数,会导致代码的脆弱性和维护困难。
面向对象和面向过程对比

面向对象和面向过程对比面向对象(Object-oriented programming,OOP)和面向过程(Procedure-oriented programming,POP)是两种不同的编程范式。
在面向对象编程中,整个程序被组织为一系列对象,对象之间通过消息传递进行通信和交互;而在面向过程编程中,程序由一系列函数组成,函数按照特定的顺序依次调用执行。
1.抽象性和封装性面向对象编程通过对象的抽象和封装将现实世界中的实体和其相关的行为组合到一个独立的实体中。
对象具有各自的属性和方法,可以隐藏内部细节,并通过接口对外部提供有限的访问。
这种抽象和封装提高了代码的可维护性和重用性。
而面向过程编程较少利用抽象和封装的概念,更注重解决问题的过程和流程,将问题分解为一系列的步骤,每个步骤对应一个函数。
2.继承和多态继承是面向对象编程的重要特性,通过继承,一个类可以派生出一个或多个子类,子类可以继承并扩展父类的属性和方法。
继承提供了代码的重用性和灵活性。
而面向过程编程没有继承的概念,每个函数是独立的,不能共用或扩展。
多态也是面向对象编程的特性,多态允许使用不同的对象对同一方法进行调用,并根据对象的类型执行不同的操作。
这样可以增加代码的灵活性和可扩展性。
而面向过程编程没有多态的概念。
3.面向对象思维面向对象编程更贴近真实世界的思维方式,通过将问题和解决方案分解为对象和对象之间的交互,更容易理解和表达复杂的概念。
面向过程编程更侧重于解决问题的过程和步骤,更符合机器的思维方式。
4.可维护性和重用性由于面向对象编程中的抽象和封装特性,代码更容易维护和理解。
一个对象在修改时只需要关注自己的属性和方法,而不必关心其他对象的实现细节,同时代码的重用性也得到了提高。
而面向过程编程中缺乏抽象和封装,代码之间的耦合度较高,导致代码的维护和修改困难,重用性较差。
5.开发效率面向对象编程的模块化和重用性可以提高开发效率,特别是对于大型项目和团队合作。
面向对象程序设计与面向过程程序设计的区别 1

面向对象程序设计与面向过程程序设计的区别想要知道面向对象程序设计与面向过程程序设计的区别,我们应先了解什么事面向对象程序设计,什么事面向过程程序设计,这样我们才能弄清他们之间的区别,下面我们就什么是面向对象程序设计和什么事面向过程程序设计展开论述。
面向对象的基本概念:(1)对象。
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
(2)对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中(3)类。
具有相同或相似性质的对象的抽象就是类。
因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
(4)类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。
通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
(5)消息和方法。
对象之间进行通信的结构叫做消息。
在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。
发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。
一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
(1)对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。
在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
(2)抽象性。
Python之面向过程和面向对象的区别

Python之⾯向过程和⾯向对象的区别⼀、⾯向过程 1、⾯向过程:核⼼是过程⼆字,过程指的是解决问题的步骤,好⽐如设计⼀条流⽔线,是⼀种机械式的思维⽅式。
就是程序从上到下⼀步步执⾏,⼀步步从上到下,从头到尾的解决问题。
基本设计思路就是程序⼀开始是要着⼿解决⼀个⼤的问题,然后把⼀个⼤问题分解成很多个⼩问题或⼦过程,这些⼦过程再执⾏的过程再继续分解直到⼩问题⾜够简单到可以在⼀个⼩步骤范围内解决。
2、优缺点: 优点:将复杂的问题流程化,进⽽简单化。
缺点:扩展性差 3、实例:⾯向过程式的登录注册程序 import json,redef login():'''⽤户输⼊:return:'''usename = input('⽤户名:').strip()pwd = input('密码:').strip()tel = input('电话:').strip()mail = input('邮箱:').strip()return {'usename':usename,'pwd':pwd,'tel':tel,'mail':mail}def authentication(use_info):'''判断⽤户名和密码等信息是否合法:return:'''is_valid = True # 默认合法if len(use_info['usename'])==0:print('⽤户名不能为空!')is_valid = Falseif len(use_info['pwd'])< 6:print('密码长度不得⼩于6位!')is_valid = Falseif len(re.findall('1[0-9]{10}',use_info['tel']))==0:print('电话格式不对!')is_valid = Falseif not re.search(r'@.*?.com$',use_info['mail']).group(): # 使⽤Python的r前缀,就不⽤考虑转义的问题,'*'加个?就可以让'.'采⽤⾮贪婪匹配print('邮箱格式不对')is_valid = Falsereturn {'valid':is_valid,'info':use_info}def register(auth):'''若输⼊信息合法则注册,写⼊⽂件或数据库:param auth::return:'''if auth['valid']==True:with open('data.json','w',encoding='utf-8') as f:json.dump(auth['info'],f)def main():'''主逻辑程序:return:'''use_info = login()auth = authentication(use_info)register(auth)if__name__=='__main__': # 直接调⽤时执⾏下列程序,被调⽤时不执⾏main()View Code 注意:⼀般认为,如果你只是写⼀些简单的脚本,去做⼀些⼀次性任务,⽤⾯向过程的⽅式是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是⽤⾯向对象最⽅便。
面向对象和面向过程的区别及优劣对比详解

⾯向对象和⾯向过程的区别及优劣对⽐详解以前上⾯向对象这门课的时候,我是没有特别注意这些。
但现在发现⾯向对象和⾯向过程的设计思想是很重要的1.⾯向对象和⾯向过程有什么区别?⾯向对象程序设计和⾯向过程程序设计的区别实际就是解决问题的⽅式不同。
先解释⾯向过程,你得先分析出解决问题的步骤,然后⽤函数把这些步骤⼀步⼀步地实现,解决的时候就是⼀个⼀个函数地调⽤。
⾯向对象,⾸先你需要知道对象的概念。
对象,就是类中某个具体的实例,⽐如⼈类张三,李四就是类的某个对象,他们有⾃⼰独特的个性。
⾯向对象,看名字它是注重对象的。
当解决⼀个问题的时候,⾯向对象会把事物抽象成对象的概念,就是说这个问题⾥⾯有哪些对象,然后给对象赋⼀些属性和⽅法,然后让每个对象去执⾏⾃⼰的⽅法,问题得到解决。
不懂别急,举个例⼦你就明⽩了,不懂都难^_^⾯临的问题:洗⾐机⾥⾯放有脏⾐服,怎么洗⼲净?⾯向过程:1 执⾏加洗⾐粉⽅法;2.执⾏放洗涤剂⽅法3执⾏加⽔⽅法;5 执⾏放⾐服,洗⾐服⽅法;6执⾏清洗⽅法;7. 执⾏烘⼲⽅法;----------解决问题拆成⼀个个⽅法,是没有对象去调⽤的。
通过⼀个个⽅法的执⾏解决问题。
⾯向对象:我先搞个洗⾐机对象和⼈对象洗⾐机:加⼊⼀些属性和⽅法洗⾐服⽅法清洗⽅法烘⼲⽅法⼈:加洗⾐粉⽅法加⽔⽅法然后⼈.加洗⾐粉⼈.加⽔洗⾐机.洗⾐服洗⾐机.清洗洗⾐机.烘⼲----------同样解决问题先抽象出对象,然后⽤对象执⾏⽅法的⽅式解决问题。
关于两者的优缺点,根据你的需要来判断。
并不能⼀概⽽论⽹上很多关于⼆者优缺点,我认为最形象的解释是蛋炒饭和盖浇饭的⽐较蛋炒饭:盖浇饭:蛋炒饭的好处就是⼊味均匀,吃起来⾹。
如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯⼀的办法就是全部倒掉,重新做⼀份青菜炒饭了。
盖浇饭就没这么多⿇烦,你只需要把上⾯的盖菜拨掉,更换⼀份盖菜就可以了。
盖浇饭的缺点是⼊味不均,可能没有蛋炒饭那么⾹。
到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,⾮要⽐个上下⾼低的话,就必须设定⼀个场景,否则只能说是各有所长。
面向对象编程与面向过程编程的比较
面向对象编程与面向过程编程的比较面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming)是两种主流的编程范式。
虽然它们在很多方面都有相似之处,但也存在一些明显的差异。
本文将对面向对象编程和面向过程编程进行比较,分析它们各自的优势和劣势。
面向对象编程将数据和操作数据的函数封装在一起,形成一个对象。
对象是类的实例,类是一种描述相似对象特征和行为的模板。
面向过程编程则是将计算机程序视为一系列的步骤,即一组函数的集合,这些函数按照特定的顺序执行。
面向对象编程的特点是封装、继承和多态。
封装将数据和操作数据的函数封装在一起,隐藏内部实现细节,提供对外的接口。
继承允许创建新类,从一个或多个现有的类继承属性和方法,使代码更加灵活和可重用。
多态允许不同对象对同一消息作出不同的响应,提高代码的灵活性和扩展性。
面向过程编程注重对问题进行细分和精确的算法设计。
它将任务分解为一系列的步骤,按照特定的顺序执行。
面向过程编程更加注重函数和流程的设计,对数据的操作相对较少。
面向对象编程相对于面向过程编程具有以下优势:1.高内聚性和低耦合性:面向对象编程将数据和操作数据的函数封装在一起,每个对象只需要关注自己的数据和操作,提高了代码的内聚性。
同时,对象之间通过接口进行通信,降低了对象之间的依赖性,减少了代码的耦合性。
2.可重用性和可维护性:面向对象编程通过继承和多态实现代码的重用。
可以通过创建新类来扩展已有的类,并重用已有的代码和实现。
同时,面向对象编程的封装特性使得代码更易维护,当需要修改某个功能时,只需要修改相应的类即可,不需要修改整个系统。
3.扩展性和灵活性:面向对象编程能够很好地支持系统的扩展和变化。
通过继承和多态的特性,可以在不修改现有代码的情况下添加新的功能和行为。
这使得系统更加灵活和可扩展。
4.多人协作:面向对象编程使得多人协作更加容易。
面向对象编程和面向过程编程的理解
面向对象编程和面向过程编程的理解
面向对象编程(面向对象编程,简称OOP)和面向过程编程(面向过程编程,简称FP)是两种编程范式,各有优缺点,具体区别如下:
1. 对象:对象是一种数据结构,包含数据和操作这些数据的方法。
在面向对象编程中,对象是独立存在的,可以独立地进行操作,而不需
要关心底层的实现细节。
对象之间可以相互通信,从而实现了封装、
继承和多态等特性。
2. 过程:过程是程序的执行流程,包括输入、处理和输出等步骤。
在面向过程编程中,过程被看作是独立于其他程序的部分,不能与其
他程序相互通信。
所以过程通常只能静态地分配内存,不能动态地分
配内存。
3. 优点:面向对象编程的优点包括:提高软件的可维护性、可扩
展性和可重用性。
对象之间的相互作用可以更好地描述软件系统的逻辑和流程,使得代码更加模块化和易于维护。
面向对象编程还可以更
好地支持多线程和网络编程等高级编程功能。
4. 面向过程编程的优点包括:简单易学、代码可读性高、程序运行效率高等。
过程程序通常易于理解和维护,而且代码可读性高,适合快速开发。
面向对象编程和面向过程编程各有优缺点,选择哪种编程范式取
决于具体的应用场景和开发需求。
在软件开发中,通常先尝试面向对
象编程,如果难以实现或无法满足需求,再转向面向过程编程。
面向对象程序设计语言和面向过程程序设计语言的区别有哪些
面向对象程序设计语言和面向过程程序设计语言的区别有哪些?面向对象的特点是:封装.多态.继承.其中多态有分为重载和重写.面向对象的编程思想更加接近现实的事物.有这样几点好处:1.是编程更加容易.因为面向对象更接近于现实.所以你可以从现实的东西出发.进行适当的抽象.2.在软件工程上.面向对象可以使工程更加模块化.实现更低的耦合和更高的内聚.3.在设计模式上(似乎只有面向对象才设计到设计模式).面向对象可以更好的实现开-闭原则.也使代码更易阅读.相对而言.面向过程的程序设计是面向对象程序设计的基础.面向对象的程序里面一定会有面向过程的程序片断的!面向对象编程(ObjectOrientedProgramming,OOP,面向对象程序设计)是一种计算机编程架构。
OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
OOP主要有以下的概念和组件:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为面向对象: 举个例子,盖一座大楼,你想到的是楼怎么盖,哪里要有柱子,哪里要有梁,哪里楼梯等等(这就是面向对象),至于柱子该怎么建,用什么建,方的圆的,等等,这就是面向过程。
用面向对象思考问题更符合我们人的思考方式。
其实我们人现实生活中都是在面向对象。
比如:去饭店吃饭,你只要说明吃什么就可以了,有必要还了解这个菜是怎么做的,是哪里来的,怎么去种这个菜吗?面向对象也可以说是从宏观方面思考问题,而面向过程可以说是从细节处思考问题。
在面向对象中,也存在面向过程。
面向过程与面向对象的区别
⾯向过程与⾯向对象的区别⼀、区别1.编程思想不同 ⾯向过程:是⼀种以过程为中⼼的编程思想。
都是以什么正在发⽣为主要⽬标进⾏编程。
⾯向对象:是⼀类以对象作为基本程序结构单位的程序设计语⾔,指⽤于描述的设计是以对象为核⼼,⽽对象是程序运⾏时刻的基本成分。
2.特点不同 ⾯向过程:就是分析出解决问题所需要的步骤,然后⽤函数把这些步骤⼀步⼀步实现,使⽤的时候⼀个⼀个依次调⽤就可以了。
⾯向对象:是把构成问题事务分解成各个对象,建⽴对象的⽬的不是为了完成⼀个步骤,⽽是为了描叙某个事物在整个解决问题的步骤中的⾏为。
3.优势不同 ⾯向过程:不⽀持丰富的“⾯向对象”特性(⽐如继承、多态),并且不允许混合持久化状态和域逻辑。
⾯向对象:在内部被表⽰为⼀个指向⼀组属性的指针。
任何对这个对象的操作都会经过这个指针操作对象的属性和⽅法。
⼆、优缺点 ⾯向过程(Procedure Oriented Programming) ⾯向过程是具体化的,流程化的,解决⼀个问题,你需要⼀步⼀步的分析,⼀步⼀步的实现。
优点:性能⽐⾯向对象好,因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗资源。
⽐如单⽚机、嵌⼊式开发、 Linux/Unix等⼀般采⽤⾯向过程开发,性能是最重要的因素。
缺点:不易维护、不易复⽤、不易扩展。
⾯向对象(Object Oriented Programming) ⾯向对象是模型化的,你只需抽象出⼀个类,这是⼀个封闭的盒⼦,在这⾥你拥有数据也拥有解决问题的⽅法。
需要什么功能直接使⽤就可以了,不必去⼀步⼀步的实现,⾄于这个功能是如何实现的,管我们什么事?我们会⽤就可以了。
优点:易维护、易复⽤、易扩展,由于⾯向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
可维护性表现在三个⽅⾯:可理解性。
可测试性和可修改性。
缺点:性能⽐⾯向过程低。
三、⼩结 ⾯向对象就是⾼度实物抽象化、⾯向过程就是⾃顶向下的编程! ⾯向对象是以功能来划分问题,⽽不是步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象与面向过程程序设计方法的比较摘要:区别于一般讲述面向对象技术的文章,本文系统地比较了面向对象技术和面向过程技术的异同,并着重介绍面向对象技术以及它的封装、继承和多态三个特点,让读者对面向对象有一个形象的理解。
然后通过比较和举例,文章分析了OO技术在软件工程中的三大优势。
Abstract:Being different from general articles about object-oriented technology ,this paper systematically compared the object-oriented technology and the process-oriented technology, and mainly introduces the object-oriented technology and its three characteristics :packaging, inheritance and polymorphism, to make the reader have an image of understanding of object-oriented. Then through the comparison and some examples, this paper analyzes the OO based software engineering in three points.关键字:面向对象面向过程软件工程Key words:Object-Oriented Process-Oriented Software-Engineering一引言20世纪60年代中期开始爆发的软件危机,使人们认识到大中型软件系统与小型软件系统的本质区别,软件工程以及面向对象编程(Object-Oriented Programming)技术得以应运而生。
从最初的SIMULA到如今的C++、JAVA和C#,面向对象程序设计语言已发展为当前最流行的程序设计语言。
谈到面向对象,一个不能回避的问题是面向过程的程序设计思想。
作为一种常用的面向对象语言,C++自C语言发展而来,是一种混合型面向对象的程序设计语言,它既支持面向对象又支持面向过程。
面向对象与面向过程虽然在设计理念上截然相反,前者是自底向上而后者是自顶向下的,但它俩仍有众多的相似之处。
只有建立在深入理解二者的关系的基础上,我们才算是真正驾驭了面向对象与面向过程技术,以便在未来将它们熟练地运用于学习和生活中。
二面向过程的程序设计方法著名的计算机科学家Nikiklaus Wirth提出了一个公式:程序=算法+数据结构。
这个公式很好地诠释了面向过程程序设计方法的核心思想——算法和数据。
更加具体地说,面向过程的程序设计方法称为功能分解,即自顶向下。
以两个人下五子棋为例,面向过程的设计方法是先决定二人中谁先手,然后是先手者下一子,判断游戏是否结实,后手者下一子,判断游戏是否结束……可以看到无论是猜先、落子还是最后的判胜负,它们都是一场五子棋游戏中不能再分割的逻辑单位。
程序员的工作是将这些最底层的功能进行编码并测试,然后将这些功能自底向上装配在一起,直到得到一个完整功能的应用程序。
在这种体系中,我们的着眼点是一个个最基本的功能,数据是为了实现这些功能而设计的,它是后于功能的。
当问题的规模不大时,面向过程的设计方法因其逻辑关系明确,实现简单而备受程序员们的青睐。
但是当问题规模扩大到大中型软件时,一个项目的代码量不是一个人可以单独完成的。
小组的分工与合作成为解决代码量大的方法,但是这又向程序员之间的配合提出了新的挑战,同时数据共用导致的不安全、代码重用率低等问题也阻碍着面向过程的方法在大型软件工程中的发展。
这便是前文中提到的软件危机。
三面向对象的程序设计方法区别与面向过程的“先功能后数据”思想,面向对象的程序设计方法把状态(数据)和行为(功能)捆绑在一起,形成了对象。
当遇到一个具体的问题时,我们只需要将一个系统分解成一个个的对象,同时将状态和行为封装在对象中。
此时我们回过头再考虑五子棋游戏,作为一个系统,它可以被我们分解成若干对象,一种思路是分成棋盘、棋子和玩家三类。
或许在这个简单的例子中,OO的优势并不明显,但是在一些大型的系统中,第二种解题思路会清晰得多。
人们总结了面向对象的三个基本特点:封装、继承和多态。
1 封装封装是一个用来指代将对象的状态和行为捆绑到一个单一逻辑单元的机制的正式术语。
它不是面向对象语言所特有的,面向过程的C语言用结构封装了数据,函数封装了逻辑。
但是面向对象封装了两者,从这种意义上来说,面向对象的封装更加完美。
出于一些安全性与方便性的考虑,对象经常会限制对它们特征(包括属性和方法)的访问,这种限制称为信息隐藏。
作为对象的抽象,类通常只公开对象可以公开的东西,主要是一个特定对象对系统的服务,而隐藏执行服务的内部细节和为了完成这些服务而设计的数据。
注意这不是说面向对象和面向过程一样是数据后于功能的。
在面向过程中这种先后关系是贯穿全局而在面向对象中,即使存在先后关系也仅仅是在一个具体方法中,对于那些来自外部的调用来说它们是平行的,因此在OO中我们不讲状态和行为的先后关系(有一种说法是状态先于行为,即功能先于数据,但这也不同于面向过程)。
封装和信息隐藏带来的好处用一个例子来说明最恰当不过。
著名的Y2K危机指电脑从1999年跨入2000年时,造成年序错乱而引发的一系列问题。
第一代计算机在设计时出于节省空间的考虑,将西元年缩为后两位数字,之后的历代计算机都沿用了这个习惯。
到了2000年人们不得不面对一个日期格式从2位增至4位的问题,据统计有数十亿美元的资金被用来找出和修补那些可能会造成惨重损失的连锁效应。
在面向过程的设计体系中,数据在全局范围内共享,日期这个数据可能会从程序伊始到结尾都在被访问,因此数以千万计的代码都要被修改。
危机!而在面向对象的体系中,一个一百万行的工程可能只有一个一百行的类会涉及到具体的日期格式,其余的N多行代码纵使出现日期也只是对日期类公有接口的调用,不会出现因为日期格式改变而引发的问题。
这种变化带来的影响充其量只是一个工程的日常维护。
2 继承继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别。
对于一个特定的继承关系,我们将创建的新类称为子类(subclass),被继承的原始类称为超类(superclass)。
子类可以使用超类定义属性和方法,也可以自己定义新的属性和方法。
超类的特征不会受到子类的影响。
继承带来的第一个且是最显而易见的好处是减少了代码冗余,因此也减轻了需要改进或重写代码时的负担。
进一步地,子类会比不使用继承时更加简洁,这点应当不难理解;通过继承可以不加修改地重用和扩展已经彻底测试的代码,这避免了工程性的组装对已经完成测试代码的影响;最好的一点,即使没有已有类的源代码,仍然可以从已有的类中派生出新类,只要我们拥有那个类编译后的字节码。
有了继承的机制,程序员们彻底告别了过去那个事必躬亲的coding时代。
20世纪90年代初期,当时正在加州大学埃尔文分校攻读博士学位的Douglas Schmidt在观察了他所参与的软件项目开发实践之后,得出一个结论,即未来的软件开发将越来越多地体现为整合(integration),而不是传统意义上的编程(programming)。
换言之,被称为“软件开发者”的这个人群,将越来越明显地分化:一部分人开发核心构件和基础平台,而更多的人将主要是配置和整合现有构件以满足客户的需求。
整合依靠的技术,其中一项正式继承。
3 多态术语多态指的是属于两个或多个不同类的对象以各自的类相关的不同方式响应同一消息(方法调用)的能力。
同一个消息根据发送的对象不同而采用多种不同的行为方式。
换句话说多态使得消息发送者能给一组具有公共接口的对象发送相同的消息,接收者做出相应的回应。
多态的作用:增强了代码的可读性、操作的透明性,增强了代码的灵活性和可扩充性。
四面向对象在软件工程中的优势总结前文的基础上,针对面向对象技术在软件工程中的垄断地位,我总结了三个原因。
1 安全性软件安全一般分为应用程序级别的安全性和操作系统级别的安全性。
应用程序级别的安全性,包括对数据或业务功能的访问,在预期的安全性情况下,操作者只能访问应用程序的特定功能、有限的数据等。
类似的特点在面向对象的信息隐藏部分我们有介绍,应该说信息隐藏是实现软件安全的最基本保证。
而在面向过程的程序设计中,一些数据的作用范围是整个工程,对这些数据的修改和使用随处可见,程序员很难保证自己在使用数据的时候数据仍保留着自己的期望值。
2 可持续性记得某位老师在课上说过这么一句话“一个软件若是一年内都没更新,那它离死亡已经不远了”。
在这个信息高速膨胀的社会,“明天”两个字多少显得有些恍惚。
一年的时间可以淘汰很多东西,在信息界这个特点更加显著。
摩尔定律说的“当价格不变时,集成电路上可容纳的晶体管数目,约每18个月便会增加一倍,性能也将提升一倍”很好的体现了这点。
为了让一个软件保持生命力,一个有效的手段是更新,让它跟得上时代的脚步。
用当下一句流行的话说,软件是可持续发展的。
从前文的Y2K一例中,我们应当能深刻地认识到OO技术在更新方面较面向过程具有的得天独厚的优势。
3 传播性动态规划其实是一种高效的搜索,一个搜索算法的时间复杂度通常是阶乘级别或者指数级别,而同一个问题若是可以用动态规划解决,它的时间复杂度通常在多项式范围内。
它能做到如此高效的原因,用一句通俗的话来说叫“不做已经做过的事情”。
想要移植一个面向过程的程序,必须要求数据格式、编程风格的高度相似。
这项工作若是开始在一个工程的初期还可以勉强接受,若是在面向过程的工程进行中忽然提出这么一个要求,我想大概只有那个写被移植码的人才能胜任。
在一个基于面向对象的工程中则完全没有这个顾虑,只要给出了所有的接口,任何人都可以完成这项工作。
五结束语面向过程的程序设计思想核心是自底向上的功能分解,实现某一特定功能的函数是面向过程程序的最基本组成部分。
它的逻辑性强,解题步骤清晰,适合解决一些规模不大的问题。
面向对象的技术则是由一个个的对象构成,每一个对象都封装了特定的状态和行为。
它拥有的封装、继承和多态三大特点使它垄断了几乎所有的软件工程语言。
参考文献[1](美)Jacquie Barker. Beginning Java Objects中文版:从概念到代码(第2版)[M].万波等译.北京:人民邮电出版社,2007.[2](美)Andy Oram & Greg Wilson. 代码之美[M].BC Group译.北京:机械工业出版社,2010.[3]沈学东等.由面向对象程序教学问题引发的思考[J].计算机工程与科学,2011,(1).[4]谭娟.面向过程与面向对象程序设计的比较[J].湖南科技学院院报,2008,(12).[5]张亚林,耿祥义.基于软件工程思想的软件安全性保障框架研究[J].电脑知识与技术,2009,(31).。