C ++: Как правильно организовать подсистемы программ? - PullRequest
3 голосов
/ 01 марта 2011

Представьте, что у вас большой проект приложения, код разделен на ряд подсистем, реализованных в виде классов, производных от CBaseSubsystem.

Вот уже мой первый вопрос:

  • Хорошая идея организовать подсистемы как классы [производные от базового класса]?

Тогда у вас есть классы подсистем.Теперь вам нужно создать их экземпляры где-нибудь.Но где?

  • Полезно ли хранить каждый экземпляр подсистемы в глобальной переменной, например:
    extern CEventSystem* g_EventSystem;

  • Где должны быть созданы экземпляры?Все вместе в main () -подобной функции?

  • Или лучше полностью избегать глобальных переменных и организовывать экземпляры в класс CSubsystemManager или тому подобное?

  • Подойдет ли использование одноэлементных классов?

Ответы [ 4 ]

1 голос
/ 04 марта 2011

Очень похоже на это . Я бы избегал Singleton , потому что здесь это абсолютно не нужно и вызывает много других проблем .

Создание экземпляров в основной процедуре. Если кому-то нужна система, предоставьте доступ к ней с помощью каких-либо средств, будь то параметр, передаваемый непосредственно этому объекту, или контейнер, который обеспечивает доступ к этим системам (IE: CSubSystemManager). Вам, вероятно, не нужно заходить так далеко, чтобы написать CSubSystemManager.

Избегайте глобального состояния, есть причина, по которой у него есть стигма.

0 голосов
/ 04 марта 2011

Мое решение будет создавать комбинацию из одного реестра, AbstractFactory и Factory.

//in base module

class ISubsystem{} //an interface for a subsystem

//in module code
Registry::instance()->registerFactory("subsystem1",new Subsystem1Factory());

//in user code
IFactory* factory = Registry::instance()->getFactory("subsystem1");
ISubsystem* subsystem = factory->createObject(...); //you can implement whatever policy in factory impl. (like singleton etc.)
0 голосов
/ 04 марта 2011

Если вы хотите говорить о теории, а не задавать конкретный вопрос, рассмотрите возможность проектирования с точки зрения комбинации Factory и Singleton с возможностью Стратегия в подсистемах, которые могут реализовать аналогичную операцию для ряда различных типов объектов.

Основная подсистема Factory сама по себе является синглтоном, цель которого, я надеюсь, очевидна. Используйте отложенную оценку, чтобы разрешить загрузку только необходимых объектов подсистемы при необходимости. Возможно, вы захотите предоставить каждой подсистеме механизм подсчета ссылок, который позволит отбрасывать их, когда они больше не нужны. Некоторые подсистемы могут быть одиночными и / или могут также реализовывать шаблон Стратегии для предоставления конкретной услуги для ряда типов классов. Эта услуга может быть, например, проверка, рендеринг, сериализация и т. Д.

Ценностное суждение о том, является ли «хорошей идеей» создание приложения таким образом, не для меня. Я бы предпочел, чтобы старшая мудрость заговорила об этом.

0 голосов
/ 01 марта 2011

Если вам нужен способ доступа к экземпляру каждой подсистемы, я бы не стал использовать «extern», а вместо этого использовал бы синглтон, который дает вам доступ к экземпляру CSubsystemManager. Сам менеджер может позаботиться о создании объектов вашей подсистемы и управлении ими.

...