私は、読み書き可能な組み込み型メンバーがたくさんあるクラスを持っています。私はそれらをパブリックメンバーにして、それぞれにget/setメソッドを提供する必要がありますか?構造についてはどうですか?アクセサーとパブリックメンバー
答えて
invariantsがある場合は、保存しておく必要があります。そうでなければ、気にしないでください。
第1に、あなたのクラスにたくさんのデータママがある場合、おそらくうまく設計されていないでしょう。複数のクラスに分割したり、マップなどの構造体にデータを格納することを検討する必要があります。
アクセサーの提供に関しては、アクセスを変更して、アクセスを妨げる可能性がありますか?答えが「はい」の場合は、アクセス機能が必要です。一方、あなたのクラスが本当にビットの袋で、行動がない場合は、それを構造にしてください。
プライベート/保護されたデータメンバーの取得/設定メソッドを使用するのは悪い設計です。
これにより、クライアントコードがクラスの実装の詳細に依存します。
クラスを変更すると、クライアントコードが変更されます。
ただし、パブリックメンバーのget/setメソッドを使用できます。しかし、それらを避けることは常に良いことです。
アクセサー(ゲッター)と修飾子(セッター)を持つ理由のすべては、あなたに余分な間接レベルを与えることです。
このレベルの間接化によって、データメンバの変更を許可しないで、変数の読み取り専用ビューをパブリックインターフェイスに提供できます。それでもプライベートまたはセッターを使用することができます。
セッターを使用すると、値が設定されているときに特別なエラーチェック、検証、および修正を行うことができます。たとえば、setDirectory(const std :: string & strPath)のように、ユーザーが指定しなかった場合は、終端スラッシュがあることを確認できます。これにより、クラスの状態が常に有効になります。
ゲッターは、メンバーに公開されていないことからメンバーを指すようにすることもできます。外部からのポインタを許可しないことで、オブジェクトが範囲外になるとクラッシュすることはありません。
ゲッター/セッターの間接レベルを追加することで、カプセル化されたデータメンバーを変更することもできます。
getterを使用すると、データメンバが実際に秒単位で格納されているときに、getMinutesなど、データのさまざまなビューを取得することもできます。
これはこれを使用する理由ではありませんが、getterとsetterを使用することによる優れた副作用は、修飾子の中にブレークポイントを設定して、いつ変更が行われたかを正確に確認できることです。
使用するかどうかは、必要に応じて判断を呼び出すことです。非常に多くのメンバーがいる場合、ゲッターと設定を提供するのは非常に苦痛です。データメンバーを構造体に格納し、代わりにクラス内でその構造体を使用することを検討できます。構造体全体のオブジェクトのgetter/setterを一度に提供することもできます。
あなたは例えば(クライアントコードに公開しないことが、唯一の
- 構造でパブリックデータメンバーを使用する必要があります。バインドスタイルのファンクタを) - それは彼らのタイプは例えば(それらを取得/セットのロジックをカプセル化した場合、これまで
- を取得する外部の誰も構造を保護するために役に立たないです彼らはconstのメンバーである場合は)
- をクラスObservableAttributeを作成する場合。
パブリックデータメンバーを作成する場合、その値が他のメンバーと完全に直交していることを確認する必要があります。クラス。例えば、あなたがメンバーは、クラス内の任意の部分を再生することメンバー
- の将来の可能性を無効にする不変
- メンバーの実装を変更するメンバー
- へのアクセスを無効にしますパフォーマンスが必要な場合は、計算されたものとキャッシュされたものと保存されたもののどちらかです。
- 1. 抽象クラスとアクセサー
- 2. Laravel 5.3集計とアクセサー
- 3. パブリックメンバーvs C#でクラスのコンストラクタ?
- 4. D3.js - レイアウト - 値アクセサー
- 5. 略語アクセサーと突然変異子
- 6. アクセサー付きベクタオブジェクトのソート
- 7. カスタムコンポーネントバインディング: ''の値アクセサーなし
- 8. は、デフォルトコンストラクタを持つ構造体のパブリックメンバー
- 9. パブリックメンバー 'name'を持つことができません
- 10. 遅延アクセサーを書く方法
- 11. Laravel 5.3:アクセサー値がJSONエンコードなし
- 12. デフォルトの属性アクセサーを作成する
- 13. Angular4 - フォームコントロールのアクセサーがありません
- 14. Angular2のエラー - 値のアクセサーなし ''
- 15. 元の例外: '' - angular2の値アクセサーなし
- 16. C#保護されたreadonly autopropertyと取得アクセサーと保護されたreadonlyフィールド
- 17. javadocから特定のクラス/パッケージ/パブリックメンバーを除外する方法
- 18. C++:クラスの外部からのパブリックメンバー関数へのアクセス
- 19. タイプ 'OrderedEnumerable(Of Panel、Integer)'のパブリックメンバー 'Count'が見つかりません
- 20. パブリックメンバー変数を使用するのはなぜですか?
- 21. Excel VBA - ワークシートのパブリックメンバーが利用できません
- 22. ファイル内のすべてのパブリックメンバーを自動コメント
- 23. ITypeのすべてのIMメソッドのアクセサーとミューテータ(ゲッター/セッター)の特定
- 24. javascriptオブジェクトのアクセサーと通常関数の違いは何ですか?
- 25. KotlinのMockitoによってアクセサーをモックすることは可能ですか?
- 26. Dropzoneへのアクセサーを取得するには?
- 27. 2D配列(privateメンバー)のアクセサーを書く方法
- 28. Mono.Cecilで型のアクセサーを変更する方法
- 29. Javascript ngModel: ''の値アクセサーがありません
- 30. アクセサーをインライン化する必要がありますか?
downvotersに:私はStroustrup自身からアドバイスを受けた:http://www.artima.com/intv/goldilocks3.html "Bjarne Stroustrup:私の経験則では、あなたはインターフェースと隠されたあなたがクラスの不変量を考えることができる場合に限り、表現することができます。 –
確定しています。同じテキストの後ろに "はい、すべてのデータに価値がある場合は、クラスを持つのはあまり意味がありません。名前と住所を持つ単一のデータ構造を取ってください。どんな文字列でも良いアドレスです。それが何であれ、それは構造体です。 –
続き:「プライベートなものはありません。 get_nameとset_address、get_nameとset_name関数で隠された名前とアドレスフィールドを持つような何もしないでください。あるいは、さらに悪いことに、仮想get_nameとset_name関数などを使って仮想基底クラスを作ることができます。 " –