Тағир додани калидҳо, гум кардани арзишҳо
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 вайрон мекунед.
Ҳангоме ки шумо бо истифода аз калидҳои тағирёбанда ин дутарафаро вайрон мекунед, шумо харитаро номувофиқ мегардонед, ки боиси нокомии ҷустуҷӯ ва рафтори ғайричашмдошт мегардад.
Генераторҳои 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 мебошад.