对象图或单个属性作为方法参数?

时间:2014-06-27 19:15:01

标签: design-patterns

假设我有一个非常深的对象图,作为简化示例,就像这样

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; }
}

并且为了示例,我想要一个负责执行此操作的CarStarter,而不是具有Start()方法的Car。想象一下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深入了解Car类的整个嵌套结构及其属性的结构。当在单元测试中传递给CarStarter时,需要填充Car对象的哪些属性,这也略微不透明。

对我来说,后者似乎是更好的选择,但却有可能导致参数过多。

2 个答案:

答案 0 :(得分:0)

我们可以创建一个参数对象,如下所示:http://sourcemaking.com/refactoring/introduce-parameter-object

答案 1 :(得分:0)

我遗失的关键词是Law of Demeter。我很确定这个问题属于Inappropriate Intimacy代码气味的普遍赞助,但违反的确切“规则”似乎是得墨忒耳定律,或最少知识原则。