プライベート/パブリックメンバーとしてベクターを使用したクラスデザイン?
-
10-07-2019 - |
質問
プライベートクラスまたはパブリックメンバーとして、クラス内にコンテナクラスまたは他のクラスを配置する最良の方法は何ですか?
要件:
1.Vector <!> lt; someclass <!> gt;クラス内
2。ベクターの追加とカウントが必要なインターフェース
解決
コンテナの状態がクラスの不変式の一部である場合、可能であればプライベートにする必要があります。
たとえば、コンテナが3次元のベクトルを表す場合、不変式の一部は常に正確に3つの数値を含むことです。パブリックメンバーとして公開すると、クラスの外部のコードでコンテナサイズを変更できるようになり、コンテナのサイズを一定にする必要があるルーチンで問題が発生する可能性があります。コンテナをプライベートに保つと、コンテナのサイズをクラスのメンバー関数に合わせて変更できるソフトウェア内の場所が制限されます。
他のヒント
メンバーがプライベートまたはパブリックとして宣言されるかどうかは、アプリケーションに完全に依存します。詳細を教えていただけますか?
メンバーを宣言する際に覚えておくべき重要な点は、<!> quot; getter <!> quot;取得するには、そのオブジェクトをカプセル化する必要はありません。代わりに、公開したい機能のみを公開するラッパーメソッドを作成するとよいでしょう。
たとえば、Vectorメンバーの場合、公開したいすべての機能があれば、AddItemメソッドとClearメソッドを記述できます。
クラスについて話しているので、私はそれがプライベートであるべきだと思います。パブリックにしたい場合は、構造体を作成します- members 変数を使用することを明確にします。
vector
メンバーを公開するための実行可能な代替手段は、訪問者関数(または内部反復子)を作成することです。このようにして、デメテルの法則を順守します:
class ContWrapper {
std::vector<int> _ints;
public:
class Action {
public:
virtual void accept( int i ) = 0;
};
void each_int( Action& a );
};
また、エクスポートするときは非常に注意してくださいライブラリからのstd::vector<T>
も:クライアントコードはあなたと同じSTL実装を使用しない可能性があるため、これらのメンバー変数のレイアウトは異なる場合があります!
すべてのメンバーをプライベートにし、アクセサーメソッドを使用します。これにより、後で実装を変更できます。非常にまれな状況でのみ、データメンバーをパブリックにします。
実装の変更は想像よりも頻繁に発生することを思い出してください。これはコンテナのタイプを変更するだけでなく、メカニズムを変更したい場合もあります。リストに名前を保存していて、しばらくしてからこのリストにハッシュでインデックスを付けることを選択し、新しい名前を追加するたびにハッシュを更新したいとします。実装が適切にカプセル化されている場合、これは簡単です。ベクトルを公開したばかりの場合は、インターフェイスを調整する変更を加える必要があります(したがって、変更は波及します)。
これが初めての場合は、 http://を読んでください。 en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)
3番目の方法があります-コンテナから継承し、そのメソッドをオーバーライドして目的を達成する方がよい場合があります(スレッドセーフなど)。とにかく、ほとんど常に公開することは良い考えではありません。
別のクラス内にコンテナをカプセル化することを考慮すると、コンテナはパブリックにできません。また、クラスのパブリックメソッドは、コンテナに関する実装固有の何かを公開するべきではありません。そうすれば、クラス(つまり、コンテナ)の実装を、インターフェイスを変更せずに変更できます。