重构读书笔记-10_9-Introduce_Parameter_

2019-07-23  本文已影响0人  MR_Model

重构第十章

9.Introduce Parameter Object(引入参数对象)

某些参数总是很自然地同时出现,以一个对象取代这些参数。

Example:

class Entry...
    Entry(double value, Date charegeDate) {
        _value = value;
        _chargeDate = chargeDate;
    }
    Date getDate() {
        return _chargeDate;
    }
    double getValue() {
        return _value;
    }
    private double _value;
    private Date _chargeDate;

class Account...
    double getFlowBetween(Date start, Date end) {
        double result = 0;
        Enumeration e = _entries.elements();
        while(e.hasMoreElements()) {
            Entry each = (Entry) e.nextElement();
            if(each.getDate().equals(start) || each.getDate().equals(end) || (each.getDate().after(start) && (each.getDate().before(end))){
                result += each.getValue();
            }
        }
        return result;
    }
    private Vector _entries = new Vector();
client code...
    double flow = Account.getFlowBetween(startDate, endDate);

Analyse:
Date start和Date end以[一对值]表示[一个范围],本项重构的价值在于缩短了参数列的长度。
End:

class Account...
    double getFlowBetween(DateRange range) {
        double result =0;
        Enumeration e = _entries.elements();
        while (e.hasMoreElements()) {
            Entry each = (Entry) e.nextElement();
            if (range.includes(each.getDate())) {
                result += each.getValue();
            }
        } 
        return result;
    }
class DateRange...
    boolean includes(Date arg) {
        return (arg.equals(_start) || arg.equals(_end) || (arg.after(_start) && arg.before(_end));
    }

Conclusion:

Introduce Parameter Object(引入参数对象)使用一个对象包装所有这些数据,再以该对象取代他们,缩短了参数列的长度,可以是代码更具一致性,降低了代码的理解难度和修改难度。
同时使用了这项重构手法之后,更加容易发现一些[可被移到新建class]的行为,可以减少很多重复代码。

注意

重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
上一篇下一篇

猜你喜欢

热点阅读