У меня есть коллекция связанных классов, назовите их
class Manager {
private:
std::vector<Setting> m_settings;
}
class Setting {
private:
std::vector<Action> m_actions;
}
class Action {
private:
Keybind m_keybind;
}
class Keybind {
public:
UpdateKeybind;
private:
TYPE keybind;
}
Как видно из псевдо-C ++ кода, в настройках есть действия, а действия имеют только одну привязку ключа. Теперь, как пользователь моего приложения, вы хотите обновить Keybind потенциально, да?
В настоящее время у меня есть кнопки в диалоге типа привязки клавиш, связанные с каждым действием, поэтому действие может обрабатывать обновление своей собственной привязки клавиш.
Моя проблема:
Как я могу убедиться, что связывание клавиш не связано с другим объектом?
Возможные решения:
Что мне нужно от тебя:
Каков наиболее строгий подход с точки зрения удобства сопровождения, скорости, простоты понимания и целесообразности ООП для реализации проверки, если Keybind уже найден, вне зависимости от моих предложенных решений или чего-то еще полностью. Я уже попробовал номер 1 — он работает, но я чувствую, что это может быть лучше, ты копаешь?
Мне не удалось найти похожие вопросы в StackOverflow, но если вы это сделаете, мне бы очень хотелось их увидеть!
Любые другие профессиональные советы, вещи для улучшения полезны.
Как говорит @Amardeep, вы можете попробовать создать класс, управляющий отображением между действиями и сочетаниями клавиш. Ниже приведен пример. Он автоматически удалит привязку к действию, если для этой привязки будет новая привязка.
class Manager {
private:
std::vector<Setting*> m_settings;
KeybindPool *m_keybindPool;
};
class Setting {
private:
std::vector<Action*> m_actions;
};
class Action {
public:
void Bind(Keybind* keybind) {
m_manager->m_keybindPool->Update(this, keybind)
}
Keybind* getKeybind() const {
return m_manager->m_keybindPool->getKeybind(this);
}
private:
Manager *m_manager;
};
class KeybindPool {
public:
void Update(Action* action, Keybind* keybind) {
if (m_keybindActionMap.find(keybind) != m_keybindActionMap.end()) {
m_actionKeybindMap.erase(action);
}
m_keybindActionMap[keybind] = action;
m_actionKeybindMap[action] = keybind;
}
Keybind* getKeybind(Action* action) {
return m_actionKeybindMap[action];
}
private:
map<Keybind*, Action*> m_keybindActionMap;
map<Action*, Keybind*> m_actionKeybindMap;
};
class Keybind {
private:
TYPE keybind;
}
Поскольку между привязками клавиш и действиями существует ровное соотношение 1: 1, вы можете начать с пула объектов привязки клавиш и использовать его при настройке действий. Таким образом, при предложении доступных ключей для конфигурации любые уже связанные ключи не будут находиться в доступном пуле.