ده چیز باحال درباره ی کاتلین (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() }