软件设计模式与重构大作业-心算大师游戏_第1页
软件设计模式与重构大作业-心算大师游戏_第2页
软件设计模式与重构大作业-心算大师游戏_第3页
软件设计模式与重构大作业-心算大师游戏_第4页
软件设计模式与重构大作业-心算大师游戏_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件设计模式与重构大作业

心算大师游戏重构与设计报告

一、系统简介(2分)

心算大师游戏心算大师是在Windows平台使用JAVA语言开发可以部署到任

何支持Java虚拟机电脑的一款集数学练习、拓展和趣味游戏为一体,锻炼数学

计算能力的小游戏,它能帮助我们每天训练锻炼大脑,提高解决问题的能力。该

游戏由“+、-、*”组成的计算表达式和答案选项组件,用户通过点击选项组件

选择正确答案,系统判断对错,进行闯关挑战。游戏不仅设计正误判断,还设计

了生命和时间限制;设计了简单、中等、困难三种难度,每种难度的题目类型不

一样;止匕外,还提供了积分计算,游戏进度控制,成绩排名管理和游戏关卡管理

等功能,游戏主要界面如下图所示。

.2大哂或-□xS心篁入而泊戏-□x

的单幡式含通模式困潴根式

幕明文档

1、开的或戏:点击开始余戏•可以选探不同的模式

2、浙戏排名:2?看玩乐在不同根式中的排名

3、历史关卡:变若已经携收的所有关4

曲2大*H-□X图心氏-

|的函I[I-来潮电|:aw福一I*停然球结束w戏

LEVEL0SCORE0LIFE4TI1E9TIME2

6+8+l+2+2+l=?

选择正确的答案

0200115

错误

077050043019

国心首大师/戏-□X

返回

IamIIaa]IwtI

当人们熟练掌握“+、-、*”计算后,可能需要加入新的运算符(“/、『、

2”)进一步提升数学计算能力;随着加入新的运算符问题难度也会相应增加(比

如炼狱模式),游戏的等级也会改变;这些改变都需要修改原来的代码,而且因

为问题和答案存储都是int类型数据,在加入“/”后可能会存在不能整除的情况,

影响最终计算结果。

二、现有系统代码结构与主要问题分析(10分)

(1)主要分析待分析重构模块或系统主要静态代码结构、代码工作流程(利用

UML顺序图表达)(一5分)

1)主要静态代码结构

*q:Queibon

©UI.Su«tsUl4gome:G»me

*app:Data

/StartiUlO4doptDafOp—oID:int

■initO:void<fGameUHtype:int)°typeint

■easyModdO:void*initO:booleanolevel:int

■r»omalModelO:void■endO:voidoscoreint

■hardModelflvoid■rwUrtO:»oid•lifeint

■onExitOvoid•setvalueO:*o>dotime:int

:uquestions:Que,”。,、___________________________________________

0UI.QuMtioMUI.timer©void

■stopTnnerO:void才GameOD:intql&intlevel:int.“ore:iniSfe:int.timgint.type:int)

■>table:Hable

♦(levelsiniscore:沁WM:initimes:int):boolean•gtxoreOevgl:imhM

"dop:OotaOperMe

♦SMcgQ):vp;d•count!):void・set-O:void

•QuestionUIO:void

/MainUIO♦NextquestaonO:vcid•g«t-O:int

■sUrtGameO:void•inhO:void•pautef):void•crearefq:Question):String

■loofcRanlcQ:void■onExitOvoid■showInputDialogO:void

■lookQueitionQ:void•e“yGfO:void■onExitQ:void

■onExitfl:void♦notnalGameOvoid

•d»ff;ciutG>meO:void

»IOint

0Ul&nksWoquestion:String

®As:int[]

°table:/Table

°realAS:Integer

。dop:DM*Op”at・utiLData

Qtypeint

•RaokUIO:voido取f:;m

°op:String。

。easyRankO:voidotimes:in»

Que*tion(qufrMion:Siring,Al:int.A2:int.A3:int.A4:witre«lAS:int)

♦nomatfUnkOvoid*get-O:Integer

♦difficlutfUinkO:void

•set...O:void

・。心M:void

0retulUttr:String):Integer

©ut>l.OauOp»r«t«

aQFtionLirtyMao<Mteqer.QFtioc»

ARanldkt*Mjp<lnteqer.R3"k»

0pojoJUnk

"Us心taMap<lnteqef.U»er»

oID:in«

°question:Questionoscore:int

°ranlcRink。l«vekint

ogame:Game°userid:in<

-1>

outer:Uwr°userUser

•addQuwtion(que»bonT:Suing.Al:mtA2:int,A3:int,A4:inttwlAS:int,typ«:mt):int®pojo.Usw°typeint

•otOuettionlistltyp^d:int,:li,,《Que,tion»Ranktid:irrt.us«nd:iniMO»e:intlevel:inttypeiM.uwr:U*e»)

oname:String

•addUseKname:String,score:int):int•get™。:in»

。ID:int

•*eL-(ID:inthvoid

♦stUwKbYidPd:KU:U”°score:int

•addGjme(qld:intlevelint.score:int.Sfe:int.time:int,type:in*int

•get-O:String

••ddRank(unam«:String,score:int,level:int.typsinU:iz

♦*e€..Q:void

。qetRankUWtypeid:in"lie<Rank〉

实体类(pojo):User>Rank、Question>Game

界面类(UI):MainUkGameULStartsUkQuestionsULRankslll

工具类(util):Data>DataOperate、Filelltil

2)代码工作流程

①开始游戏流程

②查看得分排名

③查看历史关卡

(2)根据自身对面向对象方法与系统设计的理解,参照《重构-改善既有代码的

设计》书中关于不良设计(违反SOLID)、不良代码(代码坏味道badsmells)

的判别标准,分点讨论现有代码中的问题(一5分)。

对照不良设计(违反SOLID)的判别标准,该程序代码主要有以下问题:

1)违反单一一职责原则:GameUI类将用户界面和业务逻辑混在一起,二者中

有一个改变就要修改GameUI类,不满足一个类仅有一个引起它变化的原因,即

不满足单一职责原则。

2)违反迪米特法则:GameUI和Question类不必彼此直接通信,GameUI与

Game类是直接通讯,Game类与Question类直接通讯,而GameUI和Question

类相互通讯,不满足最少知道原则。

3)违反开放封闭原则:当游戏需要新增不同难度和模式时,需要修改Game

的源码,不满足对扩展开放对更改关闭,即不满足开闭原则。

对照不良代码(代码坏味道badsmells)的判别标准,该程序代码主要有以

下问题:

1)重复的代码(DuplicatedCode):在GameUI类中的count函数里不同选项框

的监听事件代码大量重复。

chooseA.addActionLlstener(newActionLiatener(){

publicvoidactionPerforroed(ActionEventarg,;)(chooseB.addActionListenez(newActionListener(){

IntegerUAS■Integer.vaiueOf(choos«A.getText());publicvoidactionPexformed(ActionEventacgO){

i£(UAS.equals(GaneUI.AS))(IntegerUAS■Integer.VdlueOffchooseB.getToxt());

levela1;//7ii£(UAS.aquals(GamoUI.AS)){

scor»s♦-Gam*.9*cor»(l»vols);i'levola+-1;//ili<;»1

isRight.setText(":!.蝌");3cor*3+•Gan9.g<pt9cor9(lev»13);•

IsP.ight.setForeground(Color.GRTffN);isRight.a®tTwxt("fS");

Nextqueation();//'­'inRaghc.setForeground(Color.GRUTD;

Nextquestion();//■:

)else(

llfea—1;//':;“由MiI(

lifes--1;//Ic'Aik

if(lifea<1){//g-i

if(lifes<1)(

lifev.setText("0");lifev.setText("0");

showInputDialog();!!.showlnpucDialog();/■'.一.

>\I•1««{

IsRight.setTextisRight.setText;

isRight.setForeground(Color.RXD);isRight.setForeground(Color.RED);

NextquestionO;/N«xtquestion();>V

AoiesGroup.clearSelection();AoJe9Group.cl»arS»l«ction();

IJ

n;I);

2)过长的函数(LongMethod):在GameUI类中的count函数包含大量重复

的代码且函数行数超过80行;在Question类中的result函数长度超过80行,且

有很多注释。

3)过大类(LargeClass):在GameUI类中做了太多事情(创建试题、判断结

果等),其内出现了太多实例变量,而且用户界面与处理业务逻辑的代码混在一

起。

4)过长参数列(LongParameterList):在DataOperate类中的addQuestion、

addGame等函数,都有大量的参数,当这些参数发送改变,那么函数也需要相应

改变。

publicintaddQuestion(StringquestionT,intAlrintA2,intA3,intA4,

intrealAS,inttype){//新增题口

5)依恋情结(FeatureEnvy):Game类中create函数为了创建问题,从另一个

对象Question类那儿调用几乎半打的取值和赋值函数,过分依赖Question类,

却没有依赖所在的Game类。

publicStringcreate(Questionq)//夕]也「电

(

Stringop[]-{"+",};//匕"拂情泮

q.setQuestion("M);//———问出力;

Randomrandom-newRandom();

ints-0;

intnums-(level/5)+6;//小义达。数1:"一以认为6

if(level>20)

nums=10;//显长为10个达■数

switch(type){

case1://荷甲-模式

for(inti=0;i<nums-1;i++)(

3=random.nextInt(10);

q.question+=s+"'*+op[0]+n**;//只fj,川”.

)

break;

case2://杵《!!模式

for(inti=0;i<nums-1;i++)(

s=random.nextInt(10);

q.question+=3+w"+op[i%2]+“M;//和加,

)

6)Switch语句(SwtichStatements):Game类中create函数在创建问题时存

在Switch语句,switch语句的问题在于重复,要为它添加一个新的子句,必须

找到所有switch语句并修改它们。

switch(type){

case1:〃

for(inti-0;i<nums-1;i++){

s=random.nextInt(10);

q.question+=,+”"+op[0]+"";//只。加法

)

break;

case2://件削怏A

for(inti=0;i<nums-1;i++)(

s-random.nextInt(10);

q.question+=s+""+op[i%2]+"

I

break;

case3://阴41模式

for(inti=0;i<nums-1;i++){

3=random.nextlnt(10);

q.question+-§+""+op[i%3]+"”;〃】加减乘£,;

)

break;

default:

break;

}

7)lazyclass(冗赘类):Data类只有两个属性life和time,且没有取值方法,

此类也只在GameUI中使用一次,这个类需要理解和维护,但是所得不值其身价。

publicclassData{

publicstaticint1ifes=5;//生命挣制

publicstaticinttimes=10;//'H\ij

)

8)多次实例化资源对象:DataOperate类作为数据操作的工具类,在

GameUI、RankUI和QuestionUI被多次实例化,而一个程序仅需要一个

DataOperate实例对象即可,多次创建会增大系统开销,同时导致数据不同步。

三、解决方案与代码重构(10分)

(1)针对第二节分析出的现有代码问题,依据代码重构的原则与技巧,逐一针

对性给出重构(解决)方案(重构思路、采用方法与技巧、使用设计模式原因与

作用)(--6分)

1)针对重复的代码(DuplicatedCode)处理

重构思路:提取函数,再在提取的地方调用被提炼出的那一段代码

采用方法与技巧:使用ExtractMethod(提炼函数)在GameUI类中的count函

数里提取出countltem。函数,countltem。函数来响应每个按钮的点击事件,再在

count里调用countitem函数。

首先,找出函数内的局部变量和参数;UAS:未被修改,其他被修改的都是全

局变量。任何不会被修改的变量可以被当成参数传入新的函数。被修改的变量全

是全局变量,则无需返回值。因此,X^UAS作为函数参数,函数无返回值。然

后,重命名变量,考虑到UAS没有实际意义,将UAS重命名为userAnswer,类

型为Integero最后在count类中的每个按钮的点击事件调用countltem。函数。

GUI.GameUI0UI.GameUI

4q:QuestionAq:Question

Agame:Gamedgame:Game

Aapp:Data

Aapp:Data

Adop:DataOperate

Adop:DataOperate

Gamelll(type:int)

GameUI(type:int)

♦initO:boolean

。initQ:boolean

GendO:void

aend。:void

■restartO:void

■restart。:void

♦setvalueO:void

♦setvalueO:void

•timer。:void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论