paint-brush
Ndryshimi i çelësave, humbja e vleravenga@mcsee
544 lexime
544 lexime

Ndryshimi i çelësave, humbja e vlerave

nga Maximiliano Contieri4m2025/02/24
Read on Terminal Reader

Shume gjate; Te lexosh

Kur përdorni objekte të ndryshueshme si çelësa në koleksionet e hashuara, ndryshimi i tyre prish kontratat.
featured image - Ndryshimi i çelësave, humbja e vlerave
Maximiliano Contieri HackerNoon profile picture
0-item


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.

Probleme 😔

  • Vlerat e Humbura
  • Korrigjimi i vështirë
  • Shkelja e parimit të befasisë më të vogël
  • Sjellje e papritur

Zgjidhje 😃

  1. Përdorni objekte të pandryshueshme si çelësa.
  2. Mbështetja është e barabartë me/hashCode mirë.
  3. Përdorni fushat përfundimtare (nëse gjuha juaj e lejon)
  4. Rehash pas mutacionit (Kjo është një zgjidhje e tepërt inxhinierike)

Konteksti 💬

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.

Shembull i kodit 📖

E gabuar ❌

 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

E drejtë 👉

 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

Zbulimi 🔍

  • Gjysem Automatik


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.

Etiketa 🏷️

  • Ndryshueshmëria

Niveli 🔋

  • E ndërmjetme

Pse Bijection është e rëndësishme 🗺️

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.

Gjenerata e AI 🤖

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 .

Zbulimi i AI 🥃

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.

Provoni ato! 🛠

Mbani mend: Asistentët e AI bëjnë shumë gabime

Pa udhëzime të duhura

Me udhëzime specifike

ChatGPT

ChatGPT

Klodi

Klodi

Hutim

Hutim

Kopilot

Kopilot

Binjakët

Binjakët

DeepSeek

DeepSeek

Meta AI

Meta AI

Përfundim 🏁

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.

Marrëdhëniet 👩‍❤️‍💋‍👨

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

Më shumë informacion 📕

Mohim përgjegjësie 📘

Kodi Smells janë mendimi im.

Kredite 🙏

Foto nga Kathyryn TrippUnsplash


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.


L O A D I N G
. . . comments & more!

About Author

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri@mcsee
I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

VARUR TAGS

KY ARTIKU U PARAQIT NË...