快速业务通道

Java敏捷开发技巧之消除代码异味 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

让我们来看一下另外一个例子。在当前的系统中,有三种用户:常规用户,管理员和游客。

常规用户必须每隔90天修改一次密码(更频繁也行)。管理员必须每30天修改一次密码。游客就不需要修改了。

常规用户跟管理员可以打印报表。

先看一下当前的代码:

class UserAccount { final static int USERTYPE_NORMAL = 0; final static int USERTYPE_ADMIN = 1; final static int USERTYPE_GUEST = 2; int userType; String id; String name; String password; Date dateOfLastPasswdChange; public boolean checkPassword(String password) { ... } } 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) { switch (account.getType()) { case UserAccount.USERTYPE_NORMAL: return 90; case UserAccount.USERTYPE_ADMIN: return 30; case UserAccount.USERTYPE_GUEST: return Integer.MAX_VALUE; } } void printReport(UserAccount currentUser) { boolean canPrint; switch (currentUser.getType()) { case UserAccount.USERTYPE_NORMAL: canPrint = true; break; case UserAccount.USERTYPE_ADMIN: canPrint = true; break; case UserAccount.USERTYPE_GUEST: canPrint = false; } if (!canPrint) { throw new SecurityException("You have no right"); } //打印报表 } }

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

时间:2011-04-09

用一个对象代替一种类别(注意,之前是一个类代替一种类别)。

根据之前讲的解决方法,要去掉类别代码,我们只需要为每种类别创建一个子类,比如:

abstract class UserAccount { String id; String name; String password; Date dateOfLastPasswdChange; abstract int getPasswordMaxAgeInDays(); abstract boolean canPrintReport(); } class NormalUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return 90; } boolean canPrintReport() { return true; } } class AdminUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return 30; } boolean canPrintReport() { return true; } } class GuestUserAccount extends UserAccount { int getPasswordMaxAgeInDays() { return Integer.MAX_VALUE; } boolean canPrintReport() { return false; } }

但问题是,三种子类的行为(里面的代码)都差不多一样,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 p

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号