0Pricing
Scala for Backend Engineering & Functional Programming · درس

المطابقة الشاملة

اكتمال يتحقق منه المصرّف

المطابقة الشاملة درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ما هي المطابقة الشاملة؟

تكون match شاملة عندما تعالج كل قيمة ممكنة من النوع الذي تجري مطابقته.

وبالنسبة إلى trait مغلقة، يعرف المترجم جميع البدائل ويمكنه التحقق من أن match تغطيها كلها.

مطابقة مكتملة

عند معالجة كل بديلة من trait مغلقة، يكون المترجم راضيًا ولا يظهر أي تحذير.

sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
  def name(c: Color): String = c match {
    case Red   => "red"
    case Green => "green"
    case Blue  => "blue"
  }
  def main(args: Array[String]): Unit = {
    println(name(Blue))
  }
}

المترجم يحميكم

إذا أغفلتم إحدى البدائل، يُصدر المترجم تحذير non-exhaustive match أثناء الترجمة.

وهذا بمثابة شبكة أمان؛ إذ تكتشفون الفجوة قبل تشغيل البرنامج.

إضافة بديلة لاحقًا

تظهر الفائدة الحقيقية عند إضافة بديلة جديدة. فكل match غير شاملة في قاعدة الشيفرة ستصدر تحذيرًا، لتذكّركم بمعالجة الحالة الجديدة.

وهذا يجعل إعادة الهيكلة آمنة وقابلة للتوقع.

لماذا نتجنب wildcard؟

تؤدي إضافة case _ => إلى إسكات تحذيرات الشمولية. وقد يخفي ذلك الأخطاء عند إضافة بدائل لاحقًا.

في ADTs المغلقة، يُفضّل إدراج كل بديلة صراحةً حتى يواصل المترجم حمايتكم.

sealed trait Status
case object Active extends Status
case object Inactive extends Status
object Main {
  def label(s: Status): String = s match {
    case Active   => "on"
    case Inactive => "off"
  }
  def main(args: Array[String]): Unit = {
    println(label(Active))
  }
}

الشمولية مع البيانات

تنطبق الشمولية أيضًا على البدائل التي تحمل بيانات. تربطون الحقول، ومع ذلك يجب أن تغطوا كل بديلة.

sealed trait Shape
case class Circle(r: Double) extends Shape
case class Square(s: Double) extends Shape
object Main {
  def area(sh: Shape): Double = sh match {
    case Circle(r) => 3.14159 * r * r
    case Square(s) => s * s
  }
  def main(args: Array[String]): Unit = {
    println(area(Circle(2)))
    println(area(Square(3)))
  }
}

الدمج مع الحراس

انتبهوا: قد تجعل الحراس المطابقة غير شاملة، لأن المترجم لا يستطيع إثبات أن الحراس تغطي جميع القيم.

قدّموا حالة نهائية بلا حارس للبديلة نفسها للحفاظ على الشمولية.

sealed trait Temp
case class Celsius(v: Int) extends Temp
object Main {
  def feel(t: Temp): String = t match {
    case Celsius(v) if v >= 30 => "hot"
    case Celsius(v)            => "not hot"
  }
  def main(args: Array[String]): Unit = {
    println(feel(Celsius(35)))
    println(feel(Celsius(10)))
  }
}

الشمولية مع Option

إن Option في المكتبة القياسية هو ADT مغلق يضم Some وNone. وتجعل مطابقة كليهما المطابقة شاملة.

object Main {
  def show(o: Option[Int]): String = o match {
    case Some(v) => s"value $v"
    case None    => "nothing"
  }
  def main(args: Array[String]): Unit = {
    println(show(Some(7)))
    println(show(None))
  }
}

الشمولية المتداخلة

تساعد الشمولية أيضًا مع ADTs المتداخلة. إذ يستدل المترجم على كل مستوى تقومون بتفكيكه.

sealed trait Tree
case object Leaf extends Tree
case class Node(v: Int, l: Tree, r: Tree) extends Tree
object Main {
  def depth(t: Tree): Int = t match {
    case Leaf          => 0
    case Node(_, l, r) => 1 + math.max(depth(l), depth(r))
  }
  def main(args: Array[String]): Unit = {
    println(depth(Node(1, Leaf, Node(2, Leaf, Leaf))))
  }
}

لماذا يهم ذلك؟

يمنحكم التحقق من الشمولية بواسطة المترجم ما يلي:

  • الثقة بأن كل حالة قد عولجت
  • تذكيرات تلقائية عند نمو ADT
  • أخطاء MatchError أقل أثناء التشغيل
  • إعادة هيكلة واسعة النطاق أكثر أمانًا

جمع العناصر معًا

ADT مغلقة مع تغطية كاملة. وستؤدي إضافة بديلة جديدة هنا إلى تشغيل تحذير من المترجم.

sealed trait Command
case object Start extends Command
case object Stop extends Command
case class SetSpeed(v: Int) extends Command
object Main {
  def run(c: Command): String = c match {
    case Start       => "starting"
    case Stop        => "stopping"
    case SetSpeed(v) => s"speed $v"
  }
  def main(args: Array[String]): Unit = {
    List(Start, SetSpeed(5), Stop).foreach(c => println(run(c)))
  }
}

اختبار سريع

اختبروا فهمكم للمطابقة الشاملة.

مراجعة

تعلّمتم عن المطابقة الشاملة:

  • تكون match شاملة عندما تغطي كل بديلة
  • يتحقق المترجم من ذلك مع traits المغلقة ويحذّر من الفجوات
  • تُظهر إضافة بديلة كل match غير المكتملة
  • تجنبوا case _ مع ADTs المغلقة للحفاظ على هذه الحماية
  • قد تفسد الحراس الشمولية؛ فأضيفوا حالة بديلة بلا حارس

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

هل درس «المطابقة الشاملة» مجاني؟

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

ماذا ستتعلم في «المطابقة الشاملة»؟

اكتمال يتحقق منه المصرّف تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «المطابقة الشاملة»؟

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

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

  1. Case Classes
  2. Traits مختومة
  3. أنواع البيانات الجبرية
  4. المطابقة الشاملة
← العودة إلى Scala for Backend Engineering & Functional Programming