您所在的位置: 首页>>开发>>JAVA>>

Java敏捷开发技巧之消除代码异味(5)

http://developer.51cto.com  2007-12-28 10:30  yongbing  赛迪网  我要评论(0)
  • 摘要:本文通过简单通俗的例子,告诉我们如何判断代码的稳定性和代码中的异类,并且如何重构此类代码。
  • 标签:Java  敏捷  代码  异味

但问题是,三种子类的行为(里面的代码)都差不多一样,getPasswordMaxAgeInDays这个方法就一个数值不同(30,90或者Integer.MAX_VALUE)。canPrintReport这个方法也不同在一个数值(true或false)。这三种用户类型只需要用三个对象代替就行了,无须特别地新建三个子类了:

class UserAccount {
UserType userType;
String id; 
String name;
String password;
Date dateOfLastPasswdChange;
UserType getType() {
return userType;
}  

class UserType {
int passwordMaxAgeInDays;
boolean allowedToPrintReport;
UserType(int passwordMaxAgeInDays, boolean allowedToPrintReport) {
this.passwordMaxAgeInDays = passwordMaxAgeInDays;
this.allowedToPrintReport = allowedToPrintReport;
}  
int getPasswordMaxAgeInDays() {
return passwordMaxAgeInDays;
}  
boolean canPrintReport() {
return allowedToPrintReport;
}  
static UserType normalUserType = new UserType(90, true);
static UserType adminUserType = new UserType(30, true);
static UserType guestUserType = new UserType(Integer.MAX_VALUE, false);

class InventoryApp {
void login(UserAccount userLoggingIn, String password) {
if (userLoggingIn.checkPassword(password)) {
GregorianCalendar today = new GregorianCalendar();
GregorianCalendar expiryDate = getAccountExpiryDate(userLoggingIn);
if (today.after(expiryDate)) {
//提示用户修改密码
...
}  
}  
}  
GregorianCalendar getAccountExpiryDate(UserAccount account) {
int passwordMaxAgeInDays = getPasswordMaxAgeInDays(account);
GregorianCalendar expiryDate = new GregorianCalendar();
expiryDate.setTime(account.dateOfLastPasswdChange);
expiryDate.add(Calendar.DAY_OF_MONTH, passwordMaxAgeInDays);
return expiryDate;
}  
int getPasswordMaxAgeInDays(UserAccount account) {
return account.getType().getPasswordMaxAgeInDays();
}  
void printReport(UserAccount currentUser) {
boolean canPrint;
canPrint = currentUser.getType().canPrintReport();
if (!canPrint) {
throw new SecurityException("You have no right");
}  
//打印报表.
}  
}
 
注意到了吧!用一个对象代替类别,同样可以移除switch或者if-then-else-if。  

总结一下类别代码的移除

要移动一些类别代码和switch表达式,有两种方法: 

1、用基于同一父类的不同子类来代替不同的类别。
2、用一个类的不同对象来代替不同的类别。

当不同的类别具有比较多不同的行为时,用第一种方法。当这些类别的行为非常相似,或者只是差别在一些值上面的时候,用第二个方法。

普遍的代码异味

类别代码和switch表达式是比较普遍的代码异味。此外,还有其他的代码异味也很普遍。

下面是大概的异味列表:

◆代码重复
◆太多的注释
◆类别代码(type code)
◆switch或者一大串if-then-else-if
◆想给一个变量,方法或者类名取个好名字时,也怎么也取不好
◆用类似XXXUtil, XXXManager, XXXController 和其他的一些命名
◆在变量,方法或类名中使用这些单词“And”,“Or”等等  
◆一些实例中的变量有时有用,有时没用
◆一个方法的代码太多,或者说方法太长
◆一个类的代码太多,或者说类太长
◆一个方法有太多参数
◆两个类都引用了彼此(依赖于彼此)

【相关文章】

【责任编辑:火凤凰 TEL:(010)68476606】


共5页: 上一页 [1] [2] [3] [4] 5
【内容导航】
 第 1 页:怎么判断代码的稳定性?  第 2 页:第一种异味:代码用了类别代码
 第 3 页:将抽象类变成接口  第 4 页:另一个例子
 第 5 页:总结一下类别代码的移除
让你的代码“炫”起来——WPF开发教程
初探敏捷开发
Java实用开发全集
Java类的基础教程专题
Java发展动态专题
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有