الدوال النقية وعدم القابلية للتغيير
اكتبوا دوال يمكن التنبؤ بها من دون آثار جانبية
الدوال النقية وعدم القابلية للتغيير درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ما الدالة النقية؟
تعيد الدالة النقية الناتج نفسه للمدخل نفسه، ولا تملك آثارًا جانبية. فهي لا تقرأ الحالة الخارجية أو تكتب فيها، ولا تغيّر وسيطاتها، ولا تنفذ عمليات إدخال وإخراج.
مثال نقي
تعتمد هذه الدالة على وسائطها فقط، ولا تنتج إلا قيمة الإرجاع. ولا يغيّر استدعاؤها أي شيء خارجها.
function add(a: number, b: number): number {
return a + b;
}
console.log(add(2, 3)); // 5, alwaysمثال غير نقي
تقرأ هذه الدالة متغيرًا خارج نطاقها وتغيّره، ولذلك تعتمد نتيجتها على حالة مخفية وتترك أثرًا وراءها. وهذا ما يجعلها غير نقية.
let counter = 0;
function next(): number {
counter += 1; // side effect
return counter;
}
console.log(next(), next()); // 1 2, depends on historyالشفافية المرجعية
يتمتع الاستدعاء النقي بالشفافية المرجعية؛ إذ يمكنك استبدال الاستدعاء بنتيجته من دون تغيير البرنامج. ويمكن استبدال add(2, 3) بـ 5 في أي مكان.
const x = add(2, 3) * 2;
const y = 5 * 2; // identical meaning
console.log(x === y); // trueلماذا تساعد النقاوة؟
يسهل اختبار الدوال النقية من دون إعداد، كما يسهل تخزين نتائجها مؤقتًا، ويكون تشغيلها بالتوازي آمنًا، ويسهل فهمها لأنها لا تملك تبعيات مخفية.
تجنب تغيير الوسائط
يُعد تغيير مصفوفة أو كائن مُدخل أثرًا جانبيًا قد لا يتوقعه المستدعي. أنشئ قيمة جديدة وأعدها بدلًا من ذلك.
// Impure: mutates input
function pushImpure(xs: number[], v: number) { xs.push(v); return xs; }
// Pure: returns a new array
function pushPure(xs: number[], v: number): number[] { return [...xs, v]; }تحديثات غير قابلة للتغيير باستخدام Spread
ينسخ معامل Spread كائنًا أو مصفوفة، مما يتيح لك تجاوز الحقول من دون لمس النسخة الأصلية. وهو الأداة الأساسية للتحديثات غير القابلة للتغيير في TS.
interface User { name: string; age: number }
function birthday(u: User): User {
return { ...u, age: u.age + 1 };
}
const before = { name: "Ada", age: 30 };
const after = birthday(before);
console.log(before.age, after.age); // 30 31تحديث المصفوفات دون تغييرها
استخدم map وfilter وSpread لاشتقاق مصفوفات جديدة بدلًا من التغيير. وتبقى المصفوفة الأصلية سليمة ليعتمد عليها باقي الكود.
const nums = [1, 2, 3];
const doubled = nums.map(n => n * 2);
console.log(nums, doubled); // [1,2,3] [2,4,6]استخدام readonly للأمان
يخبر تحديد الوسائط باستخدام readonly المترجمَ والقراءَ بأن الدالة لن تغيّرها، مما يعزز النقاوة على مستوى النوع.
function sum(xs: readonly number[]): number {
return xs.reduce((a, b) => a + b, 0);
}
console.log(sum([1, 2, 3])); // 6دفع الآثار إلى الأطراف
تحتاج البرامج الفعلية إلى آثار مثل التسجيل والشبكة. ويحافظ الأسلوب الوظيفي على نقاوة النواة ويعزل الآثار عند الحدود، فتظل معظم التعليمات البرمجية قابلة للتنبؤ.
قائمة فحص ذهنية
اسأل عن كل دالة: هل تعتمد على مدخلاتها فقط؟ هل تعيد قيمةً فقط؟ هل تترك المدخلات والعالم الخارجي من دون تغيير؟ إذا كانت الإجابة نعم عن الأسئلة الثلاثة، فهي نقية.
فحص سريع
فحص سريع لهذا الدرس.
مراجعة
تعتمد الدوال النقية على المدخلات فقط ولا تنتج آثارًا جانبية، مما يمنحها شفافية مرجعية. استخدم Spread وmap/filter وreadonly للتحديثات غير القابلة للتغيير، وادفع الآثار الواقعية إلى أطراف البرنامج.
الأسئلة الشائعة
هل درس «الدوال النقية وعدم القابلية للتغيير» مجاني؟
نعم — نص درس «الدوال النقية وعدم القابلية للتغيير» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدوال النقية وعدم القابلية للتغيير»؟
اكتبوا دوال يمكن التنبؤ بها من دون آثار جانبية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدوال النقية وعدم القابلية للتغيير»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال النقية وعدم القابلية للتغيير
- التعميم والتطبيق الجزئي
- تركيب الدوال مع الأنواع
- أدوات pipe وflow محددة الأنواع