مقدمات سکالا 9- Option

scala
tutorial

#1

در برنامه نویسی بیان کردن عدم وجود داده معمولا با null یا nil انجام میشه و این یکی از بزرگترین عوامل باگ در برنامه نویسی شناخته شده چون null انتظار کدی که تابع فراخوانی میکنه برآورده نمیکنه برای مثال اگه تابع درحالت معمول عدد بر میگردونه null با هیچ عملکرده API عدد تطابق نداره.
در functional programming برای بیان کردن داده اختیاری که گاهی وجود نداره یک تایپ سازنده به نامه Option وجود داره با تعریف زیر

trait Option[A]
case class Some[A](a: A) extends Option[A]
case class None[A]() extends Option[A]

برای مثال اگر

case class Person(name: String, email: Option[String])

email اینجا اختیاری هستش درصورت وجود ایمیل داده ایمیل به شکل

Some(email)

خواهد بود و در صورت عدم وجود ایمیل

None

یک مثال دیگه

def divide(numerator: Double, denominator: Double): Double {
  if(denominator == 0) {
    throw new IllegalArgumentException("denom should not be zero")
  } else {
    numerator / denominator
  }
}

این تابع تقسیم انجام میده و درصورت صفر بودن مخرج خطا برمیگردونه
کسی که این کد استفاده میکنه تا بدنه کد نبینه متوجه نمیشه که این کد احتمال داره خطا بده و در واقع تایپ نوشته خروجی این function گمراه کننده هستش
بهتر کردن این تابع توسط Option

def divide(numerator: Double, denominator: Double): Option[Double] {
  if(denominator == 0) {
    None
  } else {
    Some(numerator / denominator)
  }
}

تابع بالا رو به روز کردیم و آشکار کردیم که این تابع گاهی عدد بر میگردونه گاهی None


مقدمات سکالا