下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:课课家教育     来源: http://www.kokojia.com点击数:718发布时间: 2016-02-03 13:52:17

标签: java编程java开发java入门

大神带你学编程,欢迎选课

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

Java开发技巧之消除代码异味(7)_java编程_java开发_课课家

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

  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 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");

  }

  //打印报表.

  }

  }

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程