キーの変更、値の喪失
TL;DR: ハッシュ コレクションのキーとして可変オブジェクトを使用する場合、それらを変更すると契約が破棄されます。
ハッシュ コレクションのキーとして可変オブジェクトを使用する場合、関連オブジェクトを追加した後にキーを変更すると、オブジェクトを取得できなくなる可能性があります。
これは、ハッシュ コードが変更され、コレクションが正しいバケット内でオブジェクトを見つけることができないために発生します。
class MutableKey { int id; MutableKey(int newId) { this.id = newId; } @Override public int hashCode() { return this.id; } @Override public boolean equals(Object objectToCompare) { if (this == objectToCompare) return true; MutableKey that = (MutableKey) objectToCompare; return id == that.id; } } MutableKey key = new MutableKey(42); Map<MutableKey, String> map = new HashMap<>(); map.put(key, "Yes Album"); // The key mutates key.id = 90125; // Now you cannont retrieve the album System.out.println(map.get(key)); // Output: null
class ImmutableKey { private final int id; ImmutableKey(int newId) { this.id = newId; } @Override public int hashCode() { return this.id; } @Override public boolean equals(Object objectToCompare) { if (this == objectToCompare) return true; ImmutableKey that = (ImmutableKey) objectToCompare; return id == that.id; } } ImmutableKey key = new ImmutableKey(42); Map<ImmutableKey, String> map = new HashMap<>(); map.put(key, "Yes Album"); System.out.println(map.get(key)); // Output: Yes Album
ハッシュベースのコレクションでキーとして可変オブジェクトを使用しているかどうかを確認することで、この臭いを検出できます。
リンターや IDE 検査などの自動化ツールも、変更可能なキーにフラグを立てることができます。
現実世界とプログラム間の一対一対応は、オブジェクトが表すべき関係を正確に反映することを保証するため重要です。
現実の世界では、キーは不変であることが多いです (ID、名前など)。
これらのキーを変更可能なオブジェクトとしてモデル化すると、現実世界とMAPPER内のプログラム間の 1 対 1 の対応が崩れます。
可変キーを使用してこの一対一性を破ると、マップの一貫性がなくなり、取得の失敗や予期しない動作が発生します。
AI ジェネレーターは、影響を考慮せずにキーとして可変オブジェクトを生成すると、この臭いを生み出す可能性があります。
AI ジェネレーターは原始的な強迫観念に悩まされているため、このようなことはめったに起こりません。
AI ジェネレーターは、ハッシュベースのコレクションでの変更可能なオブジェクトの使用を分析し、潜在的な問題をフラグ付けする指示を使用して、この臭いを検出できます。
作成後にオブジェクトの状態を変更するfinalフィールドやメソッドのないクラスを探すように AI に指示できます。
覚えておいてください:AIアシスタントは多くの間違いを犯します
適切な指示がなければ | 具体的な指示 |
---|---|
可変オブジェクトをキーとして使用すると、キーの状態とハッシュ コード間の契約が破られるリスクがあります。
この問題を回避するには、不変オブジェクトを使用します。
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxiv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxiv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxvi
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xviii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxvi
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xlii
コードスメルは私の意見です。
UnsplashのKathyryn Trippによる写真
プログラムの最も重要な特性は、それがユーザーの意図を達成するかどうかです。
CAR ホア
この記事は CodeSmell シリーズの一部です。