比方说,我有一个对象Car,并且它有不同的方法集合?也许变得像Blob一样? (如在反模式中,“blob”)这些方法运行在足够明确的集合中,并且在功能上并不真正交叉。新方法去哪里?
Car
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
现在让我们假设我想添加“越野驾驶”为我的车对象可以支持的案例之一。如果我向Car对象添加方法,是不是让它更像blob?
Car (augmented)
# methods related to suburban driving
->foo1
->foo2
# methods related city driving
->bar3
->bar4
# methods related off road driving
->blah5
->blah6
我应该:
答:子类汽车。我可以做一个OffRoadCar扩展Car对象。但是如果Car和OffRoadCar共享相同的数据/状态,并且只有方法不同,该怎么办? OffRoadCar只是比汽车更具体的“行为”,但没有更具体的描述,也没有独特的领域。因此实例化OffRoadCar是毫无意义的。
OffRoadCar extends Car
# methods related off road driving
->blah5
->blah6
B:汽车消费用静态方法。喜欢OffRoadAdventure->出发(汽车)。因此,OffRoadAdventure类需要一个Car对象,并且有它的方式。
在C#中这将被称为扩展方法。
我想换一种方式是Blob反模式的解决方案是什么?它是继承吗?它是扩展方法吗?
另外,我想孤立这些方法的另一个原因是如果它们的实现会产生一些成本,比如包含其他类/包?我不希望核心课程的用户经常为他们永远不会使用的东西付费。我认为,为少数人制定明确的成本是值得大多数人节省的。它使依赖图更加精确(而不是像blob一样)。
PS - 实现语言是Perl。
车必须是班吗? Car可以成为ICar(接口)吗?我会建议一个继承的组合路线。 – OnResolve 2012-02-14 22:28:09
汽车已经是一个真正使用的类。 (它实际上是一个ORM神器) – 2012-02-14 22:30:14