Я сейчас пытаюсь избавиться от объектов бога из моего серверного кода.
Сначала я решил сделать дизайн своего сервера. World
, а также const
контейнеры объекты как синглтон.
Но мой сервер многопоточный, и синглтоны не являются хорошим решением.
Так что мне это удалось, и я перевел эти классы как Core
экземпляр класса.
Например:
class Core
{
...
private:
World world;
CExpTable exptable;
...
};
Core
на новое соединение дает ссылки на объект для Session
учебный класс.
new Session(io_pool.getService(), world, exptable ...);
Мне нужен только один экземпляр этого объекта.
Но божественный объект — это плохой шаблон проектирования, поэтому я хотел бы спросить, как я могу изменить дизайн этого объекта, чтобы избежать его, и насколько хорош дизайн одиночного шаблона?
Прежде всего, вы можете прочитать много сообщений о том, почему синглтоны плохие, например этот. Есть много других с большим количеством обоснованных точек зрения, почему этот шаблон в большинстве случаев не очень полезен.
Что касается вашего рефакторинга: лучший способ — идти шаг за шагом. Большие революции обычно создают ошибки. Судя по моему опыту, демонтировать божий объект не очень сложно.
Вы можете действовать следующим образом:
Следующий шаг — заменить все виды использования класса «бог-объект» новым интерфейсом в контексте новой ответственности, а затем сделать это снова.
Если у вас есть некоторые государство которые должны использоваться / обрабатываться этими обязанностями (например, World
экземпляр в вашем примере), то вам придется сделать его общим. Вы можете преобразовать его в shared_ptr
например, так что можно будет оставить его в бог-объекте для проведения рефакторинга, а также использовать его в новых классах.
Других решений пока нет …