தமிழ்

ஜாவாஸ்கிரிப்ட் WeakMap மற்றும் WeakSet-ஐ ஆராய்ந்து, திறமையான நினைவக நிர்வாகத்திற்கான சக்திவாய்ந்த கருவிகளைப் பற்றி அறியுங்கள். அவை நினைவகக் கசிவுகளைத் தடுத்து, உங்கள் செயலிகளை எவ்வாறு மேம்படுத்துகின்றன என்பதை நடைமுறை உதாரணங்களுடன் கற்றுக்கொள்ளுங்கள்.

நினைவக நிர்வாகத்திற்கான ஜாவாஸ்கிரிப்ட் WeakMap மற்றும் WeakSet: ஒரு விரிவான வழிகாட்டி

நினைவக மேலாண்மை என்பது வலிமையான மற்றும் செயல்திறன் மிக்க ஜாவாஸ்கிரிப்ட் செயலிகளை உருவாக்குவதில் ஒரு முக்கிய அம்சமாகும். Objects மற்றும் Arrays போன்ற பாரம்பரிய தரவுக் கட்டமைப்புகள் சில நேரங்களில் நினைவகக் கசிவுகளுக்கு வழிவகுக்கும், குறிப்பாக ஆப்ஜெக்ட் ரெபரன்ஸ்களைக் கையாளும்போது. அதிர்ஷ்டவசமாக, ஜாவாஸ்கிரிப்ட் WeakMap மற்றும் WeakSet ஆகிய இரண்டு சக்திவாய்ந்த கருவிகளை வழங்குகிறது, அவை இந்த சவால்களைச் சமாளிக்க வடிவமைக்கப்பட்டுள்ளன. இந்த விரிவான வழிகாட்டி WeakMap மற்றும் WeakSet-இன் நுணுக்கங்களை ஆராய்ந்து, அவை எவ்வாறு செயல்படுகின்றன, அவற்றின் நன்மைகள் என்ன என்பதை விளக்கி, உங்கள் திட்டங்களில் அவற்றை திறம்படப் பயன்படுத்த உதவும் நடைமுறை உதாரணங்களை வழங்கும்.

ஜாவாஸ்கிரிப்டில் நினைவகக் கசிவுகளைப் புரிந்துகொள்ளுதல்

WeakMap மற்றும் WeakSet-க்குள் நுழைவதற்கு முன், அவை தீர்க்கும் சிக்கலைப் புரிந்துகொள்வது அவசியம்: நினைவகக் கசிவுகள். உங்கள் செயலி நினைவகத்தை ஒதுக்கி, அந்த நினைவகம் இனி தேவைப்படாத போதும் அதை கணினிக்குத் திருப்பித் தராதபோது ஒரு நினைவகக் கசிவு ஏற்படுகிறது. காலப்போக்கில், இந்த கசிவுகள் குவிந்து, உங்கள் செயலி மெதுவாகி இறுதியில் செயலிழக்கச் செய்யலாம்.

ஜாவாஸ்கிரிப்டில், நினைவக மேலாண்மை பெரும்பாலும் குப்பை சேகரிப்பாளரால் (garbage collector) தானாகவே கையாளப்படுகிறது. குப்பை சேகரிப்பான், ரூட் ஆப்ஜெக்ட்களிலிருந்து (global object, call stack, ইত্যাদি) இனி அணுக முடியாத ஆப்ஜெக்ட்கள் ஆக்கிரமித்துள்ள நினைவகத்தை அவ்வப்போது கண்டறிந்து மீட்டெடுக்கிறது. இருப்பினும், எதிர்பாராத ஆப்ஜெக்ட் ரெபரன்ஸ்கள் குப்பை சேகரிப்பைத் தடுத்து, நினைவகக் கசிவுகளுக்கு வழிவகுக்கும். ஒரு எளிய உதாரணத்தைக் கருத்தில் கொள்வோம்:

let element = document.getElementById('myElement');
let data = {
  element: element,
  value: 'Some data'
};

// ... பின்னர்

// DOM-லிருந்து எலிமென்ட் அகற்றப்பட்டாலும், 'data' இன்னும் அதற்கான ஒரு ரெபரன்ஸை வைத்திருக்கிறது.
// இது எலிமென்ட் குப்பை சேகரிக்கப்படுவதைத் தடுக்கிறது.

இந்த எடுத்துக்காட்டில், data ஆப்ஜெக்ட் DOM எலிமென்ட் element-க்கு ஒரு ரெபரன்ஸை வைத்திருக்கிறது. element DOM-லிருந்து அகற்றப்பட்டாலும், data ஆப்ஜெக்ட் இன்னும் இருப்பதால், data மூலம் இன்னும் அணுக முடிவதால், element ஆக்கிரமித்துள்ள நினைவகத்தைக் குப்பை சேகரிப்பாளரால் மீட்டெடுக்க முடியாது. இது வலைச் செயலிகளில் நினைவகக் கசிவுகளின் ஒரு பொதுவான மூலமாகும்.

WeakMap அறிமுகம்

WeakMap என்பது விசை-மதிப்பு ஜோடிகளின் தொகுப்பாகும், இதில் விசைகள் (keys) ஆப்ஜெக்ட்களாக இருக்க வேண்டும் மற்றும் மதிப்புகள் (values) எந்தவொரு மதிப்பாகவும் இருக்கலாம். "பலவீனமான" (weak) என்ற சொல், WeakMap-இல் உள்ள விசைகள் பலவீனமாகப் பிடிக்கப்படுகின்றன என்பதைக் குறிக்கிறது, அதாவது அவை அந்த விசைகள் ஆக்கிரமித்துள்ள நினைவகத்தைக் குப்பை சேகரிப்பாளரால் மீட்டெடுப்பதைத் தடுக்காது. ஒரு விசை ஆப்ஜெக்ட் உங்கள் குறியீட்டின் வேறு எந்தப் பகுதியிலிருந்தும் அணுக முடியாததாகி, அது WeakMap-ஆல் மட்டுமே ரெபரன்ஸ் செய்யப்பட்டிருந்தால், குப்பை சேகரிப்பான் அந்த ஆப்ஜெக்ட்டின் நினைவகத்தை மீட்டெடுக்க சுதந்திரமாக உள்ளது. விசை குப்பை சேகரிக்கப்படும்போது, WeakMap-இல் உள்ள அதனுடன் தொடர்புடைய மதிப்பும் குப்பை சேகரிப்புக்குத் தகுதி பெறுகிறது.

WeakMap-இன் முக்கிய பண்புகள்:

WeakMap-இன் அடிப்படைப் பயன்பாடு:

WeakMap-ஐ எவ்வாறு பயன்படுத்துவது என்பதற்கான எளிய உதாரணம் இதோ:

let weakMap = new WeakMap();
let element = document.getElementById('myElement');

weakMap.set(element, 'Some data associated with the element');

console.log(weakMap.get(element)); // வெளியீடு: அந்த எலிமென்ட்டுடன் தொடர்புடைய சில தரவு

// DOM-லிருந்து எலிமென்ட் அகற்றப்பட்டு, வேறு எங்கும் ரெபரன்ஸ் செய்யப்படாவிட்டால்,
// குப்பை சேகரிப்பான் அதன் நினைவகத்தை மீட்டுக்கொள்ளும், மேலும் WeakMap-இல் உள்ள பதிவும் அகற்றப்படும்.

நடைமுறை உதாரணம்: DOM எலிமென்ட் தரவைச் சேமித்தல்

WeakMap-இன் ஒரு பொதுவான பயன்பாடு, DOM எலிமென்ட்களுடன் தொடர்புடைய தரவை, அந்த எலிமென்ட்கள் குப்பை சேகரிக்கப்படுவதைத் தடுக்காமல் சேமிப்பதாகும். ஒரு வலைப்பக்கத்தில் உள்ள ஒவ்வொரு பொத்தானுக்கும் சில மெட்டாடேட்டாவை சேமிக்க விரும்பும் ஒரு சூழ்நிலையைக் கருத்தில் கொள்ளுங்கள்:

let buttonMetadata = new WeakMap();

let button1 = document.getElementById('button1');
let button2 = document.getElementById('button2');

buttonMetadata.set(button1, { clicks: 0, label: 'Button 1' });
buttonMetadata.set(button2, { clicks: 0, label: 'Button 2' });

button1.addEventListener('click', () => {
  let data = buttonMetadata.get(button1);
  data.clicks++;
  console.log(`Button 1 clicked ${data.clicks} times`);
});

// button1 DOM-லிருந்து அகற்றப்பட்டு, வேறு எங்கும் ரெபரன்ஸ் செய்யப்படாவிட்டால்,
// குப்பை சேகரிப்பான் அதன் நினைவகத்தை மீட்டுக்கொள்ளும், மேலும் buttonMetadata-இல் உள்ள தொடர்புடைய பதிவும் அகற்றப்படும்.

இந்த எடுத்துக்காட்டில், buttonMetadata ஒவ்வொரு பொத்தானுக்கும் கிளிக் எண்ணிக்கை மற்றும் லேபிளை சேமிக்கிறது. ஒரு பொத்தான் DOM-லிருந்து அகற்றப்பட்டு வேறு எங்கும் ரெபரன்ஸ் செய்யப்படாவிட்டால், குப்பை சேகரிப்பான் அதன் நினைவகத்தை மீட்டெடுக்க முடியும், மேலும் buttonMetadata-இல் உள்ள அதனுடன் தொடர்புடைய பதிவு தானாகவே அகற்றப்படும், இது நினைவகக் கசிவைத் தடுக்கும்.

சர்வதேசமயமாக்கல் கருத்தில் கொள்ளவேண்டியவை

பல மொழிகளை ஆதரிக்கும் பயனர் இடைமுகங்களைக் கையாளும்போது, WeakMap குறிப்பாக பயனுள்ளதாக இருக்கும். DOM எலிமென்ட்களுடன் தொடர்புடைய இடஞ்சார்ந்த தரவை நீங்கள் சேமிக்கலாம்:

let localizedStrings = new WeakMap();

let heading = document.getElementById('heading');

// ஆங்கிலப் பதிப்பு
localizedStrings.set(heading, {
  en: 'Welcome to our website!',
  fr: 'Bienvenue sur notre site web!',
  es: '¡Bienvenido a nuestro sitio web!'
});

function updateHeading(locale) {
  let strings = localizedStrings.get(heading);
  heading.textContent = strings[locale];
}

updateHeading('fr'); // தலைப்பை பிரெஞ்சுக்கு மாற்றுகிறது

இந்த அணுகுமுறை, குப்பை சேகரிப்பைத் தடுக்கக்கூடிய வலுவான ரெபரன்ஸ்களைப் பிடிக்காமல், DOM எலிமென்ட்களுடன் உள்ளூர்மயமாக்கப்பட்ட சரங்களை இணைக்க உங்களை அனுமதிக்கிறது. heading எலிமென்ட் அகற்றப்பட்டால், localizedStrings-இல் உள்ள அதனுடன் தொடர்புடைய உள்ளூர்மயமாக்கப்பட்ட சரங்களும் குப்பை சேகரிப்புக்குத் தகுதியானவை.

WeakSet அறிமுகம்

WeakSet என்பது WeakMap-ஐப் போன்றது, ஆனால் இது விசை-மதிப்பு ஜோடிகளுக்குப் பதிலாக ஆப்ஜெக்ட்களின் தொகுப்பாகும். WeakMap போலவே, WeakSet ஆப்ஜெக்ட்களை பலவீனமாக வைத்திருக்கிறது, அதாவது அது அந்த ஆப்ஜெக்ட்கள் ஆக்கிரமித்துள்ள நினைவகத்தைக் குப்பை சேகரிப்பாளரால் மீட்டெடுப்பதைத் தடுக்காது. ஒரு ஆப்ஜெக்ட் உங்கள் குறியீட்டின் வேறு எந்தப் பகுதியிலிருந்தும் அணுக முடியாததாகி, அது WeakSet-ஆல் மட்டுமே ரெபரன்ஸ் செய்யப்பட்டிருந்தால், குப்பை சேகரிப்பான் அந்த ஆப்ஜெக்ட்டின் நினைவகத்தை மீட்டெடுக்க சுதந்திரமாக உள்ளது.

WeakSet-இன் முக்கிய பண்புகள்:

WeakSet-இன் அடிப்படைப் பயன்பாடு:

WeakSet-ஐ எவ்வாறு பயன்படுத்துவது என்பதற்கான எளிய உதாரணம் இதோ:

let weakSet = new WeakSet();
let element1 = document.getElementById('element1');
let element2 = document.getElementById('element2');

weakSet.add(element1);
weakSet.add(element2);

console.log(weakSet.has(element1)); // வெளியீடு: true
console.log(weakSet.has(element2)); // வெளியீடு: true

// element1 DOM-லிருந்து அகற்றப்பட்டு, வேறு எங்கும் ரெபரன்ஸ் செய்யப்படாவிட்டால்,
// குப்பை சேகரிப்பான் அதன் நினைவகத்தை மீட்டுக்கொள்ளும், மேலும் அது WeakSet-லிருந்து தானாகவே அகற்றப்படும்.

நடைமுறை உதாரணம்: செயலில் உள்ள பயனர்களைக் கண்காணித்தல்

WeakSet-இன் ஒரு பயன்பாடு, ஒரு வலைச் செயலியில் செயலில் உள்ள பயனர்களைக் கண்காணிப்பதாகும். பயனர்கள் செயலியை செயலில் பயன்படுத்தும்போது பயனர் ஆப்ஜெக்ட்களை WeakSet-இல் சேர்க்கலாம் மற்றும் அவர்கள் செயலற்றதாகும்போது அவற்றை அகற்றலாம். இது செயலில் உள்ள பயனர்களை அவர்களின் குப்பை சேகரிப்பைத் தடுக்காமல் கண்காணிக்க உங்களை அனுமதிக்கிறது.

let activeUsers = new WeakSet();

function userLoggedIn(user) {
  activeUsers.add(user);
  console.log(`User ${user.id} logged in. Active users: ${activeUsers.has(user)}`);
}

function userLoggedOut(user) {
  // WeakSet-லிருந்து வெளிப்படையாக அகற்றத் தேவையில்லை. பயனர் ஆப்ஜெக்ட் இனி ரெபரன்ஸ் செய்யப்படவில்லை என்றால்,
  // அது குப்பை சேகரிக்கப்பட்டு WeakSet-லிருந்து தானாகவே அகற்றப்படும்.
  console.log(`User ${user.id} logged out.`);
}

let user1 = { id: 1, name: 'Alice' };
let user2 = { id: 2, name: 'Bob' };

userLoggedIn(user1);
userLoggedIn(user2);
userLoggedOut(user1);

// சிறிது நேரத்திற்குப் பிறகு, user1 வேறு எங்கும் ரெபரன்ஸ் செய்யப்படவில்லை என்றால், அது குப்பை சேகரிக்கப்படும்
// மேலும் activeUsers WeakSet-லிருந்து தானாகவே அகற்றப்படும்.

பயனர் கண்காணிப்பிற்கான சர்வதேசக் கருத்தாய்வுகள்

பல்வேறு பிராந்தியங்களைச் சேர்ந்த பயனர்களைக் கையாளும்போது, பயனர் ஆப்ஜெக்ட்களுடன் பயனர் விருப்பங்களை (மொழி, நாணயம், நேர மண்டலம்) சேமிப்பது ஒரு பொதுவான நடைமுறையாகும். WeakSet-உடன் இணைந்து WeakMap-ஐப் பயன்படுத்துவது பயனர் தரவு மற்றும் செயலில் உள்ள நிலையை திறமையாக நிர்வகிக்க அனுமதிக்கிறது:

let activeUsers = new WeakSet();
let userPreferences = new WeakMap();

function userLoggedIn(user, preferences) {
  activeUsers.add(user);
  userPreferences.set(user, preferences);
  console.log(`User ${user.id} logged in with preferences:`, userPreferences.get(user));
}

let user1 = { id: 1, name: 'Alice' };
let user1Preferences = { language: 'en', currency: 'USD', timeZone: 'America/Los_Angeles' };

userLoggedIn(user1, user1Preferences);

இது பயனர் ஆப்ஜெக்ட் உயிருடன் இருக்கும்போது மட்டுமே பயனர் விருப்பத்தேர்வுகள் சேமிக்கப்படுவதை உறுதிசெய்கிறது மற்றும் பயனர் ஆப்ஜெக்ட் குப்பை சேகரிக்கப்பட்டால் நினைவகக் கசிவுகளைத் தடுக்கிறது.

WeakMap vs. Map மற்றும் WeakSet vs. Set: முக்கிய வேறுபாடுகள்

WeakMap மற்றும் Map, மற்றும் WeakSet மற்றும் Set ஆகியவற்றுக்கு இடையேயான முக்கிய வேறுபாடுகளைப் புரிந்துகொள்வது அவசியம்:

அம்சம் WeakMap Map WeakSet Set
விசை/மதிப்பு வகை ஆப்ஜெக்ட்கள் மட்டும் (கீகள்), எந்த மதிப்பும் (மதிப்புகள்) எந்த வகையும் (கீகள் மற்றும் மதிப்புகள்) ஆப்ஜெக்ட்கள் மட்டும் எந்த வகையும்
ரெபரன்ஸ் வகை பலவீனமானது (கீகள்) வலுவானது பலவீனமானது வலுவானது
மீண்டும் மீண்டும் இயக்குதல் (Iteration) அனுமதிக்கப்படவில்லை அனுமதிக்கப்பட்டது (forEach, keys, values) அனுமதிக்கப்படவில்லை அனுமதிக்கப்பட்டது (forEach, values)
குப்பை சேகரிப்பு வேறு வலுவான ரெபரன்ஸ்கள் இல்லையென்றால் கீகள் குப்பை சேகரிப்புக்குத் தகுதியானவை Map இருக்கும் வரை கீகள் மற்றும் மதிப்புகள் குப்பை சேகரிப்புக்குத் தகுதியற்றவை வேறு வலுவான ரெபரன்ஸ்கள் இல்லையென்றால் ஆப்ஜெக்ட்கள் குப்பை சேகரிப்புக்குத் தகுதியானவை Set இருக்கும் வரை ஆப்ஜெக்ட்கள் குப்பை சேகரிப்புக்குத் தகுதியற்றவை

WeakMap மற்றும் WeakSet-ஐ எப்போது பயன்படுத்த வேண்டும்

WeakMap மற்றும் WeakSet ஆகியவை பின்வரும் சூழ்நிலைகளில் குறிப்பாக பயனுள்ளதாக இருக்கும்:

WeakMap மற்றும் WeakSet-ஐப் பயன்படுத்துவதற்கான சிறந்த நடைமுறைகள்

உலாவி இணக்கத்தன்மை

WeakMap மற்றும் WeakSet ஆகியவை அனைத்து நவீன உலாவிகளாலும் ஆதரிக்கப்படுகின்றன, அவற்றுள்:

WeakMap மற்றும் WeakSet-ஐ பூர்வீகமாக ஆதரிக்காத பழைய உலாவிகளுக்கு, செயல்பாட்டை வழங்க நீங்கள் பாலிஃபில்களைப் பயன்படுத்தலாம்.

முடிவுரை

WeakMap மற்றும் WeakSet ஆகியவை ஜாவாஸ்கிரிப்ட் செயலிகளில் நினைவகத்தை திறமையாக நிர்வகிப்பதற்கான மதிப்புமிக்க கருவிகளாகும். அவை எவ்வாறு செயல்படுகின்றன மற்றும் அவற்றை எப்போது பயன்படுத்த வேண்டும் என்பதைப் புரிந்துகொள்வதன் மூலம், நீங்கள் நினைவகக் கசிவுகளைத் தடுக்கலாம், உங்கள் செயலியின் செயல்திறனை மேம்படுத்தலாம், மேலும் வலுவான மற்றும் பராமரிக்கக்கூடிய குறியீட்டை எழுதலாம். WeakMap மற்றும் WeakSet-இன் வரம்புகளான கீகள் அல்லது மதிப்புகளை மீண்டும் மீண்டும் இயக்க இயலாமை போன்றவற்றைக் கருத்தில் கொண்டு, உங்கள் குறிப்பிட்ட பயன்பாட்டு வழக்கிற்கு பொருத்தமான தரவுக் கட்டமைப்பைத் தேர்வுசெய்ய நினைவில் கொள்ளுங்கள். இந்த சிறந்த நடைமுறைகளைக் கடைப்பிடிப்பதன் மூலம், உலகளவில் அளவிடக்கூடிய உயர் செயல்திறன் கொண்ட ஜாவாஸ்கிரிப்ட் செயலிகளை உருவாக்க WeakMap மற்றும் WeakSet-இன் சக்தியை நீங்கள் பயன்படுத்தலாம்.