𝗕𝗲𝘄𝗮𝗿𝗲 𝗼𝗳 𝗹𝗼𝗱𝗮𝘀𝗵.𝗺𝗲𝗺𝗼𝗶𝘇𝗲 -> 𝗹𝗼𝗱𝗮𝘀𝗵.𝗺𝗲𝗺𝗼𝗶𝘇𝗲 થી સાવધ રહો

Lodash memoize મફત પરફોર્મન્સ જેવું લાગે છે. તમે એક ફંક્શનને રેપ (wrap) કરો છો અને તમને કેશ (cache) મળે છે.

પરંતુ તેની ડિફોલ્ટ વર્તણૂકમાં એક છટકું છે. તે ફક્ત પ્રથમ આર્ગ્યુમેન્ટ પરથી જ કેશ કી (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"

કીમાં એવી દરેક વસ્તુ હોવી જોઈએ જે આઉટપુટને બદલે છે.

અંતિમ વિચાર: મેમોઇઝેશન (memoization) જોખમ વધારે છે. તેનો ઉપયોગ ત્યારે જ કરો જ્યારે કોઈ ફંક્શન ખર્ચાળ (expensive) હોય અને સમાન ઇનપુટ્સ સાથે વારંવાર ચાલતું હોય. સાદા ફંક્શન્સ માટે, તેને ફક્ત કોલ કરો. બગ આવવાનું જોખમ તમે મેળવવાની ઝડપ કરતા ઘણીવાર વધારે હોય છે.

મુખ્ય બાબતો:

Source: https://dev.to/figsify/beware-of-lodashmemoize-it-only-remembers-the-first-argument-4cjl