新方法在哪里?

Mar*_*las 5 oop perl design-patterns anti-patterns

假设我有一个对象,Car,它有各种方法......不同?也许像Blob一样?(如反模式中的"blob")这些方法在不同的集合中运行,并且在功能上并不真正纵横交错.

Car
# methods related to suburban driving
  ->foo1
  ->foo2
# methods related city driving
  ->bar3
  ->bar4
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想添加"越野驾驶"作为我的汽车对象可以支持的案例之一.如果我向Car对象添加方法,是不是让它更像blob?

Car (augmented)
# methods related to suburban driving
  ->foo1
  ->foo2
# methods related city driving
  ->bar3
  ->bar4
# methods related off road driving
  ->blah5
  ->blah6
Run Code Online (Sandbox Code Playgroud)

我是不是该:

答:汽车的子类.我可以制作一个OffRoadCar扩展Car对象.但是如果Car和OffRoadCar共享相同的数据/状态,并且只是方法不同呢?OffRoadCar只比汽车更具体"行动",但不再具体描述,也没有独特的领域.因此实例化OffRoadCar毫无意义.

OffRoadCar extends Car
# methods related off road driving
  ->blah5
  ->blah6
Run Code Online (Sandbox Code Playgroud)

B:使用静态方法消耗汽车.喜欢OffRoadAdventure-> Embark(Car).所以OffRoadAdventure类接受一个Car对象并使用它.

在C#中,这将被称为扩展方法.

我想换另一种方式是什么是Blob反模式的解决方案?是子类吗?是扩展方法吗?

另外,我想要解决这些方法的另一个原因是,如果它们的实现会产生一些成本,比如包含其他类/包?我不希望核心类的用户经常为他们永远不会使用的东西买单.我认为让少数人明白成本对大多数人来说是值得的.它使依赖图更精确(而不是像blob一样).

PS - 实现语言是Perl.

Die*_*ego 0

我认为你走在正确的轨道上。一个优雅的解决方案是继承OffRoadCarCar 并重写其Drive()方法。这样,你就可以说:

Car myCar = new OffRoadCar();
myCar.Drive();
Run Code Online (Sandbox Code Playgroud)

这将调用子类中重写的Drive()方法,并且您最终不会在单个“blob”中得到无数的方法。该Drive()方法OffRoadCar可能如下所示:

@Override
public void Drive()
{
/* code */
}
Run Code Online (Sandbox Code Playgroud)