软件设计重构秘笈2式-01移动方法

71 阅读1分钟

软件设计重构秘笈2式-01移动方法

概念

本文所讲的移动方法就是方法放在合适的位置(通常指放在合适的类中)。

意图

移动方法是一个很简单也很常见的重构,只要是系统就会存在很多类,那么类里面包括很多方法, 如果一个方法经常被另外一个类使用(比本身的类使用还多)或者这个方法本身就不应该放在这个类里面, 那么这个适合应该考虑把它移到合适的类中。代码如下:

案例

【银行账户】

/**
 * 银行账户
 */
class BankAccount {
    private final int accountAge;

    private final int creditScore;

    public BankAccount(int accountAge, int creditScore) {
        this.accountAge = accountAge;
        this.creditScore = creditScore;
    }

    /**
     * 计算利率
     *
     * @return 利率
     */
    public double calculateInterestRate() {
        if (creditScore > 800) {
            return 0.02;
        }

        if (accountAge > 10) {
            return 0.03;
        }

        return 0.05;
    }
}

/**
 * 账户利息
 */
class AccountInterest {
    private BankAccount bankAccount;

    public AccountInterest(BankAccount bankAccount) {
        this.bankAccount = bankAccount;
    }

    /**
     * 获取利率
     *
     * @return 利率
     */
    public double interestRate() {
        return bankAccount.calculateInterestRate();
    }

    /**
     * 是否是优惠的利率
     *
     * @return true:是;false:否
     */
    public boolean introductoryRate() {
        return bankAccount.calculateInterestRate() < 0.05;
    }
}

重构

【银行账户】 移动以后大家可以看到BankAccount类的职责也单一, 同时CalculateInterestRate也放到了经常使用且适合它的类中了,所以此重构是一个比较好的重构,能让整个代码变得更加合理。

/**
 * 银行账户
 */
class BankAccount {
    private final int accountAge;

    private final int creditScore;

    public BankAccount(int accountAge, int creditScore) {
        this.accountAge = accountAge;
        this.creditScore = creditScore;
    }

    /**
     * 获取账户年数
     *
     * @return 账户年数
     */
    public int getAccountAge() {
        return accountAge;
    }

    /**
     * 获取信用分数
     *
     * @return 信用分数
     */
    public int getCreditScore() {
        return creditScore;
    }
}

/**
 * 账户利息
 */
class AccountInterest {
    private final BankAccount bankAccount;

    public AccountInterest(BankAccount bankAccount) {
        this.bankAccount = bankAccount;
    }

    /**
     * 获取利率
     *
     * @return 利率
     */
    public double interestRate() {
        return calculateInterestRate();
    }

    /**
     * 是否是优惠的利率
     *
     * @return true:是;false:否
     */
    public boolean introductoryRate() {
        return calculateInterestRate() < 0.05;
    }

    private double calculateInterestRate() {
        if (bankAccount.getCreditScore() > 800) {
            return 0.02;
        }

        if (bankAccount.getAccountAge() > 10) {
            return 0.03;
        }

        return 0.05;
    }
}