تركيب المجالات
أنشئ نماذج أكبر
تركيب المجالات درس مجاني في 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 دروس في المجموع.
بناء نماذج أكبر
تتكوّن النطاقات الحقيقية من أجزاء أصغر. ويعني تركيب النطاقات دمج ADTs وnewtypes والقيم التي خضعت للتحقق والمصممة جيدًا في هياكل أكبر تظل صحيحة.
- تتركب الأنواع الصغيرة المركزة لتكوين أنواع أكبر.
- يحافظ كل جزء على ثوابته الخاصة.
case class Money(cents: Long)
case class Product(name: String, price: Money)
object Main:
def main(args: Array[String]): Unit =
println(Product("Book", Money(1999)))تداخل المنتجات
ركّب أنواع المنتجات من خلال تداخل case classes. يضيف كل مستوى بنية جديدة مع الحفاظ على سهولة القراءة.
case class Address(city: String, zip: String)
case class Customer(name: String, address: Address)
object Main:
def main(args: Array[String]): Unit =
val c = Customer("Ada", Address("London", "E1"))
println(c.address.city)التركيب باستخدام المجموعات
استخدم List وMap وSet لنمذجة العلاقات من واحد إلى متعدد داخل نطاقك.
case class Item(name: String, qty: Int)
case class Order(id: Int, items: List[Item])
object Main:
def main(args: Array[String]): Unit =
val order = Order(1, List(Item("pen", 2), Item("ink", 1)))
println(order.items.map(_.qty).sum)تركيب أنواع المجموعات
تجمع الخيارات الأكبر خيارات أصغر. ويمكن أن يحتوي أحد متغيرات enum نفسه على ADT آخر، وبذلك تتراكم القرارات.
enum Payment:
case Card(last4: String)
case Cash
enum Checkout:
case Completed(payment: Payment)
case Abandoned
object Main:
def main(args: Array[String]): Unit =
val c: Checkout = Checkout.Completed(Payment.Card("1234"))
println(c)دوال تركّب النطاقات
عمليات النطاق هي دوال نقية تحول أنواع الإدخال إلى أنواع الإخراج. ويساعد تركيبها على بناء مسارات عمل.
case class Cart(total: Long)
case class Receipt(total: Long, tax: Long)
object Main:
def checkout(c: Cart): Receipt =
Receipt(c.total, (c.total * 0.2).toLong)
def main(args: Array[String]): Unit =
println(checkout(Cart(1000)))تركيب عمليات التحقق
عندما يُنشأ كل حقل بواسطة smart constructor، ركّبها باستخدام تعبير for. لا يُنشأ الكائن بأكمله إلا إذا اجتاز كل جزء عملية التحقق.
object V:
def name(s: String): Option[String] = if s.nonEmpty then Some(s) else None
def age(n: Int): Option[Int] = if n >= 0 then Some(n) else None
case class Person(name: String, age: Int)
object Main:
def make(n: String, a: Int): Option[Person] =
for nm <- V.name(n); ag <- V.age(a) yield Person(nm, ag)
def main(args: Array[String]): Unit =
println(Main.make("Bob", 30))
println(Main.make("", 30))الطيّ على البيانات المركبة
جمّع الهياكل المركبة باستخدام fold، أو باستخدام map مع sum. ويوجّه شكل البيانات طريقة إجراء الحساب.
case class Line(price: Long, qty: Int)
case class Invoice(lines: List[Line])
object Main:
def total(inv: Invoice): Long =
inv.lines.foldLeft(0L)((acc, l) => acc + l.price * l.qty)
def main(args: Array[String]): Unit =
val inv = Invoice(List(Line(100, 2), Line(50, 4)))
println(total(inv))تحديث النماذج غير القابلة للتغيير
ركّب التغييرات باستخدام copy، الذي يعيد قيمة جديدة مع استبدال الحقول المحددة. وتبقى القيمة الأصلية دون تغيير.
case class Account(id: Int, balance: Long)
object Main:
def deposit(a: Account, amt: Long): Account =
a.copy(balance = a.balance + amt)
def main(args: Array[String]): Unit =
val a = Account(1, 100)
println(deposit(a, 50))نمذجة آلة حالات
ركّب أنواع المجموعات ودوال الانتقال لنمذجة آلة حالات لا تسمح إلا بالانتقالات القانونية.
enum Light:
case Red, Green, Yellow
object Main:
def next(l: Light): Light = l match
case Light.Red => Light.Green
case Light.Green => Light.Yellow
case Light.Yellow => Light.Red
def main(args: Array[String]): Unit =
println(next(Light.Red))
println(next(Light.Green))وضع النطاق والعمليات في طبقات
حافظ على نقاء أنواع البيانات، وضع السلوك في الدوال أو الأساليب. ويشكّل النموذج المركب مع مجموعة من التحويلات مكتبة نطاق صغيرة.
case class Temp(celsius: Double):
def toF: Double = celsius * 9 / 5 + 32
object Main:
def main(args: Array[String]): Unit =
val t = Temp(25.0)
println(t.toF)جمع كل الأجزاء
يجمع النموذج الكامل بين newtypes والمنتجات والمجموعات والمجموعات والعلاقات والتحقق عند الإنشاء. والنتيجة نموذج يصعب إساءة استخدامه ويسهل فهمه.
- أنشئ الأنواع الصغيرة أولًا.
- ركّبها في هياكل تجميعية.
- عبّر عن العمليات بوصفها دوالًا نقية.
case class Sku(value: String)
case class Line(sku: Sku, qty: Int)
case class Basket(lines: List[Line]):
def count: Int = lines.map(_.qty).sum
object Main:
def main(args: Array[String]): Unit =
val b = Basket(List(Line(Sku("A"), 2), Line(Sku("B"), 3)))
println(b.count)اختبار سريع
اختبر مدى فهمك لتركيب النطاقات.
مراجعة
تعلّمت كيفية تركيب النطاقات.
- تداخل المنتجات والمجموعات لنمذجة الهياكل الغنية.
- استخدم المجموعات للعلاقات من واحد إلى متعدد.
- ركّب عمليات التحقق باستخدام تعبيرات
for. - حدّث القيم بطريقة غير قابلة للتغيير باستخدام
copy. - حافظ على نقاء البيانات وعبّر عن العمليات بوصفها دوالًا.
case class User(id: Int, name: String)
case class Post(author: User, text: String)
object Main:
def main(args: Array[String]): Unit =
val p = Post(User(1, "Ada"), "hello")
println(p.copy(text = "hi"))الأسئلة الشائعة
هل درس «تركيب المجالات» مجاني؟
نعم — نص درس «تركيب المجالات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- النمذجة باستخدام ADTs
- المنشئات الذكية
- الأنواع الجديدة
- تركيب المجالات