版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Q:面对对象和面向过程的优缺点,结合实例进行阐述A:一、个人理解,面向对象相对于面向过程较显著的优势莫过于可扩展性、可维护性。众所周知在软件开发过程中,开发人员与客户需要不断的沟通,而客户的需求也往往在不断的变化,软件的功能也不是一成不变的。如果采用面向过程的方法来进行软件开发,当用户需求发生变化时,比如要求修改现有软件功能的实现方式或者要求追加新的功能时,就需要自顶向下地修改模块的结构,有时候甚至整个软件系统的设计被完全推翻。相比之下,面向对象所提供的可扩展性保证了当软件必须增加新的功能时,能够在现有系统结构的基础上,方便的创建新的子系统,而不需要改变软件系统现有的结构,也不会影响已经存在的子系统。可维护性则保证了当用户需求发生变化时,只需要修改局部的子系统的少量程序代码,而不会牵一发动全身。举一个例子,暴雪公司开发的魔兽争霸游戏,这个游戏里面有很多人物角色,例如我们要编程实现美杜莎这个角色的技能攻击动作。C++要编程实现美杜莎这个角色的技能攻击动作。C++,VisualC++6.0环境下调试。#include<iostream>usingnamespacestd;#defineSPLIT_SHOT1#defineMYSTIC_SNAKE2#defineMANA_SHIELD3voiduseSplitShot(){cout<<"SplitShot"<<endl;}voiduseMysticSnake(){cout<<"MysticSnake"<<endl;}voiduseManaShield(){cout<<"ManaShield"<<endl;}voiduseSkill(){intskill;cin>>skill;switch(skill){caseSPLIT_SHOT:useSplitShot();break;如果使用面向过程的方法来实现。本例使用//使用分裂箭技能//使用秘术异蛇技能//使用魔法护盾技能//使用技能//输入技能快捷键caseMYSTIC_SNAKE:useMysticSnake();break;caseMANA_SHIELD:useManaShield();break;default:cout<<"无法使用技能"<<endl;break;}}intmain(){useSkill();return0;}假如有一天玩家向暴雪反映,美杜莎这个英雄的技能太少啦,我们希望再增加一个技能。这个时候假如暴雪决定增加一个石化凝视(StoneGaze)技能,那么需要进行以下三步:在整个系统范围内,增加一个常量:#defineSTONE_GAZE4在整个系统范围内增加一个新的石化凝视技能模块:voiduseStoneGaze() //使用石化凝视技能{cout<<"StoneGaze"<<endl;}在使用技能模块useSkill()内增加以下逻辑:caseSTONE_GAZE:useStoneGaze();break;由此可见,面向过程的开发方法制约了软件的可维护和可扩展性,模块之间的松耦合性不高,修改或增加一个模块会影响到其他的模块。如果采用面向对象的方式,则该功能可以这样实现。本例使用Java,MyEclipse环境下调试。Skill.javapublicinterfaceSkill //技能接口{voiduseSkill(); //使用技能}SplitShot.javapublicclassSplitShotimplementsSkill //分裂箭技能类{publicvoiduseSkill(){
System.out.println("SplitShot");}}MysticSnake.javapublicclassMysticSnakeimplementsSkill{publicvoiduseSkill(){System.out.println("SplitShot");}}MysticSnake.javapublicclassMysticSnakeimplementsSkill{publicvoiduseSkill(){System.out.println("MysticSnake")}}ManaShield.javapublicclassManaShieldimplementsSkill{publicvoiduseSkill(){System.out.println("ManaShield");}}//使用分裂箭技能//秘术异蛇技能类//使用秘术异蛇技能//魔法护盾技能类//使用魔法护盾技能SkillFactory.javaimportjava.util.HashMap;importjava.util.Map;publicclassSkillFactory{//技能工厂类publicstaticfinalintpublicstaticfinalintpublicstaticfinalintSPLIT_SHOTMYSTIC_SNAKEMANA_SHIELD1;2;3;privatestaticMap<Integer,String>skills=newHashMap<Integer,String>();static{skills.put(newInteger(SPLIT_SHOT),"SplitShot");skills.put(newInteger(MYSTIC_SNAKE),"MysticSnake");skills.put(newInteger(MANA_SHIELD),"ManaShield");}publicstaticSkillgetSkill(intkey){try{StringclassName=skills.get(newInteger(key));
}catch(Exceptione){e.printStackTrace();returnnull;}}}Medusa.javaimportjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassMedusa //角色类——美杜莎{publicvoiduseSkill()throwsException//实现美杜莎释放技能的方法{BufferedReaderinput=newBufferedReader(newInputStreamReader(System.in));intkey=Integer.parseInt(input.readLine()); //输入技能快捷键Skillskill=SkillFactory.getSkill(key);if(skill==null){System.out.println("无法使用技能");}else{skill.useSkill();}}publicstaticvoidmain(String[]args)throwsException{newMedusa().useSkill(); //美杜莎释放技能}}假设同样的情况,暴雪公司需要给美杜莎增加一个新的技能一石化凝视(StoneGaze),那么只需要对该系统做如下修改:(1)增加一个石化凝视技能类StoneGazepublicclassStoneGazeimplementsSkill //石化凝视技能类publicvoiduseSkill()publicvoiduseSkill()}(2)在SkillFactory类中增加一个STONE_GAZE常量,并修改静态代码块。修改过的代码如下:publicstaticfinalintSPLIT_SHOT=1;publicstaticfinalintMYSTIC_SNAKE=2;publicstaticfinalintMANA_SHIELD=3;publicstaticfinalintSTONE_GAZE=4;privatestaticMap<Integer,String>skills=newHashMap<Integer,String>();static{skills.put(newInteger(SPLIT_SHOT),"SplitShot");skills.put(newInteger(MYSTIC_SNAKE),"MysticSnake");skills.put(newInteger(MANA_SHIELD),"ManaShield");skills.put(newInteger(STONE_GAZE),"StoneGaze");}由此可见,当Medusa系统增加技能时,仅仅修改了Skill子系统,对Medusa子系统并没有任何影响。此外,Skill子系统具有良好的可扩展性,当Skill子系统需要增加新的技能时,无须修改Skill子系统的系统结构,只需要创建新的技能实现类即可。上面的例子比较简单,所以面向对象的易扩展易维护的优势体现的不太明显,但是如果随着客户提出的问题域复杂度的增加,修改面向过程软件的难度会以几何倍数增长,甚至会导致整个系统不得不推翻重做。二、 除了可扩展性和可维护性外,面向对象还具有可重用性,从而可以减少软件中的重复代码,避免重复编程。三、 面向对象中提出的对象概念更贴近现实,符合自然世界的规律,程序设计本来就是对现实世界的模拟,使用面向对象就能很自然的模拟出问题域。四、 对一个团队来说,使用面向对象思想编程,可以很容易的把项目的具体工作分离,分工合作,同时开发,从而降低了开发成本,提高了开发效率。五、 在面向过程程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。这种结构很容易造成全局数据在无意中被其他函数改动,因而程序的正确性不易保证。面向对象程序设计的出发点之一就是弥补面向过程程序设计中的一些缺点:对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变,这个就是面向对象的封装性。以上是面向对象相对于面向过程的优点,但是面向对象也有不如面向过程之处。一、对同一个问题域来说,面向对象程序的执行速度不如面向过程程序。在计算机速度飞速发展的今天,你可能会说,一丁点的性能牺牲没什么大不了。是的,从面向对象的角
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务年终总结与计划(31篇)
- 电工电子技术智慧树知到课后章节答案2023年下华北科技学院
- 八年级道德与法治同步练习-2.1 网络改变世界
- 房屋买卖合同-刘靖云
- 二年级下册美术教学设计- 第7课 吊饰 人美版
- 备战2024年中考语文专题06 说明方法抢分法宝(十大类型)(原卷版)
- 小学书法活动活动总结5篇
- 干部任免职数与资格审核表
- 湖南省常德市临江中学高三物理期末试卷含解析
- 猫和教学反思与总结6篇
- 桥梁支座安装(隐蔽、检验批、安装记录等一套)
- 600MW发电机组自动装置整定计算及仿真
- 浅析生活垃圾焚烧炉焚烧生活污泥
- 土地增值税清算底稿(中税协版)
- 常用钢材牌号及化学成分表
- 贵州省新型墙体材料专项基金征收管理规定
- 颈椎间盘突出中医病历实用模板
- 仲量联行物业管理顾客服务管理手册
- 企业经营统计数据的采集及审核措施研究
- 正火温度对37Mn5钢组织和性能的影响
- 集中供热系统simulink仿真模型分析
评论
0/150
提交评论