تجنب null
أساسيات Option
تجنب null درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
مشكلة null
في لغات كثيرة، تُمثّل القيمة المفقودة باستخدام null. لكن null تؤدي إلى NullPointerException المخيفة عندما تنسون التحقق منها.
تقدّم Scala بديلًا أكثر أمانًا: النوع Option.
ما هو Option؟
يمثّل Option[A] قيمة قد تكون موجودة أو غير موجودة. وله حالتان بالضبط:
Some(value)عندما تكون القيمة موجودةNoneعندما لا توجد قيمة
يخبركم النوع نفسه بأن القيمة قد تكون مفقودة.
object Main {
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(42)
val absent: Option[Int] = None
println(present)
println(absent)
}
}إنشاء Some
غلّفوا قيمة موجودة داخل Some للإشارة إلى أنها موجودة بالتأكيد.
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("Ada")
println(name)
}
}تمثيل الغياب باستخدام None
إن None هي القيمة الوحيدة المستخدمة عندما لا يوجد شيء. وهي تعمل مع أي نوع من Option.
object Main {
def lookup(found: Boolean): Option[Int] =
if (found) Some(100) else None
def main(args: Array[String]): Unit = {
println(lookup(true))
println(lookup(false))
}
}الدوال التي قد تفشل
يجعل إرجاع Option احتمال عدم وجود نتيجة واضحًا في توقيع النوع. ولا يستطيع المستدعون تجاهل ذلك.
object Main {
def findUser(id: Int): Option[String] =
if (id == 1) Some("Grace") else None
def main(args: Array[String]): Unit = {
println(findUser(1))
println(findUser(2))
}
}التحقق باستخدام isDefined وisEmpty
تخبركم isDefined بما إذا كان Option من نوع Some، بينما تخبركم isEmpty بما إذا كان من نوع None.
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.isDefined)
println(b.isEmpty)
}
}مطابقة الأنماط مع Option
بما أن Option هو ADT مغلق، يمكنكم إجراء مطابقة الأنماط عليه. ويعالج ذلك حالتي الوجود والغياب بوضوح.
object Main {
def greet(name: Option[String]): String = name match {
case Some(n) => s"Hello, $n"
case None => "Hello, stranger"
}
def main(args: Array[String]): Unit = {
println(greet(Some("Bo")))
println(greet(None))
}
}إنشاء Option من قيم Nullable
إذا اضطررتم إلى التعامل مع شيفرة تُرجع null، فغلّفوها باستخدام Option(...). إذ يحوّل null إلى None وأي قيمة حقيقية إلى Some.
object Main {
def main(args: Array[String]): Unit = {
val maybe = Option("data")
val nothing = Option(null)
println(maybe)
println(nothing)
}
}المكتبة القياسية تُرجع Option
تُرجع العديد من الدوال المضمّنة Option بدلًا من المخاطرة بالأخطاء. فعلى سبيل المثال، تتعامل List.headOption بأمان مع القوائم الفارغة.
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3)
val empty = List.empty[Int]
println(xs.headOption)
println(empty.headOption)
}
}لماذا نستخدم Option بدلًا من null؟
يتفوق Option على null لأنه:
- يُظهر القيم المفقودة في النوع
- يفرض على المستدعين معالجة حالة الغياب
- يلغي NullPointerExceptions
- يتكامل مع map وflatMap وfor-comprehensions
جمع العناصر معًا
عملية بحث صغيرة تُرجع Option، ثم تُعالج بأمان باستخدام مطابقة الأنماط.
object Main {
val prices = Map("apple" -> 3, "pear" -> 5)
def priceOf(item: String): Option[Int] = prices.get(item)
def main(args: Array[String]): Unit = {
priceOf("apple") match {
case Some(p) => println(s"costs $p")
case None => println("not for sale")
}
println(priceOf("banana"))
}
}اختبار سريع
اختبروا فهمكم لـ Option.
مراجعة
تعلّمتم تجنب null باستخدام Option:
Option[A]هوSome(value)أوNone- يجعل احتمال الغياب واضحًا في النوع
- تحققوا باستخدام
isDefined/isEmptyأو مطابقة الأنماط - استخدموا
Option(x)لتغليف القيم التي قد تكون null - تُرجع دوال المكتبة مثل
headOptionوMap.getقيمة Option
الأسئلة الشائعة
هل درس «تجنب null» مجاني؟
نعم — نص درس «تجنب null» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «تجنب null»؟
أساسيات Option تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تجنب null»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.