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

المنشئات الذكية

إنشاء مع التحقق

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

الإنشاء الذي يتحقق من الصحة

المنشئ الذكي هو مصنع يتحقق من المدخلات قبل إنتاج قيمة. ويضمن أن يحقق أي مثيل تملكه ثوابت النوع.

  • يكون المُنشئ الخام مخفيًا.
  • لا يكون الإنشاء المتحقق من صحته إلا متاحًا للعامة.
class Age private (val value: Int)
object Age:
  def of(v: Int): Option[Age] =
    if v >= 0 then Some(new Age(v)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Age.of(30).map(_.value))

المُنشئ الخاص

يمنع وضع علامة private على المُنشئ الأساسي المستدعين من تجاوز التحقق. ويصبح الكائن المرافق نقطة الدخول الوحيدة.

class Percentage private (val value: Int)
object Percentage:
  def of(v: Int): Option[Percentage] =
    if v >= 0 && v <= 100 then Some(new Percentage(v)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Percentage.of(50).map(_.value))
    println(Percentage.of(150))

إرجاع Option

يشير إرجاع Option إلى أن الإنشاء قد يفشل. ويجب على المستدعي التعامل مع None، لذلك لا تتدفق البيانات غير الصالحة بصمت.

class NonEmpty private (val value: String)
object NonEmpty:
  def of(s: String): Option[NonEmpty] =
    if s.nonEmpty then Some(new NonEmpty(s)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(NonEmpty.of("").map(_.value))
    println(NonEmpty.of("hi").map(_.value))

إرجاع Either لتفاصيل الخطأ

عندما تريد توضيح سبب فشل التحقق، أرجع Either[Error, T]. ويحمل Left رسالة وصفية.

class Username private (val value: String)
object Username:
  def of(s: String): Either[String, Username] =
    if s.isEmpty then Left("empty")
    else if s.length > 10 then Left("too long")
    else Right(new Username(s))

object Main:
  def main(args: Array[String]): Unit =
    println(Username.of(""))
    println(Username.of("ada").map(_.value))

المنشئات الذكية مع case class

تظل case class ذات المُنشئ الخاص صالحة للاستخدام. لاحظ أنه يجب أيضًا التحكم في apply وcopy اللذين يتم إنشاؤهما تلقائيًا، لذا عرّف مصنعًا مخصصًا وأبقِ المُنشئ خاصًا.

case class Email private (value: String)
object Email:
  def of(s: String): Option[Email] =
    if s.contains("@") then Some(Email(s)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Email.of("a@b.com"))
    println(Email.of("bad"))

تسلسل القيم المتحقق من صحتها

بما أن المنشئات الذكية تُرجع Option أو Either، يمكنك تركيبها باستخدام تعبيرات for لإنشاء كائنات أكبر تم التحقق من صحتها.

case class Name private (value: String)
object Name:
  def of(s: String): Option[Name] =
    if s.nonEmpty then Some(Name(s)) else None

case class Person(name: Name, age: Int)

object Main:
  def make(n: String): Option[Person] =
    for nm <- Name.of(n) yield Person(nm, 20)

  def main(args: Array[String]): Unit =
    println(Main.make("Bob"))

توحيد المدخلات

يمكن للمنشئ الذكي أيضًا توحيد البيانات، مثل إزالة المسافات البيضاء أو تحويل الأحرف إلى صغيرة، بحيث تشترك جميع المثيلات في صيغة معيارية.

case class Tag private (value: String)
object Tag:
  def of(s: String): Option[Tag] =
    val clean = s.trim.toLowerCase
    if clean.nonEmpty then Some(Tag(clean)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Tag.of("  Scala  "))

تظل الثوابت صحيحة دائمًا

بمجرد اجتياز القيمة للمنشئ الذكي، يُضمن ثباتها طوال فترة حياتها. ويمكن للكود اللاحق الوثوق بالقيمة دون إعادة التحقق.

case class PositiveInt private (value: Int)
object PositiveInt:
  def of(n: Int): Option[PositiveInt] =
    if n > 0 then Some(PositiveInt(n)) else None

object Main:
  def doubleIt(p: PositiveInt): Int = p.value * 2 // always positive

  def main(args: Array[String]): Unit =
    PositiveInt.of(5).foreach(p => println(Main.doubleIt(p)))

الدمج مع الأنواع المعتمة

للحصول على قيم متحقق من صحتها دون كلفة، اجمع بين منشئ ذكي ونوع معتم. فلا يُخصص كائن غلاف، ومع ذلك يظل التحقق شرطًا للإنشاء.

object Domain:
  opaque type Score = Int
  def of(n: Int): Option[Score] =
    if n >= 0 && n <= 100 then Some(n) else None
  extension (s: Score) def value: Int = s

object Main:
  def main(args: Array[String]): Unit =
    println(Domain.of(88).map(_.value))

قواعد تحقق متعددة

طبّق عدة فحوص بالتتابع. وتتوقف العملية عند أول قاعدة تفشل، مع إرجاع خطأ واضح.

object Password:
  def of(s: String): Either[String, String] =
    if s.length < 8 then Left("too short")
    else if !s.exists(_.isDigit) then Left("need a digit")
    else Right(s)

object Main:
  def main(args: Array[String]): Unit =
    println(Password.of("abc"))
    println(Password.of("abcdef12"))

متى تستخدم المنشئات الذكية

استخدمها كلما كان للنوع ثوابت قد ينتهكها الإنشاء الخام.

  • الأعداد المحصورة، والسلاسل غير الفارغة، والمعرّفات المنسقة.
  • أرجع Option للحالات البسيطة بنعم أو لا، وEither لتوضيح الأسباب.
  • أبقِ المُنشئ الخام خاصًا.
case class Port private (value: Int)
object Port:
  def of(n: Int): Option[Port] =
    if n >= 1 && n <= 65535 then Some(Port(n)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Port.of(8080))
    println(Port.of(70000))

اختبار سريع

اختبر مدى فهمك للمنشئات الذكية.

مراجعة

لقد تعلمت المنشئات الذكية.

  • تحقق من المدخلات في مصنع مرافق.
  • اجعل المُنشئ الخام خاصًا.
  • أرجع Option أو Either لفرض التعامل مع الفشل.
  • وحّد المدخلات اختياريًا إلى صيغة معيارية.
  • بعد ذلك تظل الثوابت صحيحة طوال فترة حياة القيمة.
case class Even private (value: Int)
object Even:
  def of(n: Int): Option[Even] =
    if n % 2 == 0 then Some(Even(n)) else None

object Main:
  def main(args: Array[String]): Unit =
    println(Even.of(4))
    println(Even.of(5))

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

هل درس «المنشئات الذكية» مجاني؟

نعم — نص درس «المنشئات الذكية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

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

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

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

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

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

  1. النمذجة باستخدام ADTs
  2. المنشئات الذكية
  3. الأنواع الجديدة
  4. تركيب المجالات
← العودة إلى Scala for Backend Engineering & Functional Programming