При работе над программными проектами в качестве хобби у меня был прогресс, который замедлялся или полностью останавливался во время процесса проектирования много раз. Обычно я сталкиваюсь с теми же проблемами, с которыми я уже сталкивался раньше. Одной из таких повторяющихся проблем о разрешении объекта знать, что объект должен это связаться или какой объект является его владельцем:C++: распространение информации от дочернего объекта до родительского объекта
Предположим, что у нас есть экземпляр класса Corporation
имени startup
, где работают один класс Supervisor
объект и несколько классов Employee
объектов. Надзорный орган несет ответственность за назначение задач сотрудникам и помощь сотрудникам при обращении за помощью. Но сотрудники должны знать , который является их руководителем, чтобы сообщить, что они закончили работу над своим заданием или попросили чего-то.
Проблема в том, как сообщить сотрудникам, кто является этим руководителем? Я придумал несколько решений, но ни один из них не кажется мне окончательным ответом.
- сделать экземпляр
Supervisor
глобально доступным, и есть всеEmployees
просто называют этот экземпляр непосредственно: Как избежать глобал, как правило, хорошая идея, но это могло быть исключением? Я думаю, что нет, и если быstartup
когда-либо вырастет, чтобы иметь более одного менеджера, возникнут проблемы. - Добавление члена
static Supervisor *supervisor
в классEmployee
: это позволяет избежать использования и проблем, связанных с глобальным доступом, но сохраняет неспособность сотрудников сообщать различным менеджерам, когда растетstartup
. - Добавление
Supervisor *supervisor
элемента кEmployee
класса, и передаваяSupervisor
указатель к каждомуEmployee
в качестве параметра конструктору сотрудника: Очень гибкий, но неэффективен с точки зрения использования памяти, когдаEmployee
не имеет много переменных-членов. - Передача
Supervisor
указатель в качестве параметра в каждом вызовеEmployee
функций-членов, гдеEmployee
может понадобиться знать, кто являетсяsupervisor
: Самый гибкий, но, вероятно, еще менее эффективным, чем решение 3, и почти все функции-члены будут требовать от руководителя , что приводит к дополнительным накладным расходам и ненужным зависимостям. - Выполнение
Employee
шаблона класса с одним аргументом не-типаSupervisor *S
: Это будет так же эффективно, как решение 1 или 2, но гораздо более гибкое. Однако, хотя число сотрудников вstartup
может быть изменено во время выполнения, добавление большего количества супервизоров вstartup
во время выполнения было бы невозможным, если в момент компиляции не создаются дополнительные супервизоры, но остаются неактивными. Кроме того, я понятия не имею, как создать конструктор копирования, который в качестве аргумента принимает одного сотрудника другого, но похожего (созданного шаблоном) типа.
Мое текущее любимое решение - номер 5, при условии, что можно создать конструктор рабочей копии, так как мой проект может работать с фиксированным набором эквивалентов объектов «Manager ». – jms
Вы пришли к этому вопросу после профилирования и определения того, что указатели 'Supervisor *' действительно являются значительным источником потери памяти в вашей программе по сравнению с другим использованием памяти? В противном случае это кажется ясным примером преждевременной оптимизации, и вы не должны позволять ему «замедлять или полностью останавливать» вашу разработку на этапе проектирования. Идите с простейшим решением, концептуально правильным - № 3. Если это окажется проблемой, измените свое решение позже. – svk
Не является ли надзор работником? Как насчет разных отделов? Имеются ли у обоих HR и развития один и тот же руководитель? Что, если вы разделите развитие на несколько команд? Единственное разумное решение - № 3, и у вас никогда не будет достаточно сотрудников, чтобы сделать один указатель на одного сотрудника имеющим какое-либо значение. Как только вы это сделаете, вы используете базу данных, поэтому вам не нужно одновременно удерживать всех сотрудников в памяти. – molbdnilo