lodash.memoize سے ہوشیار رہیں۔

Lodash memoize مفت کارکردگی (performance) معلوم ہوتا ہے۔ آپ ایک فنکشن کو لپیٹتے (wrap) ہیں اور آپ کو ایک کیش (cache) مل جاتا ہے۔

لیکن اس کے ڈیفالٹ رویے میں ایک جال ہے۔ یہ کیش کی (cache key) صرف پہلے آرگومنٹ سے بناتا ہے۔ یہ باقی تمام آرگومنٹ کو نظر انداز کر دیتا ہے۔

اگر آپ ایک آرگومنٹ استعمال کرتے ہیں، تو آپ محفوظ ہیں۔ اگر آپ دو یا اس سے زیادہ استعمال کرتے ہیں، تو آپ بگ (bug) پیدا کر رہے ہیں۔

اس مثال کو دیکھیں:

const add = memoize((a, b) => a + b);

add(1, 2); // 3 واپس کرتا ہے۔ یہ نتیجے کو کی (key) 1 کے تحت کیش کرتا ہے۔ add(1, 9); // 3 واپس کرتا ہے۔ یہ غلط ہے۔ اسے 10 ہونا چاہیے تھا۔

Lodash دوبارہ 1 دیکھتا ہے۔ اسے کیش میں 1 مل جاتا ہے۔ یہ پرانا نتیجہ واپس کر دیتا ہے۔ یہ 9 کو کبھی دیکھتا ہی نہیں۔

کرنسی فارمیٹنگ ایک عام جال ہے۔

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) کی تعریف کرنے کے لیے دوسرا آرگومنٹ فراہم کرنا ہوگا۔ اس کی (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) ہو اور اکثر ایک ہی ان پٹس کے ساتھ چلتا ہو۔ سادہ فنکشنز کے لیے، انہیں بس کال کریں۔ بگ کا خطرہ اکثر اس رفتار سے زیادہ ہوتا ہے جو آپ حاصل کرتے ہیں۔

اہم نکات:

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