Design patterns 对象图或单个属性作为方法参数?
假设我有一个很深的对象图,作为一个简化的例子,类似这样的东西Design patterns 对象图或单个属性作为方法参数?,design-patterns,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; }
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深入了解Car类的整个嵌套结构的结构及其属性。对于在单元测试中传递给CarStarter时需要填充Car对象的哪些属性,它也有点不透明
对我来说,后者似乎是更好的选择,但有可能会有太多参数。我们可以创建一个参数对象,如下所述:我缺少的关键短语是。我很确定这一问题属于一种代码气味的普遍支持,但被违反的确切“规则”似乎是德米特法,或最少知情原则。谢谢你的建议。这是一种有趣的看待它的方式。我几乎来自相反的方向——在本例中,参数列表并不太长;太短了。我们正在传递一个已经可以访问其他所有内容的对象,但这取决于使用这种方法的每个方法都对这个“参数对象”的结构有深入的了解。
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();
}
}