现状..
我有一个Car
接口(interface):
interface Car {
void startWith(Key key);
void switchGearTo(GearMode mode);
//..
static Car newCar() { // factory
return new CarImpl();
}
}
(工厂存在于单独的类中,嵌套以缩短此示例)
该接口(interface)有一个实现:
class CarImpl implements Car {
private Ignition ignition;
private GearShift gearShift;
public void startWith(Key key) {
// use ignition
}
public void switchGearTo(GearMode mode) {
// use gear shift
}
}
此时,Car
已经足以满足应用程序的需求,因此这种结构很好。它是基于 YAGNI 原则创建的,因为不需要进一步的抽象并且满足了我们的要求。
问题..
应用程序的要求已发生变化,Car
不再足够具体。我们需要不同类型的汽车,例如SportsCar;需要另一个抽象级别。
问题是,Car
已经有一个直接的实现,而它现在应该只是一个没有实现的抽象级别。
我无法删除静态工厂,否则会破坏代码。但开发人员应该不再能够创建 Car
实例,因为它不再足以满足我的应用程序的需求。
我尝试的解决方案..
解决此类问题的唯一方法似乎是进行重大重新部署。应用程序的理念已经改变,这意味着需要“重新开始”,并且没有其他方法可以解决这个问题。 (我真的希望情况并非如此)
我可以指定一辆默认汽车,但我仍然需要为默认汽车创建一个新的(描述性)方法,从而导致同一类中的 2 个方法执行完全相同的操作(无需更改即可伸缩)。这会增加困惑和可能的困惑,这对扩展没有帮助。
我的问题..
这个问题是否可以在不进行重大重新部署的情况下得到解决?如果没有,如何构建代码来避免这一问题?是否可以在仍然遵守 YAGNI 的情况下考虑此类要求的变化?
最佳答案
如果类型实现不再有效,通常建议重新开始,有时这是唯一的解决方案。如果定义了接口(interface),您就不能仅仅阻止其他类实现它。
尽管您的问题,正如我所了解到的,更改界面层次结构可以解决它。由于接口(interface) Car
现在更加抽象,因此创建扩展接口(interface) Car
的抽象接口(interface)(接口(interface) SportsCar
等)。此外,您还可以使用 CarImpl 类
来实现抽象程度较低的接口(interface)。
最后,只要定义了 Car
接口(interface),您就无法阻止其他开发人员实例化 Car
。
关于java - 当类型的实现不再有效时该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060812/