𝗹𝗼𝗱𝗮𝘀𝗵.𝗺𝗲𝗺𝗼𝗶𝘇𝗲 সম্পর্কে সতর্ক থাকুন
Lodash memoize দেখে মনে হয় এটি বিনামূল্যে পারফরম্যান্স বাড়িয়ে দেয়। আপনি একটি ফাংশনকে র্যাপ (wrap) করলেই একটি ক্যাশ (cache) পেয়ে যান।
কিন্তু এর ডিফল্ট আচরণের মধ্যে একটি ফাঁদ রয়েছে। এটি শুধুমাত্র প্রথম আর্গুমেন্ট থেকে ক্যাশ কী (cache key) তৈরি করে। এটি অন্য সব আর্গুমেন্টকে উপেক্ষা করে।
আপনি যদি একটি আর্গুমেন্ট ব্যবহার করেন, তবে আপনি নিরাপদ। কিন্তু যদি দুই বা তার বেশি আর্গুমেন্ট ব্যবহার করেন, তবে আপনি বাগ (bug) তৈরি করছেন।
এই উদাহরণটি দেখুন:
const add = memoize((a, b) => a + b);
add(1, 2); // ৩ রিটার্ন করে। এটি ১ কী-এর অধীনে ফলাফলটি ক্যাশ করে রাখে।
add(1, 9); // ৩ রিটার্ন করে। এটি ভুল। এটি ১০ হওয়া উচিত ছিল।
Lodash আবার ১ দেখে। এটি ক্যাশে ১ খুঁজে পায়। এটি পুরনো ফলাফলটিই রিটার্ন করে। এটি কখনোই ৯-এর দিকে তাকায় না।
কারেন্সি ফরম্যাটিং (Currency formatting) একটি সাধারণ ফাঁদ।
const formatPrice = memoize((amount, currency) =>
new Intl.NumberFormat('en', { style: 'currency', currency }).format(amount)
);
formatPrice(100, 'USD'); // "$100.00" রিটার্ন করে। কী (key) হলো ১০০।
formatPrice(100, 'EUR'); // "$100.00" রিটার্ন করে। এটি ভুল।
দ্বিতীয় কলটি 'EUR'-কে উপেক্ষা করে। এটি ক্যাশে ১০০ দেখে এবং ইউরোর পরিবর্তে ডলার রিটার্ন করে। এখানে কোনো এরর (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) এবং একই ইনপুট দিয়ে বারবার চালানো হয়। সাধারণ ফাংশনের ক্ষেত্রে সরাসরি কল করুন। আপনি যে গতিটুকু অর্জন করবেন, তার চেয়ে বাগ হওয়ার ঝুঁকি অনেক বেশি হতে পারে।
মূল বিষয়গুলো (Key takeaways):
- ডিফল্ট কী শুধুমাত্র প্রথম আর্গুমেন্ট ব্যবহার করে।
- কী-তে সব আর্গুমেন্ট অন্তর্ভুক্ত করতে একটি রিজলভার (resolver) ব্যবহার করুন।
- একটি ভালো কী আউটপুট পরিবর্তন করে এমন সবকিছুকে প্রতিফলিত করে।
- সাধারণ বা কম রিসোর্স খরচকারী ফাংশনের জন্য memoize ব্যবহার করবেন না।
Source: https://dev.to/figsify/beware-of-lodashmemoize-it-only-remembers-the-first-argument-4cjl