lodash.memoize पासून सावध राहा
Lodash memoize हे मोफत परफॉर्मन्स (performance) देण्यासारखे वाटते. तुम्ही एका फंक्शनला वेढता (wrap) आणि तुम्हाला कॅश (cache) मिळते.
पण त्याच्या डीफॉल्ट (default) वर्तणुकीमध्ये एक सापळा आहे. ते फक्त पहिल्या आर्ग्युमेंटवरून (argument) कॅश की (cache key) तयार करते. ते इतर सर्व आर्ग्युमेंट्सकडे दुर्लक्ष करते.
जर तुम्ही एक आर्ग्युमेंट वापरले, तर तुम्ही सुरक्षित आहात. जर तुम्ही दोन किंवा अधिक वापरले, तर तुम्ही बग्स (bugs) निर्माण करता.
या उदाहरणाकडे पहा:
const add = memoize((a, b) => a + b);
add(1, 2); // 3 परत करते. ते '1' या की (key) अंतर्गत रिझल्ट कॅश करते.
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" परत करते. की (key) 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"
आउटपुट बदलणाऱ्या प्रत्येक गोष्टीला ही की (key) पकडणे आवश्यक आहे.
शेवटचा विचार: मेमोइझेशन (memoization) जोखीम वाढवते. जेव्हा एखादे फंक्शन 'एक्स्पेंसिव्ह' (expensive) असते आणि ते वारंवार समान इनपुट्ससह चालते, तेव्हाच त्याचा वापर करा. साध्या फंक्शन्ससाठी, त्यांना फक्त कॉल करा. मिळणाऱ्या वेगापेक्षा बग येण्याची जोखीम अनेकदा जास्त असते.
Key takeaways:
- डीफॉल्ट की (keys) फक्त पहिल्या आर्ग्युमेंटचा वापर करतात.
- की मध्ये सर्व आर्ग्युमेंट्स समाविष्ट करण्यासाठी रिझॉल्व्हर (resolver) वापरा.
- एक चांगली की आउटपुट बदलणाऱ्या सर्व गोष्टींचे प्रतिबिंब दर्शवते.
- साध्या (cheap) फंक्शन्ससाठी memoize वापरू नका.
Source: https://dev.to/figsify/beware-of-lodashmemoize-it-only-remembers-the-first-argument-4cjl