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