在开发的第一步,我将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"
}
稍后,我想要一个新的功能:切换出驱动程序(这会影响人工智能)。
如下图所示,我拆分了该实体:
上述守则将予修订如下:
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
}
问题
它在更改前后都很好,但是很难维护。
如果N
类型的车辆在version1中存在,例如truck, motercycle, plane, boat, rocket
,
我将不得不编辑N*2
行,其中可能已经分散在许多.cpp
上。
主要问题: --如果我忘记重构任何代码,它仍然会编译得很好。
问题只会在运行时出现。
在现实生活中,每当新设计希望将一个实体划分成许多更简单的实体时,我就会面临这样的问题。
重构总是只是间接地添加另一个。
问题
假设在version1中,我不希望切换/退出驱动程序。
有可能防止这个问题吗?多么?
发布于 2018-06-28 02:17:01
我可能弄错了,但似乎您可能多次遍历所有实体,检查一个条件。我对c++语法不太确定,所以请耐心听我说:
for (entities as entity) {
info = null;
//Check type to get specific info
if (type is a "racing car"){
info = "fast car";
}
elseif (type is a "bicycle") {
info = "rad spokes";
}
//If we found info, we know we had a valid type
if (info isnt null) {
aiAttach = get(entity);
aiAttach->ai->setInformation(info);
}
}
我不确定get函数是否需要针对每种类型的特定内容。在我的伪代码示例中,我假设我们只发送实体,而不是特定类型的东西。如果是这样的话,可以使用一个额外的变量。
https://stackoverflow.com/questions/51073595
复制相似问题