2017-07-19 55 views
2

在我的一個類的構造函數調用看起來是這樣的:如何擺脫這個()構造函數中的長調用?

API() { 
    this(
     (new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getBt())) 
        .withF(YetAnotherClass.class).build(), 
     (new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getB()) 
        .withE(AnotherClas.get(YetAnotherClass.class).getC()) 
        .withD(AnotherClas.get(YetAnotherClass.class).getD())).build(), 
     (new Client.ClientBuilder(
        AnotherClas.get(YetAnotherClass.class).getA(), 
        AnotherClas.get(YetAnotherClass.class).getB()) 
        .withY(AnotherClas.get(YetAnotherClass.class).build() 
     ); 
    } 

在現實中,它甚至更糟,因爲我模糊的類和方法名。

我正在使用Builder模式來生成客戶端,我的第一個想法是首先生成三個客戶端,然後在構造函數調用中傳遞變量。

但是,由於這發生在構造函數中,所以對它的調用必須是第一條語句。有什麼我可以做的嗎?

+1

也許分開一個'addClient()'方法,可以多次調用它。在這種情況下3.至少'API'對象將通過它的'init'階段 – CraigR8806

+0

嗯,這是完全有道理:)謝謝! –

回答

3

唯一直接選擇我看到:創建小helper方法做部分建設,如:

private AnotherClass makeAnotherClass() { 
    return new Client.ClientBuilder(AnotherClas.get(YetAnotherClass.class).getA(), 
    AnotherClas.get(YetAnotherClass.class).getBt())) 
    .withF(YetAnotherClass.class).build()); 

如果沒有辦法讓複雜的擺脫,那麼至少將其轉換爲更容易消化的「格式」。

而上述更容易 - 因爲您減少了所需的數量。這意味着你的大腦可以更容易地創建一個「嵌入」代碼的「上下文」。這可能聽起來像是一件小事 - 但我們的大腦正在不斷地這樣做。他們試圖抽象以創造「感覺」和「分類」。因此,與一個方法中具有相同內容的情況相比,一組名爲小方法的方法更好。

,當然還有,你現在可以改變你的構造函數調用類似

this(makeAnotherClass(), makeYetAnotherClass() ... 

是的,這將創建「開銷」因爲你現在有更多的方法;並且它們可能只被調用一次。但仍然:它允許你堅持Single Layer of Abstraction的原則。遵循這個原則肯定會提高代碼的可讀性。