На первом этапе разработки я проектирую 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).
Я разделил сущность, как показано на следующей диаграмме: -
Приведенный выше код будет обновлен до: -
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 я не ожидаю, что захочу включить / выключить драйвер.
Можно ли предотвратить проблему? Как?