6

読み取り/書き込みアクセス権を持つ多くの組み込み型メンバーを持つクラスがあります。それらをパブリック メンバーにして、それぞれに get/set メソッドを提供する必要がありますか? 構造物はどうですか?

4

5 に答える 5

20

アクセサー (ゲッター) と修飾子 (セッター) を使用する理由は、間接的なレベルを追加するためです。

この余分なレベルの間接化により、変数の読み取り専用ビューをパブリック インターフェイスに提供できますが、データ メンバーを変更することはできません。プライベートまたは保護されたセッターを引き続き使用できます。

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

ゲッターは、メンバーへのポインターを許可するために、メンバーが公開されないように保護することもできます。外部からそれらへのポインターを許可しないことで、オブジェクトがスコープ外に出てもクラッシュしないようにすることができます。

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

getter を使用すると、データのさまざまなビューを取得することもできます。

これはそれらを使用する理由ではありませんが、ゲッターとセッターを使用することの良い副作用は、たとえばモディファイア内にブレークポイントを設定して、変更されたときを正確に確認できることです。

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

于 2009-03-22T13:13:39.460 に答える
15

保持する必要がある不変条件がある場合は、はい。それ以外の場合は、気にしないでください。

于 2009-03-22T13:22:39.470 に答える
4

まず、クラスに多くのデータ メンバーがある場合、そのクラスは適切に設計されていない可能性があります。複数のクラスに分割するか、マップなどの構造にデータを格納することを検討する必要がある場合があります。

アクセサーの提供に関しては、問題は、アクセスを変更して、おそらくそれを防ぎたいかどうかです。答えが「はい」の場合、アクセス機能が必要です。一方、クラスが実際には動作のない単なるビットの袋である場合は、それを構造体にします。

于 2009-03-22T12:58:34.193 に答える
1

パブリック データ メンバーのみを使用する必要があります

  • クライアント コードに公開しない構造 (バインド スタイルのファンクターなど) - 外部の誰も取得しない構造を保護しても意味がありません。
  • それらの型がそれらを設定/取得するロジックをカプセル化する場合 (例: クラス ObservableAttribute を作成する場合)
  • それらが不変構造の const メンバーである場合 (それらが不変である場合は、それらを読み取る以外に多くのことはできません)

パブリック データ メンバーを作成する場合は、その値がクラスの他のメンバーと完全に直交していることを確認する必要があります。たとえば、将来の可能性を無効にします

  • メンバーの変化を観察する
  • メンバーがクラスの不変条件で何らかの役割を果たせるようにする
  • メンバーへのアクセスを無効にする
  • パフォーマンスが必要な場合は、メンバーの実装を変更します (例: 計算されたもの、キャッシュされたもの、保存されたもの)
于 2009-03-22T13:19:22.690 に答える
0

プライベート/保護されたデータ メンバーに get/set メソッドを使用するのは、設計が不適切です。

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

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

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

于 2009-03-22T13:02:28.083 に答える