没有合适的资源?快使用搜索试试~ 我知道了~
首页软件设计模式与重构大作业-心算大师游戏
资源详情
资源评论
资源推荐
软件设计模式与重构大作业
心算大师游戏重构与设计报告
一、 系统简介(2 分)
心算大师游戏心算大师是在 Windows 平台使用 JAVA 语言开发可以部署到任
何支持 Java 虚拟机电脑的一款集数学练习、拓展和趣味游戏为一体,锻炼数学
计算能力的小游戏,它能帮助我们每天训练锻炼大脑,提高解决问题的能力。
该游戏由“+、-、*”组成的计算表达式和答案选项组件,用户通过点击选项组件
选择正确答案,系统判断对错,进行闯关挑战。游戏不仅设计正误判断,还设
计了生命和时间限制;设计了简单、中等、困难三种难度,每种难度的题目类
型不一样;此外,还提供了积分计算,游戏进度控制,成绩排名管理和游戏关
卡管理等功能,游戏主要界面如下图所示。
当人们熟练掌握“+、-、*”计算后,可能需要加入新的运算符(“ /、 、
2
”)进一步提升数学计算能力;随着加入新的运算符问题难度也会相应增加
(比如炼狱模式),游戏的等级也会改变;这些改变都需要修改原来的代码,
而且因为问题和答案存储都是 int 类型数据,在加入“/”后可能会存在不能整除
的情况,影响最终计算结果。
二、现有系统代码结构与主要问题分析(10 分)
(1)主要分析待分析重构模块或系统主要静态代码结构、代码工作流程(利用
UML 顺序图表达)(---5 分)
1)主要静态代码结构
实体类(pojo):User、Rank、Ques"on、Game
界面类(UI): MainUI、GameUI、StartsUI、Ques"onsUI、RanksUI
工具类(u"l): Data、DataOperate、FileU"l
2)代码工作流程
① 开始游戏流程
② 查看得分排名
③ 查看历史关卡
(2)根据自身对面向对象方法与系统设计的理解,参照《重构-改善既有代码
的设计》书中关于不良设计(违反 SOLID ) 、不 良代 码( 代码 坏味 道 bad
smells)的判别标准,分点讨论现有代码中的问题(---5 分)。
对照不良设计(违反 SOLID)的判别标准,该程序代码主要有以下问题:
1)违反单一职责原则:GameUI 类将用户界面和业务逻辑混在一起,二者
中有一个改变就要修改 GameUI 类,不满足一个类仅有一个引起它变化的原因,
即不满足单一职责原则。
2)违反迪米特法则:GameUI 和 Question 类不必彼此直接通信,GameUI 与
Game 类是直接通讯,Game 类与 Question 类直接通讯,而 GameUI 和 Question
类相互通讯,不满足最少知道原则。
3)违反开放封闭原则:当游戏需要新增不同难度和模式时,需要修改
Game 的源码,不满足对扩展开放对更改关闭,即不满足开闭原则。
对照不良代码(代码坏味道 bad smells)的判别标准,该程序代码主要有以
下问题:
1)重复的代码(Duplicated Code):在 GameUI 类中的 count 函数里不同选项
框的监听事件代码大量重复。
2)过长的函数(Long Method):在 GameUI 类中的 count 函数包含大量重复
的代码且函数行数超过 80 行;在 Question 类中的 result 函数长度超过 80 行,且
有很多注释。
3)过大类(Large Class):在 GameUI 类中做了太多事情(创建试题、判断
结果等),其内出现了太多实例变量,而且用户界面与处理业务逻辑的代码混
在一起。
4)过 长 参 数 列 (Long Parameter List) : 在 DataOperate 类 中 的
addQuestion、addGame 等函数,都有大量的参数,当这些参数发送改变,那么
函数也需要相应改变。
5)依恋情结(Feature Envy):Game 类中 create 函数为了创建问题,从另一
个对象 Question 类那儿调用几乎半打的取值和赋值函数,过分依赖 Question 类,
却没有依赖所在的 Game 类。
6)Switch 语句(Swtich Statements):Game 类中 create 函数在创建问题时存
在 Switch 语句,switch 语句的问题在于重复,要为它添加一个新的子句,必须
找到所有 switch 语句并修改它们。
7)lazy class(冗赘类):Data 类只有两个属性 life 和 time,且没有取值方法,
此类也只在 GameUI 中使用一次,这个类需要理解和维护,但是所得不值其身
价。
8)多次 实 例化 资 源 对象 : DataOperate 类作 为数据 操作的 工 具类 , 在
GameUI 、 RankUI 和 QuestionUI 被 多 次 实 例 化 , 而 一 个 程 序 仅 需 要 一 个
DataOperate 实例对象即可,多次创建会增大系统开销,同时导致数据不同步。
三、解决方案与代码重构(10 分)
(1)针对第二节分析出的现有代码问题,依据代码重构的原则与技巧,逐一针
对性给出重构(解决)方案(重构思路、采用方法与技巧、使用设计模式原因
与作用)(--6 分)
1)针对重复的代码(Duplicated Code)处理
重构思路:提取函数,再在提取的地方调用被提炼出的那一段代码
采用方法与技巧:使用 Extract Method(提炼函数)在 GameUI 类中的 count 函
数里提取出 countItem()函数,countItem()函数来响应每个按钮的点击事件,再
在 count 里调用 countItem 函数。
首先,找出函数内的局部变量和参数;UAS:未被修改,其他被修改的都是
全局变量。任何不会被修改的变量可以被当成参数传入新的函数。被修改的变
量全是全局变量,则无需返回值。因此,将 UAS 作为函数参数,函数无返回值。
然 后 , 重 命 名 变 量 , 考 虑 到 UAS 没 有 实 际 意 义 , 将 UAS 重 命 名 为
userAnswer,类型为 Integer。最后在 count 类中的每个按钮的点击事件调用
countItem()函数。
重构前类图 重构后类图
2)针对过长的函数(Long Method)处理
重构思路:提取函数,再在提取的地方调用被提炼出的那一段代码
采用方法与技巧:使用 Extract Method(提炼函数)结合注释将 Question 类中
的 result()提取出 isNumber()函数用于判断是否为数字,oprationorder()函数用于
计算操作符顺序,mathcount()函数用于计算表达式的值,再在 result()里调用提
取出的三个函数。
判断是否为数字中 str1[i]的值没有改变,而 isnum 的值发生了改变,可以将
str1[i]作为 isNumber()函数的参数,isnum 作为函数的返回值;考虑到 str1[i]没有
实际意义,将 str1[i]重命名为 numstr,类型为 String。
计算操作符顺序这部分代码主要逻辑判断,可以抽取为一个返回值为
boolean 的函数;在判断语 句中 md1 和 md2 是作为参数传递的,在抽取 的
oprationorder()函数也是作为输入参数。
用于计算表达式的值部分在代码中多处重复,考虑抽取出 mathcount()函数,
且 nextNum、lastNum、md3 的值没有改变,没有改变的值作为参数;result 的
值改变了,将其作为返回值。考虑到 nextNum、lastNum、md3 没有实际意义,
将其分别重命名为 num1、num2,类型为 Integer, popmd,类型为 Character。
剩余23页未读,继续阅读
oceanao
- 粉丝: 26
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0