Тағир додани калидҳо, гум кардани арзишҳо
TL; DR: Вақте ки шумо объектҳои тағирёбандаро ҳамчун калид дар коллексияҳои ҳашшуда истифода мебаред, тағир додани онҳо шартномаҳоро вайрон мекунад.
Мушкилот 😔
- Арзишҳои гумшуда
- Debugging сахт
- Вайрон кардани Принсипи Сюрпризи камтарин
- Рафтори ғайричашмдошт
Ҳалли 😃
- Объектҳои тағирнашавандаро ҳамчун калид истифода баред.
- Барқарор кардани баробар/hashCode хуб.
- Майдонҳои ниҳоиро истифода баред (Агар забони шумо иҷозат диҳад)
- Rehash пас аз мутатсия (Ин як ҳалли аз ҳад зиёди муҳандисӣ аст)
Контекст 💬
Вақте ки шумо объектҳои тағирёбандаро ҳамчун калидҳо дар коллексияҳои ҳашшуда истифода мебаред, тағир додани калиди онҳо пас аз илова кардани объекти алоқаманд метавонад онро бебозгашт гардонад.
Ин аз он сабаб рӯй медиҳад, ки рамзи хэш тағир меёбад ва коллексия объектро дар сатили дуруст пайдо карда наметавонад.
Рамзи намунавӣ 📖
Хато ❌
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 вайрон мекунед.
Ҳангоме ки шумо бо истифода аз калидҳои тағирёбанда ин дутарафаро вайрон мекунед, шумо харитаро номувофиқ мегардонед, ки боиси нокомии ҷустуҷӯ ва рафтори ғайричашмдошт мегардад.
Насли AI 🤖
Генераторҳои AI метавонанд ин бӯйро эҷод кунанд, агар онҳо объектҳои тағирёбандаро ҳамчун калид бидуни назардошти оқибатҳо тавлид кунанд.
Ин хеле кам рух медиҳад, зеро генераторҳои AI аз васвоси ибтидоӣ азоб мекашанд.
Муайянкунии AI 🥃
Генераторҳои AI метавонанд ин бӯйро бо дастурҳо барои таҳлили истифодаи объектҳои тағирёбанда дар коллексияҳои бар асоси ҳеш муайян кунанд ва мушкилоти эҳтимолиро нишон диҳанд.
Шумо метавонед ба 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
Маълумоти бештар 📕
Радд 📘
Code Smells фикри ман аст.
Қарзҳо 🙏
Акс аз Кэтрин Трипп дар Unsplash
Муҳимтарин хосияти барнома ин аст, ки оё он нияти корбарашро иҷро мекунад ё не.
CAR Hoare
Ин мақола як қисми силсилаи CodeSmell мебошад.