2014-06-27 57 views
0

說我有一個相當深的對象圖,作爲一個簡單的例子,像這樣對象圖或單個屬性作爲方法參數嗎?

class Car { 
    Engine Engine { get; set; } 
    Dashboard Dashboard { get; set; } 
    IEnumerable<Wheel> Wheels { get; set; } 
} 

class Engine { 
    Pump FuelPump { get; set; } 
    Motor StarterMotor { get; set; } 
} 

而對於例如着想,而不是有一個start()方法車,我想有一個CarStarter負責這樣做。想象一下,Car可以是一個大的,深度嵌套的對象圖,CarStarter只需要訪問幾個屬性,其中一些屬性深度較深。我應該將Car對象傳遞給CarStarter,還是隻傳遞重要的屬性?那麼在我的簡單例子中哪些重載?

class CarStarter { 
    void Start(Car car) { 
     car.Dashboard.Lights.SwitchOn(); 
     car.Engine.FuelPump.Run(); 
     car.Engine.StarterMotor.Start(); 
    } 

    void Start(Dashboard dashboard, Pump fuelPump, Motor starterMotor) { 
     dashboard.Lights.SwitchOn(); 
     fuelPump.Run(); 
     starterMotor.Start(); 
    } 
} 

前者感覺錯了,因爲它需要CarStarter到有關於汽車類及其屬性的整個嵌套結構的結構深入的瞭解。當在單元測試中傳遞給CarStarter時,Car對象的哪些屬性需要填充也是稍微不透明的。

後者對我來說似乎是更好的選擇,但有可能導致參數過多。

回答

0

關鍵短語我缺的是Law of Demeter。我很確定這個問題屬於代碼異味的一般主體,但確切的「規則」被違反似乎是得墨忒耳定律或最低知識原則。

0

我們可以創建一個參數對象爲這裏詳述:http://sourcemaking.com/refactoring/introduce-parameter-object

+0

感謝您的建議。這是一個有趣的看待它的方式。我幾乎來自相反的方向 - 在這種情況下,參數列表不會太長;太短了。我們正在傳遞一個可以訪問所有其他對象的對象,但是這依賴於每種使用此方法的方法都深入瞭解此「參數對象」的結構。 – Darran

相關問題