𝗹𝗼𝗱𝗮𝘀𝗵.𝗺𝗲𝗺𝗼𝗶𝘇𝗲 పట్ల జాగ్రత్త
Lodash memoize ఉచిత పనితీరులా (free performance) అనిపిస్తుంది. మీరు ఒక ఫంక్షన్ను రాప్ (wrap) చేస్తే మీకు ఒక క్యాష్ (cache) లభిస్తుంది.
కానీ దీని డిఫాల్ట్ ప్రవర్తనలో ఒక ఉచ్చు (trap) ఉంది. ఇది కేవలం మొదటి ఆర్గ్యుమెంట్ నుండి మాత్రమే క్యాష్ కీని (cache key) నిర్మిస్తుంది. మిగిలిన ఇతర ఆర్గ్యుమెంట్లను ఇది విస్మరిస్తుంది.
మీరు ఒక ఆర్గ్యుమెంట్ను ఉపయోగిస్తే, మీరు సురక్షితంగా ఉన్నారు. మీరు రెండు లేదా అంతకంటే ఎక్కువ ఉపయోగిస్తే, బగ్లు (bugs) వచ్చే అవకాశం ఉంది.
ఈ ఉదాహరణ చూడండి:
const add = memoize((a, b) => a + b);
add(1, 2); // 3ని తిరిగి ఇస్తుంది. ఇది 1 అనే కీ కింద ఫలితాన్ని క్యాష్ చేస్తుంది.
add(1, 9); // 3ని తిరిగి ఇస్తుంది. ఇది తప్పు. 10 రావాలి.
Lodash మళ్ళీ 1ని చూస్తుంది. క్యాష్లో 1ని కనుగొంటుంది. పాత ఫలితాన్నే తిరిగి ఇస్తుంది. ఇది 9ని అసలు చూడదు.
కరెన్సీ ఫార్మాటింగ్ (Currency formatting) అనేది ఒక సాధారణ ఉచ్చు.
const formatPrice = memoize((amount, currency) =>
new Intl.NumberFormat('en', { style: 'currency', currency }).format(amount)
);
formatPrice(100, 'USD'); // "$100.00"ని తిరిగి ఇస్తుంది. కీ 100.
formatPrice(100, 'EUR'); // "$100.00"ని తిరిగి ఇస్తుంది. ఇది తప్పు.
రెండవ కాల్ 'EUR'ని విస్మరిస్తుంది. క్యాష్లో 100ని చూసి, యూరోలకు బదులుగా డాలర్లను తిరిగి ఇస్తుంది. ఇందులో ఎటువంటి ఎర్రర్ ఉండదు. ఎటువంటి వార్నింగ్ ఉండదు. మీరు కేవలం మీ వినియోగదారులకు తప్పుగా ఉన్న డబ్బును చూపిస్తారు.
క్యాష్ కీని నిర్వచించడానికి మీరు తప్పనిసరిగా రెండవ ఆర్గ్యుమెంట్ను అందించాలి. ఈ కీ ప్రతి ఇన్పుట్ను కవర్ చేయాలి.
const formatPrice = memoize(
(amount, currency) =>
new Intl.NumberFormat('en', { style: 'currency', currency }).format(amount),
(amount, currency) => `${amount}|${currency}`
);
formatPrice(100, 'USD'); // "$100.00"
formatPrice(100, 'EUR'); // "€100.00"
అవుట్పుట్ను మార్చే ప్రతి అంశాన్ని కీ తప్పనిసరిగా పట్టుకోవాలి (capture చేయాలి).
చివరిగా ఒక మాట: memoization వల్ల రిస్క్ పెరుగుతుంది. ఒక ఫంక్షన్ ఎక్కువ రిసోర్సెస్ తీసుకునేది (expensive) అయి, అదే ఇన్పుట్లతో తరచుగా రన్ అవుతున్నప్పుడు మాత్రమే దీనిని ఉపయోగించండి. సాధారణ ఫంక్షన్ల కోసం, వాటిని నేరుగా కాల్ చేయండి. మీరు పొందే వేగం కంటే బగ్ వచ్చే ప్రమాదం ఎక్కువగా ఉంటుంది.
ముఖ్యమైన అంశాలు:
- డిఫాల్ట్ కీలు కేవలం మొదటి ఆర్గ్యుమెంట్ను మాత్రమే ఉపయోగిస్తాయి.
- కీలో అన్ని ఆర్గ్యుమెంట్లను చేర్చడానికి ఒక రిజాల్వర్ను (resolver) ఉపయోగించండి.
- మంచి కీ అవుట్పుట్ను మార్చే ప్రతి అంశాన్ని ప్రతిబింబించాలి.
- తక్కువ రిసోర్సెస్ తీసుకునే (cheap) ఫంక్షన్ల కోసం memoizeని ఉపయోగించకండి.
Source: https://dev.to/figsify/beware-of-lodashmemoize-it-only-remembers-the-first-argument-4cjl