0Pricing
TypeScript Academy · درس

البرمجة الموجّهة بالمسار

سلسلوا العمليات التي قد تفشل من دون try/catch

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

استعارة السكك الحديدية

تصوّر البرمجة الموجّهة بالسكك الحديدية العملية الحسابية على مسارين متوازيين: مسار النجاح ومسار الفشل. وما إن تنتقل إلى مسار الفشل حتى تبقى فيه وتتجاوز بقية الخطوات.

تسلسل دوال Result

تأخذ كل خطوة قيمةً وتُعيد Result. ونريد وصل الخطوات بحيث يوقف أول فشل السلسلة، ثم ينتقل حتى نهايتها.

type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });

map: تحويل قيمة النجاح

تطبّق map دالةً عادية على القيمة عندما يكون Result ناجحاً، وتمرّر حالات الفشل دون تغيير. وبذلك تبقى على مسار النجاح.

function map<T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E> {
  return r.ok ? ok(f(r.value)) : r;
}
console.log(map(ok(2), n => n + 1)); // { ok: true, value: 3 }

flatMap: تسلسل الخطوات القابلة للفشل

عندما تُعيد الخطوة التالية نفسها قيمة Result، استخدم flatMap، الذي يُسمّى أيضاً andThen. فهو يتجنب تداخل قيم Result ويوقف السلسلة عند الفشل.

function flatMap<T, U, E>(r: Result<T, E>, f: (t: T) => Result<U, E>): Result<U, E> {
  return r.ok ? f(r.value) : r;
}

لماذا flatMap وليس map

لو استخدمت map مع دالة تُعيد Result، فستحصل على Result<Result<U,E>,E>. أما flatMap فيسطّح ذلك التداخل بمستوى واحد، ويحافظ على Result واحد.

الإيقاف عند أول خطأ

ما إن تُعيد إحدى الخطوات err حتى تمرّرها كل عمليات flatMap اللاحقة دون تغيير. ولا تُنفّذ الخطوات المتبقية، تماماً كما يحدث عند الانتقال إلى مسار الفشل.

const start = err("boom") as Result<number, string>;
const out = flatMap(start, n => ok(n + 1));
console.log(out); // { ok: false, error: "boom" }

إنشاء مسار معالجة

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

function parseNum(s: string): Result<number, string> {
  const n = Number(s);
  return Number.isNaN(n) ? err("not a number") : ok(n);
}
function positive(n: number): Result<number, string> {
  return n > 0 ? ok(n) : err("must be positive");
}

تشغيل مسار المعالجة

يمرّر تسلسل flatMap القيمة عبر كل خطوة قابلة للفشل. ويوقف أي فشل في أي موضع السلسلة، ويُظهر ذلك الخطأ.

const good = flatMap(parseNum("5"), positive);
console.log(good); // { ok: true, value: 5 }
const bad = flatMap(parseNum("-3"), positive);
console.log(bad); // { ok: false, error: "must be positive" }

الجمع بين map وflatMap

استخدم flatMap للخطوات التي قد تفشل، وmap للتحويلات الخالصة. ويحافظ استخدامهما معاً على خط النجاح مستقيماً، ويجعل معالجة الأخطاء تلقائية.

const result = map(flatMap(parseNum("10"), positive), n => n * 2);
console.log(result); // { ok: true, value: 20 }

لا حاجة إلى try/catch

يعبّر المسار بأكمله عن النجاح والفشل من خلال القيم. ولا توجد حاجة إلى try/catch، كما يجعل نوع كل خطوة مسار الخطأ صريحاً ولا يمكن تجاهله.

لماذا يتسع نطاقه

تحافظ الشفرة الموجّهة بالسكك الحديدية على سهولة قراءة مسارات العمل المعقدة: فكل خطوة صغيرة وخالصة، وتنتقل الأخطاء تلقائياً، وإضافة خطوة لا تزيد تعقيد معالجة الأخطاء الحالية.

مراجعة سريعة

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

مراجعة

تصل البرمجة الموجّهة بالسكك الحديدية الخطوات التي تُعيد Result باستخدام map، لتحويل النجاح، وflatMap/andThen، لتسلسل الخطوات القابلة للفشل وتسطيح قيم Result المتداخلة. ويوقف أول err بقية الخطوات، وينقله حتى النهاية من دون try/catch.

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

هل درس «البرمجة الموجّهة بالمسار» مجاني؟

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

ماذا ستتعلم في «البرمجة الموجّهة بالمسار»؟

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

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

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

كم من الوقت يستغرق درس «البرمجة الموجّهة بالمسار»؟

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

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

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

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

  1. مشكلة طرح الأخطاء
  2. نمذجة أنواع Result
  3. أنواع Option وMaybe
  4. البرمجة الموجّهة بالمسار
← العودة إلى TypeScript Academy