2012-04-19 122 views
0

我構建了一個相對較大的面向對象程序。我有一個名爲AerodynamicCalculator的課程,它執行許多計算並將結果分發給系統。我主要擔心的是我的構造函數簽名越來越大,因爲我添加了mor參數。通過構造函數傳遞的對象引用

如下圖所示,我已經有9個對象引用被傳遞給這個構造函數,但是我需要另外7個對象引用。我正確地創建這個對象嗎?我的理解是,您將關聯的對象引用傳遞給構造函數,並將類的局部變量分配給對象引用。如果是這種情況,讓所有需要的對象正確初始化我的類的唯一方法是將它們傳遞給構造函數,這會導致很長的簽名。

public AreodynamicCalculator(AircraftConfiguration config, AileronOne aOne, 
     AileronTwo aTwo, ElevatorOne eOne, ElevatorTwo eTwo, Rudder r, 
     Rudder rr, RateGyros rG) { 
    // ... 
} 

對此方法的任何建議將非常有幫助,在此先感謝。

+0

將提出各種策略,並可能是您去的最佳方式;但這可能表明你的班級正試圖做太多的事情,需要分解成更小的部分。 – 2012-04-19 15:38:51

+0

這不是禁止的。這是做到這一點的一種方式。還有其他方法可以做到這一點,但最終都會歸結爲系統的特定體系結構,它會「告訴」您創建系統的最佳方式。這個問題可能會因爲範圍過寬而關閉。 – Th0rndike 2012-04-19 15:40:26

+0

該類實際上只計算5個變量,但必須將這些變量分配給7個對象。如何從計算中使用的變量中提取出我在原始文章中顯示的對象。所以類dosnt做了這麼多,但它作爲一個吸氣劑,系統計算器和計算結果分配器。 – 2012-04-19 15:44:44

回答

6

如前所述 - 這可能是您的班級做得太多的跡象,但是,這個問題有一個常用的「解決方案」。

構建器模式通常用於這種情況,但是當您有許多具有不同參數的構造函數時,構建器也非常有用,因爲它使參數的含義更清晰,特別是在使用布爾文字時。

這裏是建造者模式,這種工作方式是這樣的:

AreodynamicCalculator calc = AreodynamicCalculator.builder() 
    .config(theAircraftConfiguration) 
    .addAileron(aileronOne) 
    .addAileron(aileronTwo) 
    .addElevator(elevatorOne) 
    .addElevator(elevatorTwo) 
    .addRudder(rudderOne) 
    .addRudder(rudderTwo) 
    .build() 

內部,生成器將存儲所有這些領域,並在build()被調用時,它將調用一個(現在的私立)構造函數需要這些字段:

class AreodynamicCalculator { 
    public static class Builder { 
     AircraftConfiguration config; 
     Aileron aileronOne; 
     Aileron aileronTwo; 
     Elevator elevatorOne; 
     Elevator elevatorTwo; 
     ... 

     public Builder config(AircraftConfiguration config) { 
      this.config = config; 
      return this; 
     } 

     public Builder addAileron(Aileron aileron) { 
      if (this.aileronOne == null) { 
       this.aileronOne = aileron; 
      } else { 
       this.aileronTwo = aileron; 
      } 
      return this; 
     } 

     // adders/setters for other fields. 

     public AreodynamicCalculator build() { 
      return new AreodynamicCalculator(config, aileronOne, aileronTwo ...); 
     } 
    } 

    // this is the AircraftConfiguration constructor, it's now private because 
    // the way to create AircraftConfiguration objects is via the builder 
    // 
    private AircraftConfiguration config, AileronOne aOne, AileronTwo aTwo, ElevatorOne eOne, ElevatorTwo eTwo, Rudder r, Rudder rr, RateGyros rG) { 
     /// assign fields 
    } 
} 
+0

感謝您的幫助和努力。我很感激。是否有任何表現,但更重要的是這樣做的安全原因? – 2012-04-19 15:52:20

+0

至於性能處罰 - 呃,你需要分析應用程序。現在有兩個對象(可能大小相同)創建而不是一個(構建器對象和構建對象),並且將收集構建器實例。安全,我不確定你的意思。如果構建器沒有完全填充(調用的構造器太少),那麼它應該拋出異常(我將使用RuntimeException子類) – daveb 2012-04-19 15:56:08

0

與使用daveb響應中建議的構建器模式類似,可以使用Spring之類的依賴注入框架。

+0

DI將幫助注入不同的實現。它無助於防止傳遞給構造函數的引用太多。 – mrab 2012-04-19 15:44:36

+0

取決於您是否使用構造函數注入或方法注入(使用屬性設置器)。你可以用春天做。 – 2012-04-19 17:34:45

相關問題