بناء 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التطبيق الجزئي
- تحويل الدوال إلى دوال متسلسلة
- تركيب الدوال
- بناء pipe وcompose