ゲッターの使用は重大な問題です。内部を公開することは大きな問題です
TL;DR: 内部を公開して制御を失わないようにする
問題点
- 可変性
- 予期せぬ変化
- 波及効果
- スレッドの安全性
- カプセル化原則違反
ソリューション
- コレクションの浅いコピーを返す
コンテクスト
不変オブジェクトは、関数型プログラミングやオブジェクト指向プログラミングに不可欠です。
一度作成されると、その状態を変更することはできません。
これは、オブジェクトの整合性を維持し、マルチスレッド アプリケーションでスレッドの安全性を確保するための鍵となります。
可変ゲッターを使用すると、呼び出し元がオブジェクトの内部状態にアクセスして変更できるため、破損や予期しない動作が発生する可能性があります。
カプセル化を破ると、オブジェクトから責任が失われ、整合性が失われます。
本のページを返すことは、不変のコピーのようなものです。人間の記憶のように編集することはできません。
長期記憶からいくつかの記憶を呼び出して編集することができます。
サンプルコード
間違っている
public class Person {
private List hobbies;
public Person(List hobbies) {
this.hobbies = hobbies;
}
public List getHobbies() {
return hobbies;
}
}
右
public class Person {
private List hobbies;
public Person(List hobbies) {
this.hobbies = new ArrayList(hobbies);
}
public List hobbies() {
// This returns a shallow copy
// This is usually not a big performance issue
return new ArrayList(hobbies);
}
}
検出
ゲッターの戻り値の型を調べることで、変更可能なゲッターを検出できます。
変更可能なコレクションまたはオブジェクトを返す場合は、変更不可能なコピーを返すようにリファクタリングするか、変更不可能なデータ構造を使用する必要があります。
レベル
AI生成
AI ジェネレーターがベストプラクティスよりもシンプルさと簡潔さを優先すると、この臭いが生じる可能性があります。
可変オブジェクトを返すことの影響を常に考慮するわけではありません。
AI検出
AI ツールは、変更可能なオブジェクトまたはコレクションを返すゲッターを探すように指示すると、この臭いを検出できます。
問題を解決するために、コピーを返すか、不変の型を使用することを提案できます。
結論
ゲッターはコードの臭いですが、保持しているオブジェクトを返すために必要なものです。
自己責任で実行できますが、それらのコレクションの追跡は保持されます。
オブジェクトの整合性とカプセル化を保護するために、変更可能なゲッターの使用を避けてください。
不変のコピーを返すか、不変の型を使用することで、意図しない変更を防ぎ、オブジェクトの信頼性と予測可能性を維持できます。
関係
コードスメル68 – ゲッター
コードスメル 109 – 自動プロパティ
免責事項: コードスメルは私の意見です。
最高のプログラマーは簡単なプログラムだけを書きます。
マイケル・A・ジャクソン
ソフトウェアエンジニアリングの名言