عکاس و عاشق طراحی وب و برنامه نویسی
ده چیز باحال درباره ی کاتلین (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("Arthur", "Dent")
...
arthur = null // Error! Inferred type of thingy is String
۶ - تابع apply در کاتلین
در زبان جاوا معمولا یک آبجکت میسازند و سپس فیلد های آنرا ست میکنند :
Person zaphod = new Person();
zaphod.setFirstName("Zaphod");
zaphod.setLastName("Beeblebrox");
zaphod.setHeadCount(2);
خسته کننده و تکراری است. در کاتلین تابع apply به شکل زیر کمک میکند :
val zaphod = Person().apply {
firstName = "Zaphod"
lastName = "Beeblebrox"
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
}
// "when" is like "switch" but with a different name
// (and no fallthrough).
val name = when (key) {
'a' -> "Arthur"
't' -> "Trillian"
'z' -> "Zaphod"
else -> "Nobody"
}
۸ - توابع بصورت single expression
این مورد برای توابع کوچک مثل getter و ... خیلی کاربردی هستند :
fun fullName() = firstName + " " + 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()
}
مطلبی دیگر از این انتشارات
کدام زبان برنامه نویسی برای شروع برنامه نویسی مناسب هست؟ (بررسی زبانهای مختلف)
مطلبی دیگر از این انتشارات
تعطیلات عید و یادگیری برنامه نویسی
مطلبی دیگر از این انتشارات
راه اندازی سایت: گام به گام با یک نقشه راه جامع