это снова мое приложение для моделирования полета. Сейчас я ухожу от фазы простого прототипирования и начинаю дорабатывать дизайн программного обеспечения. По крайней мере, я пытаюсь ..
С каждым самолетом в симуляции связан план полета, точная природа которого не представляет интереса для этого вопроса. Достаточно сказать, что оператор редактирует план полета во время симуляции. Модель самолета в большинстве случаев нуждается только в считывании объекта плана полета, который на первый взгляд требует простой передачи константной ссылки. Но иногда самолету нужно будет позвонить AdvanceActiveWayPoint()
, чтобы указать, какая точка пути достигнута. Это повлияет на Итератор, возвращаемый функцией ActiveWayPoint()
. Это означает, что модель самолета действительно нуждается в неконстантной привязке, которая, в свою очередь, также предоставляет функции, подобные AppendWayPoint()
, для модели самолета. Я хотел бы избежать этого, потому что я хотел бы применить правило использования, описанное выше, во время компиляции.
Обратите внимание, что class WayPointIter
эквивалентно константному итератору STL, то есть точка пути не может быть изменена итератором.
class FlightPlan
{
public:
void AppendWayPoint(const WayPointIter& at, WayPoint new_wp);
void ReplaceWayPoint(const WayPointIter& ar, WayPoint new_wp);
void RemoveWayPoint(WayPointIter at);
(...)
WayPointIter First() const;
WayPointIter Last() const;
WayPointIter Active() const;
void AdvanceActiveWayPoint() const;
(...)
};
Моя идея преодолеть эту проблему заключается в следующем: определить абстрактный интерфейсный класс для каждой роли использования и наследовать FlightPlan от обеих. Затем каждому пользователю передается только ссылка на соответствующую роль использования.
class IFlightPlanActiveWayPoint
{
public:
WayPointIter Active() const =0;
void AdvanceActiveWayPoint() const =0;
};
class IFlightPlanEditable
{
public:
void AppendWayPoint(const WayPointIter& at, WayPoint new_wp);
void ReplaceWayPoint(const WayPointIter& ar, WayPoint new_wp);
void RemoveWayPoint(WayPointIter at);
(...)
};
Таким образом, объявление FlightPlan
необходимо будет изменить только на:
class FlightPlan : public IFlightPlanActiveWayPoint, IFlightPlanEditable
{
(...)
};
Что вы думаете? Есть ли какие-нибудь пещерные кошки, которые я мог бы пропустить? Этот дизайн понятен, или я должен придумать что-то другое для ясности?
В качестве альтернативы я мог бы также определить специальный класс ActiveWayPoint
, который бы содержал функцию AdvanceActiveWayPoint()
, но чувствовал, что это может быть ненужным.
Заранее спасибо!