web-dev-qa-db-ja.com

クラスは、そのすべてのプライベートフィールドにパブリックミューテーターを提供する必要がありますか?

私はCAST監査に基づいてJavaアプリケーションのリファクタリングに取り組んでいます。基準の1つは、

OOカプセル化の概念を尊重するために、プライベートフィールドには常にアクセサを通じてアクセスする必要があります。

ここまでは順調ですね。ただし、監査では、どのように使用されているかに関係なく、ミューテーターを持たないクラスのすべてのプライベートフィールドが強調表示されます。

私の場合、これらのフィールドはクラス内からのみアクセスされます。

私はそれらすべてにプライベートアクセサーを提供することができますが、 読みやすさ のために、それは良い考えではないと思います。さらに、プライベート属性にプライベートゲッターを提供すると、OOカプセル化がどのように強化されるかわかりません。

すべてのフィールドにパブリックミューテーター sを指定することもできます。私はそれが多くのアプリケーションで行われるのを見てきました。考えてみてください。ほとんどのIDEは、すべてのクラス属性のパブリックミューテーターを自動的に生成する機能を提供します...

しかし、私は疑問に思いますクラス内でのみ使用されることを意図したプライベート属性にパブリックアクセサーを提供することは、カプセル化のまさに原則に反しませんか?

編集:私の質問は、自分のクラス内でのアクセサの使用についてではありません。クラスの外部で使用されているかどうかに関係なく、クラスのall privateフィールドにパブリックアクセサーを提供することの妥当性についてです。

3
The Once-ler

ソフトウェアの設計と開発には厳密な規則はほとんどありませんが、クラスのevery属性のミューテーター/ゲッター/セッターは、アンチパターン、または少なくともOOPの良い習慣ではありません。

少なくともある意味では、getter/setterの広範な使用は、特にオブジェクト指向ではない、または少なくともオブジェクト指向の一般的なケースではない JavaBeans に大きく影響されているようです。一部の人々は、ゲッター/セッター 「悪」だった(2003年に!) または "有害と見なされた" と主張した。

私はそれほど遠くに行きませんが、多くのゲッター/セッターは Tell、Do n't Ask やカプセル化などのガイドラインを弱めたり、回避したりする傾向があると思います。属性が実装の詳細、クラスの内部である場合、なぜそのインターフェースを介して公開する必要があるのですか?

ゲッター/セッターは、場合によっては、データストアへのオブジェクトの永続化/データストアからのオブジェクトの永続化/ロードにそれらを必要とする(または少なくともその使用を奨励する)いくつかの永続フレームワークの歴史的な「アーティファクト」でもあります。その場合、技術的な詳細が悪いOOデザインを奨励することになった。

これらすべてを念頭に置いて、私は1つのことが言えると思います:いいえ、クラスはそのすべてのプライベートフィールドにパブリックミューテーターを提供するべきではありません。必要な場合もありますが、一般的な原則としては正しくありません。

2
Andres F.

だから私はいくつかグーグルをしました。引用したルールは次のとおりです。

OOカプセル化の概念を尊重するために、プライベートフィールドには常にアクセサを通じてアクセスする必要があります。

https://www.appmarq.com/public/changeability,4576,Provide-accessors-to-Private-Fields

その修復:

各プライベートフィールドにゲッターとセッターを書き込む

そしてリファレンス。おそらく正当化のために:

http://www.Oracle.com/technetwork/Java/javase/documentation/spec-136004.html JavaBeans(TM)仕様1.01最終リリース-段落8.3プロパティの設計パターンp 55

ただし、参照を確認すると、何も表示されません。プロパティの実装方法がすべてです。

そのため、テキストの選択を妨げる恐ろしいAppmarqサイトと相まって、CAST監査全体は基本的に価値がないと私は信じています。

すべてのプライベートフィールドがプロパティをサポートするという考えはばかげています。おそらくそれらが実際に意味は、「パブリックフィールドではなくプロパティを使用する」または「ステートフルオブジェクトに注意してください!」

11
Ewan

いいえ、何も見逃していないようです。その監査は誤解されているように聞こえますが、とりわけ、Stringのような不変オブジェクトが「OOカプセル化の概念に対して」であることを意味します。

7
Caleth

別の見方として、ゲッターやセッターなしがあるべきだと主張する人もいます。全然。 IMO、これは少し強すぎますが、ゲッターと設定には重大な欠点があり、避ける必要があるという優れた点を示しています。

いずれにせよ、CAST監査は、それが本当にすべてのプライベートフィールドにアクセサを追加することを意味するものであるならば、くだらないことです。 「フィールドへのアクセスを許可したい場合は、アクセサメソッドを作成する」という意味だと思いますが、よくわかりません。

ゲッター/セッター悪期

getterおよびsetterメソッドがなぜ悪いのか

0
user949300