0Pricing
JavaScript Academy · درس

بناء pipe وcompose

نفّذوا التركيب من اليسار إلى اليمين ومن اليمين إلى اليسار.

بناء pipe وcompose درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

من دالتين إلى دوال متعددة

تُعد compose ذات الوسيطين محدودة. إذ إن خطوط الأنابيب الحقيقية تسلسل خطوات عديدة. في هذا الدرس ستبني دالتي compose وpipe عامتين باستخدام reduce وreduceRight.

pipe: من اليسار إلى اليمين

تُقرأ pipe بترتيب التنفيذ: تُنفَّذ الدالة الأولى أولًا. وتساوي pipe(a, b, c)(x) القيمة c(b(a(x))). ويجد معظم الأشخاص هذا الترتيب أكثر طبيعية من compose.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const inc = n => n + 1;
const double = n => n * 2;

console.log(pipe(inc, double)(5));

كيف تُحرّك reduce الدالة pipe

تبدأ reduce بقيمة الإدخال بوصفها المجمِّع، ثم تطبّق كل دالة بالتتابع، فتمرّر كل ناتج إلى الدالة التالية. وتُمهّد القيمة الابتدائية x لهذه السلسلة.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const steps = pipe(
  n => n + 1,
  n => n * 3,
  n => n - 2
);

console.log(steps(4));

compose باستخدام reduceRight

إن compose هي pipe معكوسة. ويؤدي استخدام reduceRight إلى المرور عبر قائمة الدوال من نهايتها، لذلك تُنفَّذ الدالة الموجودة في أقصى اليمين أولًا، بما يتوافق مع f(g(x)).

const compose = (...fns) => x => fns.reduceRight((acc, fn) => fn(acc), x);

const inc = n => n + 1;
const double = n => n * 2;

console.log(compose(inc, double)(5));

pipe وcompose صورتان متعاكستان

تنتج قائمة الدوال نفسها نتائج مختلفة مع pipe وcompose لأن اتجاه التنفيذ ينعكس. اختر بينهما وفق الطريقة التي تريد قراءة الخطوات بها.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);
const compose = (...fns) => x => fns.reduceRight((acc, fn) => fn(acc), x);

const inc = n => n + 1;
const square = n => n * n;

console.log(pipe(inc, square)(3));
console.log(compose(inc, square)(3));

compose بوصفها pipe معكوسة

يمكنك تعريف compose بدلالة pipe من خلال عكس قائمة الدوال. وهذا يوضح مدى التقارب بينهما.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);
const compose = (...fns) => pipe(...fns.reverse());

const inc = n => n + 1;
const double = n => n * 2;

console.log(compose(inc, double)(5));

خط أنابيب نصي حقيقي

أنشئ مولّدًا للمعرّفات النصية من دوال نصية صغيرة باستخدام pipe. تنفّذ كل خطوة مهمة واحدة، ومن السهل اختبارها بمفردها.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const slugify = pipe(
  s => s.trim(),
  s => s.toLowerCase(),
  s => s.replace(/\s+/g, '-')
);

console.log(slugify('  Hello World Example  '));

تركيب عمليات المصفوفات

تعمل خطوط الأنابيب مع أي نوع من البيانات، بما في ذلك المصفوفات. اجمع التصفية والتحويل إلى مصفوفة في تحويل واحد مُسمّى.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const process = pipe(
  arr => arr.filter(n => n % 2 === 0),
  arr => arr.map(n => n * 10)
);

console.log(process([1, 2, 3, 4, 5, 6]));

حالة الحافة الخاصة بالهوية

يُعيد استدعاء pipe() من دون دوال الإدخالَ دون تغيير، لأن reduce يعيد قيمة البدء فحسب. ويجعل سلوك الهوية هذا المساعدين آمنين عند استدعائهما من دون خطوات.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const identity = pipe();
console.log(identity(42));
console.log(identity('unchanged'));

الدمج مع Currying

تندمج الدوال المطبَّقة بأسلوب Currying، وكذلك الدوال المطبَّق عليها بعض الوسائط، مباشرةً في خطوط الأنابيب. وتصبح كل واحدة منها خطوة واضحة ذات وسيط واحد.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);
const add = a => b => a + b;
const times = a => b => a * b;

const calc = pipe(add(3), times(2), add(-1));
console.log(calc(5));

اختيار pipe أو compose

استخدم pipe عندما تريد قراءة الخطوات من الأعلى إلى الأسفل بترتيب التنفيذ. واستخدم compose عند مطابقة الصيغة الرياضية f(g(x)). فكلاهما غلاف من سطر واحد حول reduce، وكلاهما شائع في المكتبات الوظيفية.

const pipe = (...fns) => x => fns.reduce((acc, fn) => fn(acc), x);

const normalize = pipe(
  s => s.trim(),
  s => s.replace(/[^a-z0-9]+/gi, ' '),
  s => s.toUpperCase()
);

console.log(normalize('  a-b_c!d  '));

اختبار سريع

ما أسلوب المصفوفات الذي يجعل compose تنفّذ الدوال من اليمين إلى اليسار؟

مراجعة: pipe وcompose

لقد بنيت مساعدَي تركيب عامين:

  • تستخدم pipe الدالة reduce للتنفيذ من اليسار إلى اليمين.
  • تستخدم compose الدالة reduceRight للتنفيذ من اليمين إلى اليسار.
  • يمكن تعريف compose باعتبارها pipe مع قائمة معكوسة.
  • تتصرف خطوط الأنابيب الفارغة كهوية، وتندمج خطوات Currying بسهولة.

الأسئلة الشائعة

هل درس «بناء pipe وcompose» مجاني؟

نعم — نص درس «بناء pipe وcompose» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء pipe وcompose»؟

نفّذوا التركيب من اليسار إلى اليمين ومن اليمين إلى اليسار. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «بناء pipe وcompose»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التطبيق الجزئي
  2. تحويل الدوال إلى دوال متسلسلة
  3. تركيب الدوال
  4. بناء pipe وcompose
← العودة إلى JavaScript Academy