每一個類都應將全部能力以最小粒度提供給外部可配置,每一個業務所須要的功能是這些能力的組合

好比說,我有一個界面,查詢地理位置,是比較通用的,各個業務,場景都有可能須要用上。可是對於不一樣的場景,title的文字可能不同,有些業務但願進來後展現「選擇位置」,有些業務進來後但願能展現爲「發送位置」,還有查詢地理位置後,備選的條目數量,以及查詢地理位置的範圍都有可能根據不一樣業務而不同。java

最開始個人作法是這樣的。this

class QueryLocationPage {
    
    public static final int TYPE_FOR_LOCATION = 1;    // 爲了定位需求
    public static final int TYPE_FOR_SEND_CONV = 2;   // 爲了發送會話
    
    // 文字顯示
    private String mTitle = "選擇位置";
    
    // 查詢範圍
    private int mSearchRange = 100;
    
    // 結果最多顯示多少個
    private int mMaxResult = 30;
    
    // 初始化的時候根據業務的type進行內部行爲的配置
    private void init(int type) {
        switch (type) {
            case TYPE_FOR_LOCATION :
                mTitle = "選擇位置";
                mSearchRange = 1000;
                mMaxResult = 100;
            break;
            case TYPE_FOR_SEND_CONV :
                mTitle = "發送到會話";
                mSearchRange = 100;
                mMaxResult = 30;
            break;
        }
    }
}

上述這樣的作法其實是很差的,爲何我一個純粹的功能須要知道哪一個業務哪一個業務呢。其實應該是將這些變成配置。code

static class Param {
    public String title = "選擇位置";
    public int searchRange = 100;
    public int maxResult = 30;
    
    public Param title(String title) {
        this.title = title;
        return this;
    }
    
    public Param searchRange(int sr) {
        this.searchRange = sr;
        return this;
    }
    
    public Param maxResult(int mr) {
        this.maxResult = mr;
        return this;
    }
}

public static final Param SenceForLocation = new Param()
    .title("選擇位置")
    .searchRange(1000)
    .maxResult(100);
    
public static final Param SenceForSendConv = new Param()
    .title("發送到會話")
    .searchRange(100)
    .maxResult(30);
    
// 之後擴展的時候,只須要找一個類似的sence(實際上是一個Param),複製一份,改一改你須要的參數,就能夠了
相關文章
相關標籤/搜索