2010-12-05 20 views
2

関連するものは何も見つかりませんでしたが、これが既に要求されていればごめんなさい。私はときどき私が内部で2つの異なる容器を言うクラスを持っている儀式で自分自身を見つける。次のようなもの:C++:多くのコンテナを含むクラスのインターフェイスを設計する

class Foo 
{ 
    public: 
    typedef std::vector<int> int_list; 
    typedef std::vector<X> x_list; 

    // It would be nice if the user could iterate through these etc. so that I 
    // could define functions that operate on them as non-member non-friends. 

    typedef int_list::size_type int_list_size_type; 
    typedef int_list::const_iterator int_list_const_iter; 

    typedef x_list::size_type x_list_size_type; 
    typedef x_list::const_iterator x_list_const_iter; 

    int_list_const_iter int_list begin() const { return ints_.begin(); } 
    x_list_const_iter begin() const { return xs_.begin(); } 

    int_list::size_type size_of_ints() const { return ints_.size(); } 
    x_list::size_type size_of_xs() const { return xs_.size(); } 

    // And so forth ... ! 

    private: 
    int_list ints_; 
    x_list xs_; 
}; 

どういうわけか私は不安です。これは私がやっていることをするためのスマートな方法ですか?基本的には、すべてのコンテナに対して、typedefと(constがオーバーロードされる)メソッドの開始や終了などが必要です。私は興味があります:typedefsなどの名前を付けてインターフェイスを設計する方法は何でしょうか?私は基本的には、インターフェースとメソッドの爆発が心配だと思います。

begin/endメソッドの数を制限する1つの方法は、いくつかのタグを使用するテンプレートベースのアプローチですが、それが合理的かどうかはわかりません。

ありがとうございます!

答えて

4

あなたのクラスがあまりにも多くしているように聞こえます。これらのコンテナでこれらの操作をすべて実行する必要がある場合は、すべてのSTLインターフェイスを自分でラップしようとするのではなく、コンテナ自体に一定の参照を公開するだけの方がよいでしょう。

一方、クライアントがこれらのすべてのことを行う必要がある場合は、おそらくクラスを小さなクラスに分割する必要があるという兆候です。

+3

正反対ですが、私は言うでしょう。インターナル上のすべてのオペレーションが経由して行われた場合、クラスではENOUGHは実行されません。クライアントコード。 –

+0

+1は答えとコメントの両方に+1する:これは、クライアントが望むことを何でもして、コンテナ間に何らかの一貫した状態を保証することを許可することの間の厄介な中間地のように見える。 – suszterpatt

+0

@ノア・ロバーツ:それは良い点です。 –

0

実際にこれを試しましたか?コードはコンパイルされません。異なる名前を返す同じ名前/パラメータリストを持つ2つの関数を持つことはできません。

あなたの不安は適切であり、あなたのクラスはおそらくその存在を保証するために十分な仕事をしていないでしょう。あなたがオブジェクトの完全な内部を公開してクライアントがそれらに取り組むことができるようにするという事実は、あなたのクラスがほぼ確実に100%役に立たないと結論づけます。それは設計上の問題であり、あなたの不安はあなたに何か悪臭を伝えるだけの鼻です。

+0

メソッドの名前を変更することはできますが、とにかく可能です。誰が線を引くのですか?なぜなら、未来を予測するのはちょっと難しいことであり、クライアントには自分が望むことを何でもする可能性を与える良い方法のように思えるでしょう。 – Jay

+1

"...クライアントが望むものを何でもする可能性を与える良い方法です。" < - 一種のOOの欠点 - 具体的なカプセル化 - 私は恐れている。 –

+0

クライアントはいつでも何でもできます。ライブラリを書く上でのポイントは、クライアントが自分でコード化することなく*特定のタスクを*実行できるようにすることです。あなたがクライアントのために意思決定をしたくなければ、あなたの図書館は役に立たない。すべてのライブラリは、抽象化、簡素化、問題を解決するための具体的な方法です。クライアントがそれを別の方法で解決する必要がある場合は、別のライブラリを見つける必要があります。あなたはすべてをすることはできません。あなたは何もうまくやりません。 – jalf

0

コンテナへのアクセスを許可しないでください。クラスの機能をエクスポートする必要があります。クラスには中心的な点があります。クラスがコンテナを使用していると仮定します。 intはXを参照するキーです。おそらく、アクセスを調整するインターフェースが必要になるでしょう。この場合、基本となるコンテナへのアクセスは許可しないでください。

関連する問題