面向对象和面向过程对比

上传人:笛音 文档编号:25872619 上传时间:2017-12-19 格式:DOC 页数:6 大小:54.50KB
返回 下载 相关 举报
面向对象和面向过程对比_第1页
第1页 / 共6页
面向对象和面向过程对比_第2页
第2页 / 共6页
面向对象和面向过程对比_第3页
第3页 / 共6页
面向对象和面向过程对比_第4页
第4页 / 共6页
面向对象和面向过程对比_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《面向对象和面向过程对比》由会员分享,可在线阅读,更多相关《面向对象和面向过程对比(6页珍藏版)》请在金锄头文库上搜索。

1、Q:面对对象和面向过程的优缺点,结合实例进行阐述A:一、个人理解,面向对象相对于面向过程较显著的优势莫过于可扩展性、可维护性。众所周知在软件开发过程中,开发人员与客户需要不断的沟通,而客户的需求也往往在不断的变化,软件的功能也不是一成不变的。如果采用面向过程的方法来进行软件开发,当用户需求发生变化时,比如要求修改现有软件功能的实现方式或者要求追加新的功能时,就需要自顶向下地修改模块的结构,有时候甚至整个软件系统的设计被完全推翻。相比之下,面向对象所提供的可扩展性保证了当软件必须增加新的功能时,能够在现有系统结构的基础上,方便的创建新的子系统,而不需要改变软件系统现有的结构,也不会影响已经存在的

2、子系统。可维护性则保证了当用户需求发生变化时,只需要修改局部的子系统的少量程序代码,而不会牵一发动全身。举一个例子,暴雪公司开发的魔兽争霸游戏,这个游戏里面有很多人物角色,例如我们要编程实现美杜莎这个角色的技能攻击动作。如果使用面向过程的方法来实现。本例使用 C+,Visual C+ 6.0 环境下调试。#includeusing namespace std;#define SPLIT_SHOT 1#define MYSTIC_SNAKE 2#define MANA_SHIELD 3void useSplitShot() /使用分裂箭技能coutskill; /输入技能快捷键switch(sk

3、ill)case SPLIT_SHOT:useSplitShot();break;case MYSTIC_SNAKE:useMysticSnake();break;case MANA_SHIELD:useManaShield();break;default:cout skills = new HashMap();staticskills.put(new Integer(SPLIT_SHOT), SplitShot);skills.put(new Integer(MYSTIC_SNAKE), MysticSnake);skills.put(new Integer(MANA_SHIELD), Ma

4、naShield);public static Skill getSkill(int key)tryString className = skills.get(new Integer(key);return (Skill)Class.forName(className).newInstance();catch(Exception e)e.printStackTrace();return null;Medusa.javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class Medusa /角色类 美

5、杜莎public void useSkill() throws Exception /实现美杜莎释放技能的方法BufferedReader input = new BufferedReader(new InputStreamReader(System.in);int key = Integer.parseInt(input.readLine(); /输入技能快捷键Skill skill = SkillFactory.getSkill(key);if(skill=null)System.out.println(无法使用技能 );elseskill.useSkill();public static

6、 void main(String args) throws Exceptionnew Medusa().useSkill(); /美杜莎释放技能假设同样的情况,暴雪公司需要给美杜莎增加一个新的技能石化凝视(Stone Gaze),那么只需要对该系统做如下修改:(1) 增加一个石化凝视技能类StoneGazepublic class StoneGaze implements Skill /石化凝视技能类public void useSkill()System.out.println(Stone Gaze); /使用石化凝视技能(2) 在SkillFactory类中增加一个STONE_GAZE常

7、量,并修改静态代码块。修改过的代码如下:public static final int SPLIT_SHOT = 1;public static final int MYSTIC_SNAKE = 2;public static final int MANA_SHIELD = 3;public static final int STONE_GAZE = 4;private static Map skills = new HashMap();staticskills.put(new Integer(SPLIT_SHOT), SplitShot);skills.put(new Integer(MYS

8、TIC_SNAKE), MysticSnake);skills.put(new Integer(MANA_SHIELD), ManaShield);skills.put(new Integer(STONE_GAZE), StoneGaze);由此可见,当Medusa系统增加技能时,仅仅修改了Skill子系统,对Medusa子系统并没有任何影响。此外,Skill子系统具有良好的可扩展性,当Skill子系统需要增加新的技能时,无须修改Skill子系统的系统结构,只需要创建新的技能实现类即可。上面的例子比较简单,所以面向对象的易扩展易维护的优势体现的不太明显,但是如果随着客户提出的问题域复杂度的增加

9、,修改面向过程软件的难度会以几何倍数增长,甚至会导致整个系统不得不推翻重做。二、除了可扩展性和可维护性外,面向对象还具有可重用性,从而可以减少软件中的重复代码,避免重复编程。三、面向对象中提出的对象概念更贴近现实,符合自然世界的规律,程序设计本来就是对现实世界的模拟,使用面向对象就能很自然的模拟出问题域。四、对一个团队来说,使用面向对象思想编程,可以很容易的把项目的具体工作分离,分工合作,同时开发,从而降低了开发成本,提高了开发效率。五、在 面 向 过 程 程 序 中 , 许 多 重 要 的 数 据 被 放 置 在 全 局 数 据 区 , 这 样 它 们 可 以 被 所 有的 函 数 访 问

10、。 这 种 结 构 很 容 易 造 成 全 局 数 据 在 无 意 中 被 其 他 函 数 改 动 , 因 而 程 序 的 正 确性 不 易 保 证 。 面 向 对 象 程 序 设 计 的 出 发 点 之 一 就 是 弥 补 面 向 过 程 程 序 设 计 中 的 一 些 缺 点 :对 象 是 程 序 的 基 本 元 素 , 它 将 数 据 和 操 作 紧 密 地 连 结 在 一 起 , 并 保 护 数 据 不 会 被 外 界的 函 数 意 外 地 改 变 , 这 个 就 是 面 向 对 象 的 封 装 性 。以 上 是 面 向 对 象 相 对 于 面 向 过 程 的 优 点 , 但 是 面

11、向 对 象 也 有 不 如 面 向 过 程 之 处 。一 、 对 同 一 个 问 题 域 来 说 , 面 向 对 象 程 序 的 执 行 速 度 不 如 面 向 过 程 程 序 。 在计算机速度飞速发展的今天,你可能会说,一丁点的性能牺牲没什么大不了。是的,从面向对象的角度,使的编程的结构更加清晰完整,数据更加独立和易于管理,性能的牺牲可以带来这么多的好处,没有理由不做稳赚的生意吧? 不过,在某些对速度要求极高特殊场合,例如你做的是电信的交换系统,每秒钟有超过百万的人同时进行电话交换,如果,每一个数据交换过程都是一个对象,那么总的性能损失将是天文数字。二、面向对象程序中过多的继承属性,会导致存储问题。不过话说回来,无论是面向对象那种如同描绘现实世界般的神奇画笔还是面向过程那种沉浸于流程和算法的脑力激荡都是我非常喜欢的,哈哈。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号