ده چیز باحال درباره ی کاتلین (Kotlin)

کاتلین یکی از زبان های برنامه نویسی جدید است که توسط شرکت جت برینز تولید شده است همون شرکتی که اینتلی جی یا پی اچ پی استور رو ساخته. کاتلین به بایت کدهای جاوا کامپایل میشه ، با اینکه زبان کاتلین اسم زیاد جالبی نداشت ولی من کار باهاش رو شروع کردم و حالا هم قصد ندارم به جاوا برگردم چون کاتلین عالیه

ده چیز باحال درباره ی زبان کاتلین
ده چیز باحال درباره ی زبان کاتلین


دلایل اینکه کاتلین خیلی باحاله براتون نوشتم


۱ - با زبان جاوا ( که رقیب خودش در برنامه نویسی اندروید هست ) کاملا سازگاره

کاتلین صراحتا برای جایگزینی با زبان جاوا در برنامه نویسی اندروید بوجود اومده و شما میتوانید در کلاس های کاتلین از کلاس های جاوایی ارث بری کنید ، میتونید از اینترفیس های جاوا استفاده کنید ، متود های جاوایی صدا بزنید و ... برعکس اش هم درسته یعنی میتونید موارد کاتلین را در جاوا استفاده کنید.

۲ - فانکشن های جانبی extension functions

مثل زبان c# در کاتلین شما میتوانید فانکشن هایی را تعریف کنید که درون کلاس باشند ولی درون کلاس نوشته نشده باشند مثال زیر را ببینید :

class Person {
  var firstName = ...
  var lastName = ...
}

// Maybe the author of the Person class forgot to include this
fun Person.setName(firstName: String, lastName: String) {
  this.firstName = firstName
  this.lastName = lastName
}

توابع جانبی به پارامترهای خصوصی درون کلاس دسترسی ندارند پس عملا نمیتونند در اصل کلاس دستکاری انجام بدهند و این اصالت کلاس رو حفظ میکنه


۳- توابع دریافت کننده یا reciver functions

این قسمت یکی از مورد علاقه ترین قسمت های کاتلین برای من است. تنها چیزی که میدانم مشابه Block ها در روبی هست. کاتلین به شما اجازه میدهد توابع درجه ی بالاتری را بر روی توابع دیگر تعریف کنید شاید یکم گنگ گفتم بهتره یه مثال برنامه نویسی با کاتلین بزنم :

fun table(init: Table.() -> Unit): Table {
  val table = Table()
  table.init()
  return table
}

fun Table.row(init: Row.() -> Unit) {
  val row = Row()
  row.init()
  this.add(row)
}

fun Row.cell(text: String) {
  this.add(Cell(text))
}

۴ - توابع خطی یا 4. Inline functions

یکی دیگه از ویژگی های کاتلین هست که در جاوا نمیتونید پیداش کنید توابع خطی یا inline functions هست به مثال زیر نگاه کنید :‌

fun findPresident(persons: List<Person>): Person? {
  persons.forEach {
    if (person.isPresident) {
      return person // Returns from findPerson, not just
                       from the lambda
    }
  }
  return null
}

شاید یه خورده داستان پیچیده شد البته حق هم دارید چون زبان کاتلین کمی با زبان های دیگر تفاوت داره و کمی سردرگم کننده هست ولی اگر بتونید یاد بگیرید بهتون قول میدم که در مدت زمان کم میتونید پروژه های بزرگی رو باهاش بنویسید چون واقعا کار را ساده و بهینه میکنه من کاتلین را از دوره ی آموزش کاتلین استاد نیکزاد دیدم و فوق العاده کیفیت بالایی داشت اگر به دنبال دوره ی جامع و فارسی هستید حتما این دوره را هم در نظر بگیرید.

۵ - جلوگیری از null شدن مقادیر

در زبان های برنامه نویسی دیگر شما میتوانید به هر متغیری مقدار null بدهید ولی نه در کاتلین ...

کاتلین بصورت پیشفرض به شما اجاره نمیدهد کاری بکنید که بعدا باعث دردسر شود

مثال :‌

val arthur: Person = null // Error! null is not a valid value
                             for String.

و همچنین

var arthur = Person(&quotArthur&quot, &quotDent&quot)
...
arthur = null // Error! Inferred type of thingy is String

۶ - تابع apply در کاتلین

در زبان جاوا معمولا یک آبجکت میسازند و سپس فیلد های آنرا ست میکنند :‌

Person zaphod = new Person();
zaphod.setFirstName(&quotZaphod&quot);
zaphod.setLastName(&quotBeeblebrox&quot);
zaphod.setHeadCount(2);

خسته کننده و تکراری است. در کاتلین تابع apply به شکل زیر کمک میکند :

val zaphod = Person().apply {
  firstName = &quotZaphod&quot
  lastName = &quotBeeblebrox&quot
headCount = 2
}


۷ - همه چیز یک expression هست

شاید شما هم دیده باشید که شرط if را بصورت خلاصه اینطوری مینویسند :

val happiness =
    person == marvin ? Int.MIN_VALUE : person.happiness

اما این سردرگم کننده هست و میتوانید خود شرط if را بصورت كexpression دربیاورید :

val happiness =  if (person == marvin) Int.MIN_VALUE else person.happiness

حالا این که چیزی نیست ! به مثال زیر توجه کنید :‌

// No more need to declare it outside the try block, then
// assign inside!
val file = try {
  FileInputStream(...)
} catch (ex: IOException) {
  logger.log(ex)
  throw ex
}
// &quotwhen&quot is like &quotswitch&quot but with a different name
// (and no fallthrough).
val name = when (key) {
  'a' -> &quotArthur&quot
  't' -> &quotTrillian&quot
  'z' -> &quotZaphod&quot
else -> &quotNobody&quot
}

۸ - توابع بصورت single expression

این مورد برای توابع کوچک مثل getter و ... خیلی کاربردی هستند :

fun fullName() = firstName + &quot &quot + lastName

این سبک کدنویسی بسیار مفید است و در زمان شما صرفه جویی میشود که کاتلین برای شما فراهم کرده است.


۹ - توابع و متغیرهای کاملا آزاد در کاتلین

در زبان جاوا شما مجبورید کلاس بسازید ! حتی وقتی که یک تابع نیاز دارید که اصلا به شی گرایی و کلاس ارتباطی ندارد باید یک کلاس بسازید و آنرا تابعی استاتیک تعریف کنید.

در زبان کاتلین این آزادی به شما داده شده است که توابع را آزادانه در هرکجای فایل کاتلینی بسازید و تعریف کنید.

val mySingleton = object {
  ...
}


۱۰ - داده های جبری در زبان کاتلین

با استفاده از sealed class همانند final class جاوا شما میتوانید انواع داده های جبری کاتلین را تعریف کنید.

یک مثال سنتی لیست پیوندی است:

fun sum(list: List): Int = when (list) {
    is List.Cons -> list.value + sum(list.succ)
    // Compile error! Forgot to handle the Nil case.
}

این میتواند برای بررسی حالت های مختلف نیز بسیار مفید باشد . برای نمونه کد زیر را ببینید :

sealed class GameState {
  class SettingUp() : GameState()
  class Playing(val boardPosition: BoardPosition) : GameState()
  class GameOver(val winner: Player) : GameState()
}