软件设计重构秘笈22式-21分解方法

本文介绍了一种软件设计重构策略——将复杂的方法分解为小而易读的方法,以提高代码可读性和维护性。通过实例展示了如何将acceptPayment方法拆分为calculateSubtotal、subtractDiscounts、addTax和subtractFromCustomerBalance等清晰功能。
摘要由CSDN通过智能技术生成

软件设计重构秘笈22式-21分解方法

概念

本文中的”分解方法”是指把我们所做的这个功能不停的分解方法,直到将一个大方法分解为名字有意义且可读性更好的若干个小方法。

意图

分解方法为了提高代码的可读性,可维护性
如下代码所示,因为现实中acceptPayment方法不会做这么多的事情。所以我们通过几次分解将 acceptPayment拆分成若干个名字有意义且可读性更好的小方法。

案例

public class CashRegister {

    public double tax = 0.06;

    public void acceptPayment(Customer customer, List<Product> products, double payment) {

        double subTotal = 0;
        if (products != null && !products.isEmpty()) {
            for (Product product:products) {
                subTotal +=product.getPrice();
                subTotal -= product.getAvailableDiscounts();
            }
        }
        double grandTotal = subTotal * tax;
        customer.deductFromAccountBalance(grandTotal);
    }



    public double getTax() {
        return tax;
    }

    public void setTax(double tax) {
        this.tax = tax;
    }
}

public class Product {

    private double price;

    private double availableDiscounts;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getAvailableDiscounts() {
        return availableDiscounts;
    }

    public void setAvailableDiscounts(double availableDiscounts) {
        this.availableDiscounts = availableDiscounts;
    }
}

public class Customer {

    public void deductFromAccountBalance(double amount) {
        // deduct from balance
    }

}

重构

重构后的代码如下,我们把acceptPayment的内部逻辑拆分成了calculateSubtotal、subtractDiscounts、addTax、subtractFromCustomerBalance四个功能明确且可读性更好的小方法。

public class CashRegister {

    public double tax = 0.06;
    List<Product> products;
    public void acceptPayment(Customer customer, double payment) {
        double subTotal = 0;
        subTotal = calculateSubtotal(subTotal);
        subTotal = subtractDiscounts(subTotal);
        double grandTotal = addTax(subTotal);
        subtractFromCustomerBalance(customer,grandTotal);
    }

    private void subtractFromCustomerBalance(Customer customer, double grandTotal)
    {
        customer.deductFromAccountBalance(grandTotal);
    }

    private double addTax(double subTotal)
    {
        return subTotal * tax;
    }

    private double subtractDiscounts(double subTotal)
    {
        if (products != null && !products.isEmpty()) {
            for (Product product:products) {
                subTotal -= product.getAvailableDiscounts();
            }
        }
        return subTotal;
    }

    private double calculateSubtotal(double subTotal)
    {
        if (products != null && !products.isEmpty()) {
            for (Product product:products) {
                subTotal +=product.getPrice();
            }
        }
        return subTotal;
    }
    
    public double getTax() {
        return tax;
    }

    public void setTax(double tax) {
        this.tax = tax;
    }
}

总结

其实这个重构和我们前面讲的“提取方法”和“提取方法对象”如出一辙,尤其是“提取方法”,所以大家只要知道用这种思想重构就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值