2012-02-23 5 views
3

パブリックメンバーのバールを使用する必要があるのはなぜか分かりません。パブリックメンバー変数を使用するのはなぜですか?

私たちはいつもプライベートに設定し、代わりにゲッター/セッターを使用できないのですか?変数にアクセスする以外の機能を使用できることは、変数に直接アクセスしてから、後で何かを変更する必要があることを知ることよりも常に良いようです。

パブリックを使用するのはいつ賢明ですか?

答えて

5

かなり主観的です。

しかし、良い習慣であると考えられるものに、私は非常に主観的な視点を想定し...あなただけの、時には「バリューとして知られている「データ転送オブジェクト」としてクラスを使用しているとき、時にはそれが「慎重な」と考えています

オブジェクト "。これらの本質は、彼らが痩せており、行動も状態も含まないということです。このパターンに慣れていない場合は、基本的にはオブジェクト/プリミティブをコンテナにグループ化するだけで、それがその唯一の機能です。

パブリックメンバーのフィールドは、あなたが言及した理由で不適切であるという慣行を受け入れているようです。別の理由はアクセス制御です。場合によっては、消費者は値を読み取ることができるだけで、ローカルでしか設定することができません。 Getters/Setterを使うと、このようなことができます。 (一部の言語では、初期化時に一度設定できるconst/read onlyフィールドを使用してこれを行うこともできます)

FowlerはDTO自体にシリアル化機能を追加しているようですが、 DTO/Valueオブジェクトのフィールドの http://martinfowler.com/eaaCatalog/dataTransferObject.html

+0

また、**不変オブジェクト**は、オブジェクトが構築された後に状態が固定されているため、メソッドアプローチが大きなアプローチではないように見える別のケースです。 –

1

あなたは、パブリックメンバ変数を持って、あなたのクラスは(他のライブラリ/実行ファイルへの、すなわち目に見える)内部残るすべてがあなたのコントロール下にあるので、それは大丈夫であることを確認した場合。特に素早く何かを開発したり、Java、C#などのOO言語にCコードをすばやく移植したい場合は...

クラスが外部に表示されている場合は、getters/setterでより優れたカプセル化を行うことができます。

プログラミング言語としてC#を使用している場合は、「プロパティ」を使用して楽しむことができます。フィールドをプロパティに変更すると、参照されたコードを変更する必要はありません(ref/outでフィールドを使用した場合を除く)。

+0

あなたが言ったことは本当ですが、必ずしもそうではありません。プロパティは、リフレクションに応じて何かを使用するときに監視する必要がある非常に重要な違いがあります。シリアライゼーションは、自動生成プロパティを使用する場合に特に注意が必要です。なぜなら、バッキングフィールドは自動的に生成され、基本となる名前などに関して常に同じであることが保証されていないからです。それは、おそらく例外ではないということです。 –

+0

あなたがそういうクラスへのリフレクションを利用する場合は、プロパティやフィールドを処理することを検討する必要があります。バッキングフィールドの名前付けに問題がある場合は、パブリックプロパティにのみ反映することでこれを防ぐことができます。 – linquize

関連する問題