假设我有一个非常深的对象图,作为简化示例,就像这样
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对象的哪些属性,这也略微不透明。
对我来说,后者似乎是更好的选择,但却有可能导致参数过多。
答案 0 :(得分:0)
我们可以创建一个参数对象,如下所示:http://sourcemaking.com/refactoring/introduce-parameter-object
答案 1 :(得分:0)
我遗失的关键词是Law of Demeter。我很确定这个问题属于Inappropriate Intimacy代码气味的普遍赞助,但违反的确切“规则”似乎是得墨忒耳定律,或最少知识原则。