在开发的第一步,我设计Car
和AI
作为一个实体。
它工作得很好(伪代码): -
for(every entity that is "racing car"){
//^ know type by using flag
// or iterate special component (e.g. "RacingCarComponent")
Entity entity=...
AI* ai=get<AI>(entity);
ai->setInformation(...)
}
for(every entity that is "bicycle"){
Entity entity=...
AI* ai=get<AI>(entity);
ai->setInformation(...) //the info is very different from "racing car"
}
后来,我想要一个新功能:switch in-out Driver(影响AI)。
我拆分实体,如下图所示:-
上面的代码将更新为:-
for(every entity that is "racing car"){
Entity entity=...
AttachAI* aiAttach=get<AttachAI>(entity); //<-- edit
aiAttach->ai->setInformation(...) //<-- edit
}
for(every entity that is "bicycle"){
Entity entity=...
AttachAI* aiAttach=get<AttachAI>(entity); //<-- edit
aiAttach->ai->setInformation(...) //<-- edit
}
问题
它在更改前后都运行良好,但很难维护。
如果版本 1 中有N
车辆类型,例如,truck, motercycle, plane, boat, rocket
我
将不得不编辑N*2
可能已经分散在很多地方的行.cpp
。
主要问题:如果我忘记重构任何代码,它仍然可以正常编译。
问题只会出现在运行时。
在现实生活中,每当新设计希望将实体划分为许多更简单的实体时,我都会遇到这样的问题。
重构总是只是添加另一个间接。
问题
假设在version1中,我不希望我想要切换进/出驱动程序。
有没有可能防止这个问题?如何?