Ndryshimi i çelësave, humbja e vlerave
TL;DR: Kur përdorni objekte të ndryshueshme si çelësa në koleksionet e hashuara, ndryshimi i tyre prish kontratat.
Kur përdorni objekte të ndryshueshme si çelësa në koleksionet e hashuara , ndryshimi i tastit të tyre pasi të keni shtuar një objekt të lidhur mund ta bëjë atë të pakthyeshëm.
Kjo ndodh sepse kodi hash ndryshon dhe koleksioni nuk mund ta gjejë objektin në kovën e duhur.
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
Ju mund ta zbuloni këtë erë duke kontrolluar nëse përdorni objekte të ndryshueshme si çelësa në koleksionet e bazuara në hash.
Mjetet e automatizuara si linjat ose inspektimet IDE mund të tregojnë gjithashtu çelësa të ndryshueshëm.
Bijeksioni midis botës reale dhe programit tuaj është i rëndësishëm sepse siguron që objektet tuaja të pasqyrojnë me saktësi marrëdhëniet që supozohet të përfaqësojnë.
Në botën reale, çelësat janë shpesh të pandryshueshëm (p.sh. ID-të, emrat).
Kur i modeloni këta çelësa si objekte të ndryshueshme, ju prishni korrespondencën një-për-një midis botës reale dhe programit tuaj në MAPPER .
Kur e thyeni këtë bijeksion duke përdorur çelësa të ndryshueshëm, ju e bëni jokonsistencën e hartës duke çuar në dështime në rikthim dhe sjellje të papritura.
Gjeneratorët e AI mund të krijojnë këtë erë nëse gjenerojnë objekte të ndryshueshme si çelësa pa marrë parasysh implikimet.
Ky është rrallë rast pasi gjeneratorët e AI vuajnë nga obsesioni primitiv .
Gjeneruesit e inteligjencës artificiale mund ta zbulojnë këtë erë me udhëzime për të analizuar përdorimin e objekteve të ndryshueshme në koleksionet e bazuara në hash dhe për të shënuar problemet e mundshme.
Ju mund ta udhëzoni AI të kërkojë klasa pa fusha përfundimtare ose metoda që modifikojnë gjendjen e objektit pas krijimit.
Mbani mend: Asistentët e AI bëjnë shumë gabime
Pa udhëzime të duhura | Me udhëzime specifike |
---|---|
Kur përdorni objekte të ndryshueshme si çelësa, rrezikoni të prishni kontratën midis gjendjes së çelësit dhe kodit hash.
Përdorni objekte të pandryshueshme për të shmangur këtë problem.
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
Kodi Smells janë mendimi im.
Foto nga Kathyryn Tripp në Unsplash
Vetia më e rëndësishme e një programi është nëse ai përmbush qëllimin e përdoruesit të tij.
CAR Hoare
Ky artikull është pjesë e serisë CodeSmell.