Менеджер ввода как синглтон?

Я создаю игру с использованием C++ и SFML и пишу диспетчер ввода, который может выполнять такие функции, как хранение контейнера с функциями обратного вызова и загрузка привязок из файла. Хорошая ли идея определить диспетчер ввода как класс Singleton или Monostate?

Я знаю, что шаблоны Singleton и Monostate имеют множество проблем, таких как безопасность потоков и сложное тестирование, но в этом случае, когда диспетчер ввода должен быть общим для всей программы, будет ли это иметь смысл, а если нет, то есть ли лучшее решение?

К вашему сведению, прочтите Безопасна ли реализация Мейерсом потока шаблона Singleton?. Обратите внимание, что это предназначено только для создания синглтона, а не для последующего использования синглтона, который вам нужно будет защитить обычными методами.

Richard Critten 14.07.2024 14:41

@RichardCritten Я видел несколько реализаций Singleton, но мой главный вопрос: является ли Singletons в целом хорошим способом сделать это.

Theofanis kouniakis 14.07.2024 14:44

Это, вероятно, основано на мнениях и, следовательно, не по теме для SO.

Richard Critten 14.07.2024 14:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать шаблон Singleton или Monostate для диспетчера ввода, чтобы централизовать доступ. Но важно учитывать потенциальные недостатки и альтернативы.

Вот что следует иметь в виду

Он обеспечивает единый экземпляр во всем приложении и обеспечивает глобальный доступ к экземпляру, но его сложнее тестировать из-за глобального состояния, он может вводить скрытые зависимости и по своей сути не является потокобезопасным. С другой стороны, Monostate обеспечивает появление нескольких экземпляров при совместном использовании состояния и его проще имитировать для тестирования по сравнению с Singleton. Но по-прежнему использует глобальное состояние, что может усложнить отладку и менее интуитивно понятно, чем простой синглтон.

ЕСТЬ ОЧЕНЬ ХОРОШАЯ АЛЬТЕРНАТИВА ВНЕДРЕНИЮ ЗАВИСИМОСТИ

Вы можете рассмотреть возможность использования внедрения зависимостей (DI). он позволяет передавать экземпляр диспетчера ввода там, где это необходимо, обеспечивая гибкость, а также улучшая тестируемость. Это улучшило тестируемость, позволяя легко менять реализации. Очистите зависимости, сделайте код более простым для понимания и сопровождения, а самое главное, чтобы он был гибким и адаптируемым к изменениям в будущем. Но для этого требуется немного больше шаблонного кода, и вам следует избегать его в небольших проектах. Вы можете найти очень полезный ресурс, чтобы узнать больше об этом здесь.

Полезно ли внедрение зависимостей в C++

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

Theofanis kouniakis 14.07.2024 16:41

Да вы правы. В DI каждый класс, которому необходимо использовать общий экземпляр, обычно имеет член, содержащий ссылку (или указатель) на этот экземпляр. Таким образом, общий экземпляр внедряется в класс, что делает зависимость явной и способствует лучшей модульности и тестируемости.

abuzain 14.07.2024 17:06

Пожалуйста, отметьте мой ответ, если он решит вашу проблему

abuzain 14.07.2024 17:07

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