Архитектура компонентного объекта: хотите разделить большой объект -> трудно реорганизовать - PullRequest
0 голосов
/ 28 июня 2018

На первом этапе разработки я проектирую Car и AI как 1 объект.
Хорошо работает (псевдокод): -

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"
}

Позже мне понадобится новая функция: драйвер входа-выхода (который влияет на AI).
Я разделил сущность, как показано на следующей диаграмме: -

enter image description here

Приведенный выше код будет обновлен до: -

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 типы транспортных средств в версии 1 например. truck, motercycle, plane, boat, rocket
Мне придется отредактировать N*2 строк, которые потенциально уже разбросаны по многим .cpp.

Основная проблема: Если я забуду провести рефакторинг любого кода, он все равно будет хорошо скомпилирован.
Проблема появится только во время выполнения.

В реальной жизни я сталкиваюсь с такой проблемой, когда новый дизайн желает разделить сущность на множество более простых сущностей.
Рефакторинг всегда просто добавляет еще одно косвенное направление.

Вопрос

Предположим, что в version1 я не ожидаю, что захочу включить / выключить драйвер.
Можно ли предотвратить проблему? Как?

1 Ответ

0 голосов
/ 28 июня 2018

Возможно, я ошибаюсь, но кажется, что вы, возможно, просматриваете все объекты несколько раз, проверяя условие. Я не совсем уверен в синтаксисе 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 требует чего-то определенного для каждого типа. В моем примере с псевдокодом я предполагаю, что мы отправляем только сущность, а не что-то конкретное для конкретного типа. Если это так, можно использовать дополнительную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...