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.
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.