ما هي الـ Immutability؟
Immutability هي أحد أهم المبادئ في Functional Programming.
وفكرتها ببساطة:
بدلًا من تعديل البيانات الأصلية، ننشئ بيانات جديدة تحتوي على التعديلات.
هذا يجعل البرنامج أكثر قابلية للتوقع، ويقلل من الأخطاء الناتجة عن تغيير البيانات في أماكن مختلفة من البرنامج.
مثال مع القيم البسيطة
إذا كان لدينا متغير:
let age = 18;فيمكننا تغيير قيمته بسهولة:
age = 20;ولا توجد مشكلة كبيرة هنا، لأن القيمة عبارة عن رقم بسيط.
ماذا عن الكائنات؟
لننشئ كائنًا:
let user = { name: "Mohamed",};على عكس Array التي تخزن مجموعة من القيم، فإن Object يخزن البيانات على شكل مفتاح (Key) وقيمة (Value).
في هذا المثال:
- المفتاح هو
name. - والقيمة هي
"Mohamed".
هل يمكننا استبدال الكائن؟
قد نكتب:
let user = { name: "Mohamed",};
user = { name: "John",};هذا الكود صحيح من ناحية JavaScript، لكنه لا يحقق مبدأ Immutability.
لماذا؟
لأننا استبدلنا الكائن بالكامل، وبالتالي فقدنا النسخة الأصلية.
في البرامج الكبيرة قد تعتمد أجزاء أخرى من التطبيق على هذه البيانات، وتغييرها مباشرة قد يؤدي إلى سلوك غير متوقع.
الطريقة الصحيحة في Functional Programming
بدلًا من تعديل الكائن الأصلي، ننشئ كائنًا جديدًا يحتوي على التعديلات، مع الاحتفاظ بالأصل كما هو.
في JavaScript يتم ذلك غالبًا باستخدام Spread Operator.
let user = { name: "Mohamed",};
const updatedUser = { ...user, name: "John",};الآن أصبح لدينا:
userما زال يحتوي على"Mohamed".updatedUserيحتوي على"John".
وبذلك حافظنا على البيانات الأصلية.
ملاحظة: قد ترى أحيانًا الكود التالي:
user.name = "John";هذا يُعد تعديلًا مباشرًا (Mutation) للكائن، وليس تطبيقًا لمبدأ Immutability، لأنه يغير البيانات الأصلية بدلًا من إنشاء نسخة جديدة.
ماذا يجب أن تتذكر؟
- Immutability تعني عدم تعديل البيانات الأصلية.
- في البرمجة الوظيفية نُفضل إنشاء نسخة جديدة بدلًا من تغيير الكائن الحالي.
- تغيير خاصية داخل الكائن مثل
user.name = "John"يُسمى Mutation. - إنشاء كائن جديد مع الاحتفاظ بالأصل يجعل الكود أكثر أمانًا وأسهل في التتبع.