中南软件配置管理实验二.docx
- 文档编号:8966763
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:31
- 大小:41.05KB
中南软件配置管理实验二.docx
《中南软件配置管理实验二.docx》由会员分享,可在线阅读,更多相关《中南软件配置管理实验二.docx(31页珍藏版)》请在冰点文库上搜索。
《软件配置管理》实验报告
项目名称代码味道及重构试验专业班级 学号 姓名
实验成绩:
批阅教师:
2016年 04月 20日
7
实验二 代码味道及重构实验
实验学时:
4
每组人数:
1
实验类型:
2
(1:
基础性
2:
综合性
3:
设计性
4:
研究性)
实验要求:
1
(1:
必修
2:
选修
3:
其它)
实验类别:
3
(1:
基础
2:
专业基础
3:
专业
4:
其它)
一、实验目的
1.熟悉常见代码味道的涵义和特征;
2.熟悉常用的代码重构手段;
3.学会使用常用重构手段对常见代码味道进行重构;
4.学会使用常用设计模式来对代码进行重构;
5.掌握一种代码味道识别工具(CSDT);
6.熟悉Eclipse重构菜单;
7.学会使用EclipseAST来解析Java源代码;
8.设计并实现一种代码味道的自动识别方法;
9*.设计并实现一种代码味道的自动重构方法。
二、实验内容
1.根据常见代码味道的特点,选取合适的重构手段对它们进行重构,填写相应的表格;
2.选取三种设计模式,分析这些设计模式可以消除的代码味道以及在重构到设计模式的过程中所使用的重构手段,填写相应的表格;
3.掌握一款代码味道识别工具,并使用该工具对至少一个实验项目进行代码味道识别,寻找存在代码味道的类和代码片段;【参考资料:
七款代码味道识别工具
4.学习使用Eclipse重构(Refactor)菜单,从实验项目中选取合适的代码进行重构操作;
5.自学EclipseAST,包括获取、访问、创建和修改AST等操作,使用EclipseAST
设计并实现一个类信息统计小程序;
【EclipseAST学习资料:
】
6.选取一种代码味道,设计并实现相应的代码味道识别方法,选取至少一个实验项目进行测试;
7*(选做).结合EclipseAST,选取一种代码味道,设计并实现一种代码味道的自动
重构方法,至少提供两个重构测试用例,并对重构前后的代码进行分析。
补充:
实验素材及相关资料
(1)EclipseAST所需jar包下载地址:
(2)ASTView下载地址:
(3)5个实验项目下载地址:
(4)10个补充实验项目下载地址:
三、实验要求
1.针对常见的代码味道,选择合适的重构手段,填写相应的表格,要求表格需填写完整;
2.选取三种常用的设计模式,分析这些设计模式可以消除的代码味道以及在重构到设计模式的过程中所使用的重构手段,填写相应的表格,要求表格需填写完整;
3.选取一款代码味道识别工具,记录对实验项目的代码味道识别结果,包括识别到的类名和代码片段;
4.使用Eclipse重构(Refactor)菜单对实验项目中的代码进行重构(自行选取合适的代码),要求提供重构前后的代码【至少需使用10种重构手段】;
5.学习EclipseAST,要求通过EclipseAST设计一个类信息统计小程序,可以统计一个类中方法的个数、属性的个数、源代码行数、代码行最多的方法名以及代码行数、参数个数最多的方法名及其参数的个数等信息;
6.针对一种代码味道,设计并实现相应的识别方法,要求对方法原理进行说明,需提供文字介绍(可包含流程图)、核心代码以及相应的测试结果和分析;
7*(选做).针对一种代码味道,设计并实现相应的重构方法,要求对重构流程进行说明,需提供文字介绍(可包含流程图)、核心代码以及相应的测试结果和分析。
四、实验步骤
1.填写代码味道和重构手段表格;
2.填写设计模式、代码味道和重构手段表格;
3.选取一种代码味道识别工具,对常见代码味道进行识别,记录识别结果;
4.学习使用EclipseRefactor菜单,熟悉至少10种常用的重构操作;
5.学习EclipseAST,使用AST设计并实现一个类信息统计小程序;
6.设计并实现一种代码味道识别方法,对已有项目进行测试,记录与分析实验结果;
7*(选做).设计并实现一种代码味道重构方法,对测试用例进行实验,记录与分析实验结果。
五、实验结果
1.针对22种常见的代码味道,选择合适的重构手段,填写如下表格:
代码味道名称
常用重构手段
过长方法(LongMethod)
抽取函数(ExtractMethod)以查询取代临时变量(ReplaceTempWithQuery)引入参数对象(IntroduceParameterObject)保持对象完整(PreserveWholeObject)以函数对象取代函数(ReplaceMethodwithMethodObject)分解条件表达式(Decompose
Conditional)
过大类(LargeClass)
提炼类(ExtractClass)提炼子类(ExtractSubclass)提炼接口(Extract
Interface)复制“被监视数据”(DuplicateObservedData)
过长参数列(Long
以函数取代参数(ReplaceParameterwithMethod)引入参数对
ParameterList)
象
(IntroduceParameterObject)保持对象完整(PreserveWholeObject)
过多的注释(Comments)
提炼函数(ExtractMethod)函数改名(RenameMethod)引入
断言(IntroduceAssertion)
夸夸其谈的未来性
(SpeculativeGenerality)
折叠继承体系(CollapseHierarchy)将类内联化(InlineClass)
移除参数(RemoveParameter)函数改名(RenameMethod)内联函数(InlineMethod)移除函数(RemoveMethod)
重复代码(Duplicated
Code)
提炼函数(ExtractMethod)函数上移(PullUpMethod)塑造
模板函数(FormTemplateMethod)提炼类(ExtractClass)
异曲同工的类(AlternativeClasseswithDifferent
Interfaces)
函数改名(RenameMethod)搬移函数(MoveMethod)提炼超类(ExtractSuperclass)
Switch惊悚现身(SwitchStatement)
提炼函数(ExtractMethod)、搬移函数(MoveMethod)、以多态取代条件表达式(ReplaceConditionalwithPolymorphism)、以子类取代类型码(ReplaceTypeCodewithSubclass)、以
State/Strategy取代类型码(ReplaceTypeCodewithState/Strategy)以明确函数取代参数(ReplaceParameterwith
ExplicitMethods)引入Null对象(IntroduceNullObject)
基本类型偏执(PrimitiveObsession)
以对象取代数据值(ReplaceDataValuewithObject)以类取代类型码(ReplaceTypeCodewithClass)以子类取代类型码(ReplaceTypeCodewithSubclass)、以State/Strategy取代类型码
(ReplaceTypeCodewithState/Strategy)提炼函数(Extract
Class)引入参数对象(IntroduceParameterObject)以对象取代数组(ReplaceArraywithObject)
纯稚的数据类(DataClass)
封装字段(Encapsulate Field)封装集合(EncapsulateCollection)移除设值函数(RemoveSettingMethod)搬移函数
(MoveMethod)
提炼函数(ExtractMethod)隐藏函数(HideMethod)
数据泥团(DataClumps)
提炼类(Extract Class)引入参数对象(Introduce Parameter
Object)、保持对象完整(PreserveWholeObject)
令人迷惑的暂时字段
(TemporaryField)
提炼类(ExtractClass)引入Null对象(IntroduceNullObject)
被拒绝的遗赠(RefusedBequest)
提炼子类(ExtractSubclass)、函数下移(PushDownMethod)、字段下移(Push Down Field)以委托取代继承(Replace
InheritancewithDelegation)
狎昵关系(InappropriateIntimacy)
搬移函数(MoveMethod)、搬移字段(MoveField)、将双向关联改为单向关联(ChangeBidirectionalAssociationtoUnidirectional)提炼类(Extract Class)、隐藏“委托关系”
(HideDelegate)以委托取代继承(ReplaceInheritancewith
Delegation)
冗赘类(LazyClass)
将类内联化(InlineClass)折叠继承体系(CollapseHierarchy)
依恋情结(FeatureEnvy)
搬移函数(MoveMethod)、搬移字段(MoveField)提炼函数
(ExtractMethod)、搬移函数(MoveMethod)
判断哪个类拥有最多被此函数使用的数据,然后就把这个函数
和那些数据放在一起
过度耦合的消息链
(MessageChains)
隐藏“委托关系”(HideDelegate)
中间人(MiddleMan)
移除中间人(RemoveMiddleMan)内联函数(InlineMethod)
以继承取代委托(ReplaceDelegationwithInheritance)
发散式变化(Divergent
Change)
提炼类(ExtractClass)
霰弹式修改(Shotgun
Surgery)
搬移函数(MoveMethod)、搬移字段(MoveField)将类内联
化(InlineClass)
平行继承体系(ParallelInheritanceHierarchies)不完美的库类(Incomplete
LibraryClass)
搬移函数(MoveMethod)、搬移字段(MoveField)引入外加函数(IntroduceForeignMethod)引入本地扩展(IntroduceLocalExtension)
2.选取三种常用的设计模式,分析这些设计模式可以消除的代码味道以及在重构到设计模式的过程中所使用的重构手段,填写如下表格:
设计模式
可消除代码味道
重构手段
模板方法模式
重复代码……
抽取函数(ExtractMethod)……
桥接模式
发散式变化
提炼类(ExtractClass)
策略模式
Switch惊悚现身
提炼函数(ExtractMethod)、搬移函数(MoveMethod)、以多态取代条件表达式(ReplaceConditionalwith
Polymorphism)、以子类取代类型码
(ReplaceTypeCodewithSubclass)、以State/Strategy取代类型码(ReplaceTypeCodewithState/Strategy)以明确函数取代参数(ReplaceParameterwithExplicit Methods)引入Null对象
(IntroduceNullObject)
3.选取一款代码味道识别工具和实验项目进行代码味道识别实验,记录如下信息:
(1)代码味道检测工具名称:
checkStyle
(2)实验项目名称【至少1个】:
代码味道名称
代码味道数量
代码味道实例【类名或者代码片段,如果存在该代
码味道的话至少需提供1个实例】
过长参数列表
10
[java.awt.Graphics]publicBooleandrawImage(Imageimage,intx1Dest,inty1Dest,intx2Dest,inty2Dest,intx1Source,inty1Source,intx2Source,inty2Source,Colorcolor,ImageObserverobs)
……
过大类
5
javax.swing.JTable
……
(3)实验结果:
过多的注释
3
//启动聊天页面信息刷新线程
Threadthread=new
Thread(this);
thread.start();
//Iconlog=newImageIcon("images\\chat.jpg");
//lblBack=newJLabel(log);
//lblBack.setBounds(1,1,
600,420);
//pnlChat.add(lblBack);
/*scrnsize=
toolkit.getScreenSize();
frmChat.setLocation(scrnsize.width
/2-frmChat.getWidth()/2,
scrnsize.height/2-frmChat.getHeight()/2);
*/Imageimg=
toolkit.getImage("appico.jpg");
frmChat.setIconImage(img);
重构名称
重构之前代码
重构之后代码
Rename
import
java.util.Scanner;
publicclass
shuzifanzhuan{
publicstaticvoid
main(String[]args){
Scannerinput
=new
Scanner(System.in);
inta=input.nextInt();
intb=
input.nextInt();
import
java.util.Scanner;
publicclass
digitalFlip{
publicstaticvoid
main(String[]args){
Scannerinput
=new
Scanner(System.in);
inta=input.nextInt();
intb=
input.nextInt();
4.使用EclipseRefactor菜单,掌握一些常用的重构操作,并在实验项目中选取合适的代码实施重构,填写如下表格:
intresultA=0;intresultB=0;while(a>10){
resultA=resultA*10+a%10;
a=a/10;
}
resultA=resultA*10+a%10;
while(b>10){resultB=
resultB*10+b%10;
b=b/10;
}
resultB=resultB*10+b%10;
System.out.println(resultA+resultB);
}
}
intresultA=0;intresultB=0;while(a>10){
resultA=resultA*10+a%10;
a=a/10;
}
resultA=resultA*10+a%10;
while(b>10){resultB=
resultB*10+b%10;
b=b/10;
}
resultB=resultB*10+b%10;
System.out.println(resultA+resultB);
}
}
Move
packagemovingfeature.movemethod;
/**
*
*@authorlenovo
*movefield:
*1.forfield
_interestRate,[EncapsulateField]
*2.copy"privatedouble
_interestRate;"and"get/set
_interestRate"intoclassAccountType
*3.rewriteget/set
packagemovingfeature.movemethod;
/**
*
*@authorlenovo
*movefield:
*1.forfield
_interestRate,[EncapsulateField]
*2.copy"privatedouble
_interestRate;"and"get/set
_interestRate"intoclassAccountType
*3.rewriteget/set
_interestRatetodelegatetoclassAccountType
*4.forget/set
_interestRate,[Inline]
*5.removefield
_interestRate
*
*movemethod:
*1.formethodinterestForAmount_days(),[Movemethod]
*2.formethodoverdraftCharge(),forfield
_daysOverdrawn,[ExtractlocalVariable]
*3.forfield
_daysOverdrawninmethodoverdraftCharge(),[IntroduceParameters]
*4.delete"finalintdaysOverdrawn=daysOverdrawn;"then[Movemethod]
*/
publicclassAccount
{
double
overdraftCharge(){
if
(_type.isPremium()){
double
result=10;
if
(_daysOverdrawn>7)
result
+=(_daysOverdrawn-7)*0.85;
return
_interestRatetodelegatetoclassAccountType
*4.forget/set
_interestRate,[Inline]
*5.removefield
_interestRate
*
*movemethod:
*1.formethodinterestForAmount_days(),[Movemethod]
*2.formethodoverdraftCharge(),forfield
_daysOverdrawn,[ExtractlocalVariable]
*3.forfield
_daysOverdrawninmethodoverdraftCharge(),[IntroduceParameters]
*4.delete"finalintdaysOverdrawn=daysOverdrawn;"then[Movemethod]
*/
publicclassAccount
{
double
bankCharge(){
doubleresult
=4.5;
if
(_daysOverdrawn>0)
result+=
_type.overdraftCharge(_daysOverdrawn);
returnresult;
}
15
result;
}else
return
_daysOverdrawn*1.75;
}
double
bankCharge(){
doubleresult
=4.5;
if
(_daysOverdrawn>0)
result+=overdraftCharge();
returnresult;
}
doubleinterestForAmount_days(doubleamount,intdays){
return
_interestRate*amount*days/365;
}
privatedouble
_interestRate;
private
AccountType_type;
privateint
_daysOverdrawn;
}
classAccountType{
publicboolean
isPremium(){
returnfalse;
}
}
private
AccountType_type;
privateint
_daysOverdrawn;
}
packagemovingfeature.movemethod;
classAccount
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 软件 配置管理 实验