Я создаю игру с использованием C++ и SFML и пишу диспетчер ввода, который может выполнять такие функции, как хранение контейнера с функциями обратного вызова и загрузка привязок из файла. Хорошая ли идея определить диспетчер ввода как класс Singleton или Monostate?
Я знаю, что шаблоны Singleton и Monostate имеют множество проблем, таких как безопасность потоков и сложное тестирование, но в этом случае, когда диспетчер ввода должен быть общим для всей программы, будет ли это иметь смысл, а если нет, то есть ли лучшее решение?
@RichardCritten Я видел несколько реализаций Singleton, но мой главный вопрос: является ли Singletons в целом хорошим способом сделать это.
Это, вероятно, основано на мнениях и, следовательно, не по теме для SO.
Вы можете использовать шаблон Singleton или Monostate для диспетчера ввода, чтобы централизовать доступ. Но важно учитывать потенциальные недостатки и альтернативы.
Он обеспечивает единый экземпляр во всем приложении и обеспечивает глобальный доступ к экземпляру, но его сложнее тестировать из-за глобального состояния, он может вводить скрытые зависимости и по своей сути не является потокобезопасным. С другой стороны, Monostate обеспечивает появление нескольких экземпляров при совместном использовании состояния и его проще имитировать для тестирования по сравнению с Singleton. Но по-прежнему использует глобальное состояние, что может усложнить отладку и менее интуитивно понятно, чем простой синглтон.
Вы можете рассмотреть возможность использования внедрения зависимостей (DI). он позволяет передавать экземпляр диспетчера ввода там, где это необходимо, обеспечивая гибкость, а также улучшая тестируемость. Это улучшило тестируемость, позволяя легко менять реализации. Очистите зависимости, сделайте код более простым для понимания и сопровождения, а самое главное, чтобы он был гибким и адаптируемым к изменениям в будущем. Но для этого требуется немного больше шаблонного кода, и вам следует избегать его в небольших проектах. Вы можете найти очень полезный ресурс, чтобы узнать больше об этом здесь.
Полезно ли внедрение зависимостей в C++
При внедрении зависимостей каждый класс, который хочет получить доступ к общему элементу, должен иметь указатель на член, который указывает на экземпляр, если я правильно понимаю.
Да вы правы. В DI каждый класс, которому необходимо использовать общий экземпляр, обычно имеет член, содержащий ссылку (или указатель) на этот экземпляр. Таким образом, общий экземпляр внедряется в класс, что делает зависимость явной и способствует лучшей модульности и тестируемости.
Пожалуйста, отметьте мой ответ, если он решит вашу проблему
К вашему сведению, прочтите Безопасна ли реализация Мейерсом потока шаблона Singleton?. Обратите внимание, что это предназначено только для создания синглтона, а не для последующего использования синглтона, который вам нужно будет защитить обычными методами.