Бог замена объекта

Я сейчас пытаюсь избавиться от объектов бога из моего серверного кода.

Сначала я решил сделать дизайн своего сервера. World, а также const контейнеры объекты как синглтон.

Но мой сервер многопоточный, и синглтоны не являются хорошим решением.

Так что мне это удалось, и я перевел эти классы как Core экземпляр класса.

Например:

class Core
{
...
private:
World world;
CExpTable exptable;
...
};

Core на новое соединение дает ссылки на объект для Session учебный класс.

new Session(io_pool.getService(), world, exptable ...);

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

1 ответ

Решение

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

Что касается вашего рефакторинга: лучший способ - идти шаг за шагом. Большие революции обычно создают ошибки. Судя по моему опыту, демонтировать божий объект не очень сложно.

Вы можете действовать следующим образом:

  • определить небольшую ответственность, которую вы хотели бы извлечь из бога-объекта
  • разработать новый интерфейс для этой ответственности:
    • начать писать юнит-тесты для нового класса, реализующего этот новый интерфейс. Сделайте тесты, проходящие мимо экземпляра объекта бога, заключенного в новый объект, и просто перенаправьте вызовы
  • имея набор юнит-тестов, вы можете вырезать куски кода из бога-объекта в новый объект

Следующий шаг - заменить все виды использования класса "бог-объект" новым интерфейсом в контексте новой ответственности, а затем повторить его.

Если у вас есть какой-то штат, который должен использоваться / обрабатываться этими обязанностями (например, World экземпляр в вашем примере), то вам придется сделать его общим. Вы можете преобразовать его в shared_ptr например, так что можно будет оставить его в бог-объекте для проведения рефакторинга, а также использовать его в новых классах.

Другие вопросы по тегам