Jak doda膰 flag臋 馃毄do obiektu nie modyfikuj膮c go?

Jak doda膰 flag臋 馃毄do obiektu nie modyfikuj膮c go?

W programowaniu cz臋sto mamy do czynienia z obiektami, kt贸re pobieramy z baz danych lub zewn臋trznych 藕r贸de艂 poprzez interfejsy API. W niekt贸rych przypadkach mo偶e zaistnie膰 potrzeba dodania do tych obiekt贸w pewnych flag lub metadanych, kt贸re pomog膮 nam w dalszym przetwarzaniu i analizie danych. Warto jednak pami臋ta膰, 偶e modyfikowanie oryginalnych obiekt贸w mo偶e prowadzi膰 do niepo偶膮danych efekt贸w i utrudni膰 debugowanie kodu. Dlatego te偶 warto zastanowi膰 si臋 nad wykorzystaniem struktur takich jak Map i WeakMap w celu przechowywania tych dodatkowych informacji.

Problem modyfikacji obiekt贸w

Rozwa偶my przyk艂ad. Mamy obiekt reprezentuj膮cy osob臋, kt贸r膮 pobrali艣my z bazy danych:

const person = { 
firstName: "John", 
lastName: "Ragnar", 
age: 31, 
city: "艁贸d藕"

};

Naszym celem jest oznaczenie tej osoby jako "online" bez modyfikacji samego obiektu. Cz臋sto mo偶emy zastosowa膰 prost膮 metod臋, jak dodanie flagi:

person.isOnline = true;

Jednak偶e, takie podej艣cie modyfikuje obiekt, co w niekt贸rych sytuacjach mo偶e prowadzi膰 do niepo偶膮danych efekt贸w.

Masz dosy膰 czytania? Obejrzyj ten filmik, w kt贸rym Wojtek wyt艂umaczy Ci to wszystko szybko i prosto.

Wy艣wietl ten post na Instagramie

Post udost臋pniony przez Ragnarson (@ragnarsoncom)

Map i WeakMap

Utworzenie Mapy:

const myMap = new Map();

Mapa jest struktur膮 danych dost臋pn膮 w j臋zyku JavaScript, kt贸ra pozwala na przechowywanie pary klucz-warto艣膰, gdzie klucze mog膮 by膰 dowolnymi typami danych. W odr贸偶nieniu od zwyk艂ych obiekt贸w, w mapach nie wyst臋puje problem z niespodziewanym nadpisaniem istniej膮cych w艂a艣ciwo艣ci. Klucze w mapie s膮 unikalne, co eliminuje ryzyko przypadkowej modyfikacji lub nadpisania warto艣ci.

Utworzenie WeakMapy:

const myWeakMap = new WeakMap();

WeakMap to specjalna odmiana mapy, kt贸ra ma pewne ograniczenia, ale r贸wnie偶 cenne zastosowanie w pewnych sytuacjach. G艂贸wn膮 r贸偶nic膮 mi臋dzy WeakMap膮 a zwyk艂膮 Map膮 jest to, 偶e klucze w WeakMapie musz膮 by膰 obiektami, a nie dowolnymi typami danych. Co wi臋cej, klucze w WeakMapie nie s膮 odporne na usuwanie przez mechanizm Garbage Collection (GC) w JavaScript. Je艣li jedyny odwo艂uj膮cy si臋 do klucza obiekt zostanie usuni臋ty, klucz i zwi膮zane z nim dane r贸wnie偶 zostan膮 usuni臋te, co pomaga unikn膮膰 wyciek贸w pami臋ci.

Wykorzystanie WeakMap w celu dodawania flag

Zamiast jednak modyfikowa膰 oryginalny obiekt, mo偶emy wykorzysta膰 WeakMap臋 do przechowywania dodatkowych informacji.

Przypisanie Flagi:

const personData = new WeakMap(); 
personData.set(person, { isOnline: true });

Dzi臋ki takiemu podej艣ciu, nie modyfikujemy bezpo艣rednio obiektu person, co eliminuje ryzyko niezamierzonej zmiany innych w艂a艣ciwo艣ci. Jednocze艣nie mamy dost臋p do dodanej flagi poprzez odwo艂anie si臋 do WeakMapy personData.

const flagData = personData.get(person);
if (flagData && flagData.isOnline) {
  console.log(`${person.firstName} ${person.lastName} is online.`);
} else {
  console.log(`${person.firstName} ${person.lastName} is offline.`);
}

Podsumowanie

Unikanie bezpo艣redniej modyfikacji obiekt贸w mo偶e pom贸c w utrzymaniu czytelno艣ci i poprawno艣ci kodu. Wykorzystanie Map i WeakMap w celu przechowywania dodatkowych informacji, takich jak flagi czy metadane, pozwala na unikni臋cie niepo偶膮danych efekt贸w ubocznych. Mapy pozwalaj膮 na przechowywanie r贸偶nych typ贸w danych jako klucze i warto艣ci. Natomiast WeakMapy, cho膰 maj膮 pewne ograniczenia, s膮 przydatne w scenariuszach, gdzie chcemy unikn膮膰 wyciek贸w pami臋ci i nie zamierzamy d艂u偶ej u偶ywa膰 kluczy. Pami臋tajmy, 偶e wyb贸r odpowiedniej struktury zale偶y od kontekstu i wymaga艅 naszego projektu.