第六章 在对象之间搬移特性

第六章 在对象之间搬移特性

搬移函数

如果一个class有太多行为,或者一个class与另一个class有太多合作而形成高度耦合,则需要搬移函数。

class Account...
double overdraftCharge() { //译注:透支金计费,它和其他class的关系似乎比较密切。
  if (_type.isPremium()) {
    double result = 10;
    if (_daysOverdrawn > 7) result += (_daysOverdrawn - 7) * 0.85;
    return result;
  }
  else return _daysOverdrawn * 1.75;
  }
}

=>

class AccountType...
double overdraftCharge(Account account) {
  if (isPremium()) {
    double result = 10;
    if (account.getDaysOverdrawn() > 7)
      result += (account.getDaysOverdrawn() - 7) * 0.85;
    return result;
  }
  else return account.getDaysOverdrawn() * 1.75;
}

搬移值域

如果一个class的值域有另外一个class频繁的使用,则需要搬移值域。

class Account...
  private AccountType _type;
  private double _interestRate;
  double interestForAmount_days (double amount, int days) {
    return _interestRate * amount * days / 365;
  }

=>

class Account... 添加get set方法
double interestForAmountAndDays (double amount, int days) {
  return getInterestRate() * amount * days / 365;
}
private void setInterestRate (double arg) {
  _type.setInterestRate(arg);
}
private double getInterestRate () {
  return _type.getInterestRate();
}

提炼类

如果一个class做了应该由两个class做的事,则需要提炼。

Image.png

将类内联化

某个类没有做太多的事情,把这个类的所有特性搬到另一个类中。

Image.png

隐藏「委托关系」

在server端建立客户所需的所有函数,用于隐藏委托关系

Image.png

移除中间人

某个class做了过多的简单委托动作

让客户直接调用delegate

class Person...
  Department _department;
  public Person getManager() {
    return _department.getManager();
  }
class Department...
  private Person _manager;
  public Department (Person manager) {
    _manager = manager;
  }

manager = john.getManager();

=>

class Person...
public Department getDepartment() {
  return _department;
}

manager = john.getDepartment().getManager();

引入外加函数

使用的api中不存在该函数,但你无法修改源代码。

Date newStart = new Date (previousEnd.getYear(),
                      previousEnd.getMonth(), previousEnd.getDate() + 1);

=>

Date newStart = nextDay(previousEnd);
private static Date nextDay(Date arg) {
// foreign method, should be on date
  return new Date (arg.getYear(),arg.getMonth(), arg.getDate() + 1);
}

引入本地扩展

Image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值