3

「System」という大きなクラスがあります(「System」を「House」に変更したいのですが)。システムには、窓やドアなど、さまざまなタイプのオブジェクトが含まれています。異なるタイプのオブジェクトを同じ基本クラスで処理することはできません。システムを構築するには、さまざまなタイプのオブジェクトを1つずつ追加する必要があります。また、システムを管理するには、1つ削除、すべてクリアなどの他の方法も必要です。私はそれを行う2つの方法を比較しています。1つは、Systemクラスのインターフェイスにすべてのメソッドを実装することです。もう1つは、オブジェクトの内部コンテナーを公開し、ユーザーがコンテナーのメソッドを呼び出してそれを実行できるようにすることです。私は最初のものがより良いはずだと思いますが、私が多くの異なるタイプを持っている場合、私が書く必要がある非常に多くの同様のコードがありますか?それを行うためのより良い方法はありますか?ありがとう。

class System
{
public:
    AddDoor(Door);
    DeleteDoor(Door);
    DeleteAllDoors();
    ...

    AddWindow(Window);
    DeleteWindow(Window);
    DeleteAllWindows();
    ...

    ......

private:
    vector<Door> m_doors;
    vector<Window> m_windows;
}


class System
{
public:
    vector<Door>& Doors();
    vector<Window>& Windows();
    ...

private:
    vector<Door> m_doors;
    vector<Window> m_windows;
}
4

2 に答える 2

2

実装は次のようになります。

class System {
public:
    #if YOU_ARE_USING_C++11
    template<typename... Args>
    void Add(Args &&... args) {
     GetContainer<T>().emplace_back(std::forward<Args>(args)...);
    }
    #else
    template<typename T>
    void Add(T const & t) {
        GetContainer<T>().push_back(t);
    }
    #endif
    template<typename T>
    void Delete(T const & t) {
        std::vector<T>::iterator position = std::find(GetContainer<T>().begin(), GetContainer<T>().end(), t);
        GetContainer<T>().erase(position);
    }
private:
    template<typename T>
    std::vector<T> & GetContainer();
};

template<>
std::vector<Doors> & System::GetContainer() {
    return m_doors;
}
template<>
std::vector<Windows> & System::GetContainer() {
    return m_windows;
}

あなたが探しているのはこのようなものですか?問題をもっと理解せずに、ここで「最良の」設計が何であるかを判断するのは難しいです。

そうは言っても、機能だけでなく、パブリックメンバーとしてクラスを持つことが適切な場合もあります。

于 2012-12-27T23:14:21.620 に答える
2

オブジェクト指向設計の重要な原則の1つは、「実装の詳細を非表示にする」ことです[もちろん、オブジェクト指向設計を使用しない場合でも考慮する必要があります]。

この場合、それは、物事がベクトルに格納されていることを呼び出し元のコードに公開してはならないことを意味します。「ベクトルはこの種のものには適していない、マップ、リスト、またはツリーを使用する必要がある、または...少なくともいくつかを変更することを意味する」と判断した場合、コードの残りの部分はどうなりますかコードがたくさんある場合、これは良いことではありません。

したがって、最初のアイデアは、ここに示す2つのうちの良い方です。

私が少し心配していることの1つは、クラスが「システム」と呼ばれているという事実です。これは、クラスが神オブジェクトであることを意味することがよくあります。クラスにはすべてが含まれ、すべてです。一般に、クラスは可能な限り小さくシンプルにする必要があります。

あなたが「神オブジェクト」を持っているかどうかはわかりませんが、それがシステム(またはマネージャー)と呼ばれている兆候は、スコット・マイヤーズの著書「EffectiveC++」によると警告です。

(非常に優れた)テンプレートソリューションとは別に、オブジェクトを保存および取得するためのインターフェイスクラスを用意し、オブジェクトを別の場所に別々に配置することです。オブジェクト用に別々のコンテナーを作成することもできますが、コードのセットは1つです。インターフェイスタイプのオブジェクトを追加/削除します。

于 2012-12-27T23:19:58.953 に答える