2009-03-22 5 views
5

私は、読み書き可能な組み込み型メンバーがたくさんあるクラスを持っています。私はそれらをパブリックメンバーにして、それぞれにget/setメソッドを提供する必要がありますか?構造についてはどうですか?アクセサーとパブリックメンバー

答えて

13

invariantsがある場合は、保存しておく必要があります。そうでなければ、気にしないでください。

+1

downvotersに:私はStroustrup自身からアドバイスを受けた:http://www.artima.com/intv/goldilocks3.html "Bjarne Stroustrup:私の経験則では、あなたはインターフェースと隠されたあなたがクラスの不変量を考えることができる場合に限り、表現することができます。 –

+0

確定しています。同じテキストの後ろに "はい、すべてのデータに価値がある場合は、クラスを持つのはあまり意味がありません。名前と住所を持つ単一のデータ構造を取ってください。どんな文字列でも良いアドレスです。それが何であれ、それは構造体です。 –

+0

続き:「プライベートなものはありません。 get_nameとset_address、get_nameとset_name関数で隠された名前とアドレスフィールドを持つような何もしないでください。あるいは、さらに悪いことに、仮想get_nameとset_name関数などを使って仮想基底クラスを作ることができます。 " –

4

第1に、あなたのクラスにたくさんのデータママがある場合、おそらくうまく設計されていないでしょう。複数のクラスに分割したり、マップなどの構造体にデータを格納することを検討する必要があります。

アクセサーの提供に関しては、アクセスを変更して、アクセスを妨げる可能性がありますか?答えが「はい」の場合は、アクセス機能が必要です。一方、あなたのクラスが本当にビットの袋で、行動がない場合は、それを構造にしてください。

0

プライベート/保護されたデータメンバーの取得/設定メソッドを使用するのは悪い設計です。

これにより、クライアントコードがクラスの実装の詳細に依存します。

クラスを変更すると、クライアントコードが変更されます。

ただし、パブリックメンバーのget/setメソッドを使用できます。しかし、それらを避けることは常に良いことです。

+0

なぜ-3 downvoting? – anand

+1

私はそれをアップボートしたので、それは少なくとも4ダウンボーイズでした:) 真剣に、私はgetters /セッターは悪いデザインであることはよく知られていると思った。恐ろしい。 –

+0

ゲッター/セッターを使用できるかどうかという疑問がありましたか? これは、ほとんどの時代の悪いデザインで、私が答えたものです。上記の答えのほとんどから、同じ結論が出ました。 私はすべての人に共通の知識はないと確信しています。 – anand

19

アクセサー(ゲッター)と修飾子(セッター)を持つ理由のすべては、あなたに余分な間接レベルを与えることです。

このレベルの間接化によって、データメンバの変更を許可しないで、変数の読み取り専用ビューをパブリックインターフェイスに提供できます。それでもプライベートまたはセッターを使用することができます。

セッターを使用すると、値が設定されているときに特別なエラーチェック、検証、および修正を行うことができます。たとえば、setDirectory(const std :: string & strPath)のように、ユーザーが指定しなかった場合は、終端スラッシュがあることを確認できます。これにより、クラスの状態が常に有効になります。

ゲッターは、メンバーに公開されていないことからメンバーを指すようにすることもできます。外部からのポインタを許可しないことで、オブジェクトが範囲外になるとクラッシュすることはありません。

ゲッター/セッターの間接レベルを追加することで、カプセル化されたデータメンバーを変更することもできます。

getterを使用すると、データメンバが実際に秒単位で格納されているときに、getMinutesなど、データのさまざまなビューを取得することもできます。

これはこれを使用する理由ではありませんが、getterとsetterを使用することによる優れた副作用は、修飾子の中にブレークポイントを設定して、いつ変更が行われたかを正確に確認できることです。

使用するかどうかは、必要に応じて判断を呼び出すことです。非常に多くのメンバーがいる場合、ゲッターと設定を提供するのは非常に苦痛です。データメンバーを構造体に格納し、代わりにクラス内でその構造体を使用することを検討できます。構造体全体のオブジェクトのgetter/setterを一度に提供することもできます。

1

あなたは例えば(クライアントコードに公開しないことが、唯一の

  • 構造でパブリックデータメンバーを使用する必要があります。バインドスタイルのファンクタを) - それは彼らのタイプは例えば(それらを取得/セットのロジックをカプセル化した場合、これまで
  • を取得する外部の誰も構造を保護するために役に立たないです彼らはconstのメンバーである場合は)
  • をクラスObservableAttributeを作成する場合。

パブリックデータメンバーを作成する場合、その値が他のメンバーと完全に直交していることを確認する必要があります。クラス。例えば、あなたがメンバーは、クラス内の任意の部分を再生することメンバー

  • への変化を観察する

    • の将来の可能性を無効にする不変
    • メンバーの実装を変更するメンバー
    • へのアクセスを無効にしますパフォーマンスが必要な場合は、計算されたものとキャッシュされたものと保存されたもののどちらかです。
  • 関連する問題