0

関連するクラスのコレクションがあり、それらを呼び出します

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++ コードからわかるように、Settings にはアクションがあり、アクションには 1 つのキー バインディングがあります。さて、私のアプリケーションのユーザーとして、潜在的にキーバインドを更新したいと考えていますか?

現在、各アクションに関連付けられたキーバインド タイプのダイアログにボタンがあるため、アクションは独自のキーバインドの更新を処理できます。

私の問題:

キーバインドが別のオブジェクトにバインドされていないことを確認するにはどうすればよいですか?

考えられる解決策:

  1. UpdateKeybind 自体を Manager クラスに移動し、Manager にすべての設定を照会させます。
  2. Action/Setting/Keybind に親ポインターを用意して、Action がマネージャーに更新されたキーバインドを照会できるようにします。
  3. アクションに他のアクションを照会させます (私が知る限り、概念的にはあまり良くありません)。

あなたから必要なもの:

  1. 保守性、速度、理解しやすさ、および OOP の適切性の観点から、Keybind が既に見つかっているかどうかのチェックを実装するための最も厳密なアプローチは何ですか。私はすでに番号 1 を試しました -- 動作しますが、もっと良くなる気がします。StackOverflow で同様の質問を見つけることができませんでしたが、もしあればぜひ見てみたいです!

  2. その他のプロのヒント、改善点は役に立ちます。

4

2 に答える 2

1

キー バインディングとアクションの間には正確に 1:1 の関係があるため、キー バインディング オブジェクトのプールから始めて、アクションを構成するときにプールから引き出すことができます。そのため、構成のために使用可能なキーを提供する場合、既にバインドされているキーは使用可能なプールにありません。

于 2013-05-09T23:52:24.727 に答える
1

@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;
}
于 2013-05-10T15:22:14.673 に答える