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

اشتقاق Type Class

Instances تلقائية

اشتقاق Type Class درس مجاني في 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 دروس في المجموع.

ما الاشتقاق؟

ينشئ اشتقاق فئة الأنواع المثيلات تلقائيًا من بنية النوع، فلا تضطرون إلى كتابة الشيفرة المتكررة يدويًا لكل فئة حالة. ويبني المصرّف المثيل من حقولها.

مشكلة الشيفرة المتكررة

من دون الاشتقاق، تحتاج كل فئة حالة جديدة إلى مثيل يدوي. فإذا استخدمتم Show مع عشرين فئة حالة، فستحتاجون إلى عشرين تعريفًا متشابهًا تقريبًا. يزيل الاشتقاق هذا التكرار.

التركيب اليدوي أولًا

قبل الاشتقاق التلقائي، لاحظوا أنه يمكنكم تركيب المثيلات يدويًا من مثيلات الحقول. وهذا هو المبدأ الذي يؤتمته الاشتقاق.

trait Show[A] { def show(a: A): String }

case class User(name: String, age: Int)

object Main {
  implicit val strShow: Show[String] = s => s
  implicit val intShow: Show[Int] = _.toString

  implicit val userShow: Show[User] = (u: User) =>
    s"User(${strShow.show(u.name)}, ${intShow.show(u.age)})"

  def main(args: Array[String]): Unit = {
    println(userShow.show(User("Ann", 30)))
  }
}

المثيلات الاستقرائية

يعمل الاشتقاق استقرائيًا: عرّفوا مثيلات للأنواع البدائية، ثم ادمجوها للأنواع المركبة (فئات الحالة) والأنواع التجميعية (السمات المختومة). ويُبنى المثيل المشتق من أجزائه.

الكلمة المفتاحية derives في Scala 3

تدعم Scala 3 جملة derives. ويمكن إرفاق فئة أنواع تحتوي على أسلوب derived بنوع باستخدام كلمة مفتاحية واحدة. (هذا مقطع مفاهيمي؛ ويتطلب فئة أنواع قابلة للاشتقاق.)

enum Color derives CanEqual:
  case Red, Green, Blue

@main def run(): Unit =
  println(Color.Red == Color.Red)

الاشتقاق القائم على Mirror

يستخدم الاشتقاق في Scala 3 النوع scala.deriving.Mirror، الذي يكشف بنية النوع (أنواع الحقول وأسمائها) أثناء الترجمة. وتطوي الدالة derived مثيلات عناصر المرآة لبناء النوع الكامل.

الاشتقاق شبه التلقائي

تقدم مكتبات مثل Cats اشتقاقًا شبه تلقائي: تختار تفعيله لكل نوع باستخدام سطر واحد مثل deriveShow، مما يجعل أزمنة الترجمة قابلة للتنبؤ ويزيل الشيفرة النمطية.

التلقائي مقابل شبه التلقائي

هناك أسلوبان:

  • التلقائي: تظهر المثيلات حيثما تدعو الحاجة إليها عبر استيراد ضمني؛ وهذا مريح، لكنه قد يبطئ الترجمة.
  • شبه التلقائي: تكتب استدعاء اشتقاق صريحًا واحدًا لكل نوع؛ وهذا يمنحك تحكمًا أكبر ويؤدي إلى عمليات بناء أسرع.

الاشتقاق للسمات المختومة

في تسلسل هرمي مختوم (نوع مجموع)، يحدد المثيل المشتق نوع النوع الفرعي الذي تنتمي إليه القيمة. يوضح هنا إصدار يدوي الفكرة التي يعمل الاشتقاق على أتمتتها.

trait Show[A] { def show(a: A): String }

sealed trait Shape
case class Circle(r: Int) extends Shape
case class Square(s: Int) extends Shape

object Main {
  implicit val shapeShow: Show[Shape] = {
    case Circle(r) => s"Circle($r)"
    case Square(s) => s"Square($s)"
  }

  def main(args: Array[String]): Unit = {
    println(shapeShow.show(Circle(5)))
    println(shapeShow.show(Square(3)))
  }
}

متى تستخدم الاشتقاق

استخدم الاشتقاق عندما:

  • لديك أنواع بيانات كثيرة تحتاج إلى فئة النوع نفسها (برامج ترميز JSON وShow وEq).
  • يكون المثيل ناتجًا بصورة آلية من البنية.

اكتب المثيلات يدويًا عندما يكون السلوك مخصصًا أو حاسمًا من ناحية الأداء.

مثال عام على المساواة

المساواة مثال كلاسيكي على فئة نوع قابلة للاشتقاق. إن العامل القياسي == في الفئات الحالة هو بحد ذاته نوع من المساواة البنيوية التي ينشئها المترجم نيابةً عنك.

case class Coord(x: Int, y: Int)

object Main {
  def main(args: Array[String]): Unit = {
    println(Coord(1, 2) == Coord(1, 2))
    println(Coord(1, 2) == Coord(3, 4))
  }
}

تحقق سريع

اختبر مدى فهمك للاشتقاق.

مراجعة

لقد تعلمت اشتقاق فئات الأنواع:

  • تُبنى المثيلات استقرائيًا من مثيلات الحقول أو الحالات.
  • يستخدم Scala 3 النوع Mirror والكلمة المفتاحية derives.
  • اختر التلقائي للراحة، وشبه التلقائي للتحكم.
  • استخدمه للتخلص من الشيفرة النمطية عبر أنواع بيانات كثيرة.

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

هل درس «اشتقاق Type Class» مجاني؟

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

ماذا ستتعلم في «اشتقاق Type Class»؟

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

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

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

كم من الوقت يستغرق درس «اشتقاق Type Class»؟

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

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

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

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

  1. نمط Type Class
  2. تعريف Instances
  3. Type Classes الشائعة
  4. اشتقاق Type Class
← العودة إلى Scala for Backend Engineering & Functional Programming