2015-10-06 65 views
0

我在Guice中有一個類在構造函數中使用依賴注入獲取〜10個參數。依賴注入與許多小類

該類有許多派生類。 所有派生類的構造函數只是將所有參數傳遞給super。

將新參數添加到基類的構造函數中需要將此參數添加到所有派生類的所有構造函數中。

class MyBaseClass { 
     @Inject 
     MyBaseClass(arg1,arg2,arg3, ..., argn) { 
      this.arg1 = arg1 
      .... 
     } 

    } 

    class MyDerivedClass1 extends MyBaseClass{ 
     @Inject 
     MyDerivedClass1(arg1,arg2,arg3, ..., argn) { 
      super(arg1,arg2,arg3, ..., argn) 
     }  
    } 

    class MyDerivedClass2 extends MyBaseClass{ 
     @Inject 
     MyDerivedClass2(arg1,arg2,arg3, ..., argn) { 
      super(arg1,arg2,arg3, ..., argn) 
     }  
    } 

一種解決方案我不得不是包裝的所有參數在一個類和注入該類基類和所有派生類。通過這種方式向該注入類添加新參數時,它將注入到所有派生類中。

喜歡的東西:

class MyBaseClassSettings { 
     @Inject 
     MyBaseClassSettings(arg1,arg2,arg3, ..., argn) { 
     this.arg1 = arg1 
     ... 
     } 
    } 

    class MyBaseClass { 
     @Inject 
     MyBaseClass(MyBaseClassSettings settings) { 
      this.settings = settings; 
     } 

    } 

    class MyDerivedClass1 extends MyBaseClass{ 
     @Inject 
     MyDerivedClass1(MyBaseClassSettings settings) { 
      super(settings) 
     }  
    } 

    class MyDerivedClass2 extends MyBaseClass{ 
     @Inject 
     MyDerivedClass2(MyBaseClassSettings settings) { 
      super(settings) 
     }  
    } 

假設ARG遊戲沒有真正的相互關係(一個是數據庫的連接,另一種是多數民衆贊成分配線程任務的幫手,另一人做的部分實際的邏輯,另一個持有該類的地理配置......(只是例子))這個解決方案是否被認爲是好的?

如果是這樣,包裝類的命名會是什麼?

+0

儘管這種方法沒問題,但您應該檢查所有參數參數是否沒有共同之處......也許您會發現,您可以從「設置」中獲取「數據庫設置」,「用戶設置」 ,...並使用多個有意義的包裝器。 –

回答

2

從實際上來說,您的解決方案是可以的。你可以用這種方式解決你的問題,這不會花你很多時間。話雖如此,如果您有時間,您應該重構代碼並將該類拆分爲多個類。

有10個依賴關係是你的班級做得很多的標誌,並被認爲是代碼味道(看看this)。你的班級似乎有太多的責任,因此違反了Single Responsibility Principle。考慮Aggregated Services可以解決您的問題。

根據您的情況,您可以選擇現在執行您的建議修補程序,稍後再進行重構。看看Technical Debt的概念。

至於班級的名字,你的建議是好的。另一個建議是MyBaseClassDependencies

0

是的,完全合理的解決方案和層次結構的常見習慣用法。

你的名字沒問題。另一種命名模式是BaseParamsBaseClassParams等。

+0

在這種情況下,訪問這些字段的方法會更好。 像這樣指定它們: this.db = params.db然後在沒有變化的情況下訪問它們 或將this.db的所有出現替換爲this.params.getDb() – user844541

+0

可能前者假設它有getters:this。 db = params.getDb()。這對你的其他代碼來說會更傳統和相似,包括子類。 – Fred