0

在开发的第一步,我设计CarAI作为一个实体。
它工作得很好(伪代码): -

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中,我不希望我想要切换进/出驱动程序。
有没有可能防止这个问题?如何?

4

1 回答 1

1

我可能弄错了,但似乎您可能多次循环遍历所有实体,检查条件。我不太确定 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 函数是否需要每种类型的特定内容。在我的伪代码示例中,我假设我们只发送实体而不是特定类型的东西。如果是这样,则可以使用附加变量。

于 2018-06-28T02:17:01.830 回答