𝗕𝗲𝘄𝗮𝗿𝗲 𝗼𝗳 𝗹𝗼𝗱𝗮𝘀𝗵.𝗺𝗲𝗺𝗼𝗶𝘇𝗲

Lodash memoize ಉಚಿತ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು (performance) ನೀಡುವಂತೆ ಕಾಣುತ್ತದೆ. ನೀವು ಒಂದು ಫಂಕ್ಷನ್ ಅನ್ನು ಎನ್ಕ್ಯಾಪ್ಸುಟ್ (wrap) ಮಾಡಿದರೆ ನಿಮಗೆ ಕ್ಯಾಶ್ (cache) ಸಿಗುತ್ತದೆ.

ಆದರೆ ಇದರ ಡಿಫಾಲ್ಟ್ ವರ್ತನೆಯಲ್ಲಿ ಒಂದು ಅಪಾಯವಿದೆ (trap). ಇದು ಕೇವಲ ಮೊದಲನೇ ಆರ್ಗ್ಯುಮೆಂಟ್‌ನಿಂದ (argument) ಮಾತ್ರ ಕ್ಯಾಶ್ ಕೀಯನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಉಳಿದ ಎಲ್ಲಾ ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಇದು ನಿರ್ಲಕ್ಷಿಸುತ್ತದೆ.

ನೀವು ಒಂದೇ ಒಂದು ಆರ್ಗ್ಯುಮೆಂಟ್ ಬಳಸಿದರೆ, ನೀವು ಸುರಕ್ಷಿತರಾಗಿದ್ದೀರಿ. ಆದರೆ ನೀವು ಎರಡೂ ಅಥವಾ ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಬಳಸಿದರೆ, ಬಗ್‌ಗಳನ್ನು (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 ಸಿಗುತ್ತದೆ ಮತ್ತು ಇದು ಯುರೋಗಳ ಬದಲಿಗೆ ಡಾಲರ್‌ಗಳನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಇಲ್ಲಿ ಯಾವುದೇ ಎರರ್ (error) ಅಥವಾ ವಾರ್ನಿಂಗ್ (warning) ಬರುವುದಿಲ್ಲ. ನೀವು ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರರಿಗೆ ತಪ್ಪಾದ ಹಣದ ವಿವರವನ್ನು ತೋರಿಸುತ್ತೀರಿ.

ಕ್ಯಾಶ್ ಕೀಯನ್ನು (cache key) ವ್ಯಾಖ್ಯಾನಿಸಲು ನೀವು ಎರಡನೇ ಆರ್ಗ್ಯುಮೆಂಟ್ ಅನ್ನು ನೀಡಲೇಬೇಕು. ಈ ಕೀಯು ಪ್ರತಿಯೊಂದು ಇನ್‌ಪುಟ್ ಅನ್ನು ಒಳಗೊಂಡಿರಬೇಕು.

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