کاتلین فارسی

فهرست

1 - مقدمه

1.1 ) به دوره خوش آمدید

1.2 ) چرا کاتلین؟

2 - مبانی کاتلین

2.1 ) آشنایی با JVM

2.2 ) نصب کردن ابزارآلات

2.3 ) کاتلین REPL

2.4 ) ساختار یک برنامه کاتلین

2.5 ) کاتلین با IntelliJ IDEA

2.6 ) خلاصه بخش دوم

3 - کد نویسی مقدماتی کاتلین

3.1 ) تعریف متغیر در کاتلین

3.2 ) کار با Type های پایه ای

3.3 ) حلقه ها در کاتلین

3.4 ) عبارت های شرطی در کاتلین

3.5 ) اضافه کردن پگیج ها در کاتلین و خلاصه بخض سوم

4 - توابع

4.1 ) توابع در کاتلین

4.2 ) تابع با پارامترهای پیشفرض و نامیده شده

4.3 ) تابع با پرامترهای نامحدود و خلاصه بخش چهارم

5 - کلاس ها

5.1 ) کلاس ها در کاتلین

5.2 ) توابعِ عضو در کاتلین

5.3 ) visibility modifier ها در کاتلین

5.4 ) کلاس های دیتا در کاتلین

5.5 ) کلاس های enum در کاتلین

5.6 ) Object ها در کاتلین و خلاصه بخش پنج

6 - ارث بری

6.1 ) ارث بری در کاتلین

6.2 ) کارکردن با کلاس های abstract در کاتلین

6.3 ) کلاس های interface در کاتلین

6.4 ) نگاه کوتاه به generic ها و خلاصه بخش شش

7 - کارکردن با Null ها

7.1 ) null safety و خلاصه بخش هفت

8 - نکات اضافه

8.1 ) type casting در کاتلین

8.2 ) چندتایی ها (Tuples)

8.3 ) deconstructing values

8.4 ) کار کردن با exception ها

8.5 ) constant ها

8.6 ) annotation ها در کاتلین و خلاصه بخش هشت

9 - نگاه functionalای

9.1 ) توابع Higher-Order

9.2 ) عبارت های لاندا در کاتلین

9.3 ) closure ها در کاتلین

9.4 ) عبارت های الحاقی در کاتلین و خلاصه بخش نهم

10 - قابلیت همکاری و Interoperability

10.1 ) همکاری با جاوا

10.2 ) صحبت کردن با جاوا از کاتلین

10.3 ) کار کردن با null ها از جاوا

10.4 ) صحبت کردن با کاتلین از جاوا

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

10.6 ) توابع الحاقی کاتلین از جاوا

10.7 ) همکاری با جاوا 7 و 8 و خلاصه بخش دهم

11 - کتابخانه استاندارد

11.1 ) کتابخانه استاندارد کاتلین و کارکردن با کالکشن ها در کاتلین

11.2 ) مرور کوتاه بر روی filtering و mapping و flatmapping در کاتلین

کار کردن با exception ها

ویرایش
پیشنهاد میشه این جلسه رو بر روی IntellJ IDEA امتحان کنید

یکی از مشکلاتی که سعی میکنیم با کاتلین از بین ببریمش چک کردن Exception هاست. مثلاً در جاوا اگر یک متد بخواد Null Runtime Exception رو throw کنه باید صریحا بیان کنه. ایده پشت این قضیه اینه که توسعه دهنده ها بلاک های try-catch اشون رو بنویسن و خب اگه این اتفاق بیفته همه چیز فوق العاده میشه و برنامه بدون نقص اجرا میشه ولی خب توی واقعیت اینطور نیست. درواقع خیلی از توسعه دهنده ها کدهایی که باید مینوشتن رو نمینوشتن بنابراین توی توسعه زبان کاتلین از این موضوع چشم پوشی شد. خب بیاین یک نگاه به Exception ها بندازیم و ببینیم چجوری توی این زبون کار میکنن.

یک کلاس درست میکنیم به نام NotANumberException و توش کد زیر رو میزنیم:

class NotANumberException : Throwable() {

}

در کاتلین کلاس پایه ای برای Exception ها کلاس Throwable است که اگر به سمت تعریفش هدایت بشین میبینین که کلاس ساده ای هستش که تنها دو خصیصه و چنتا constructor داره.

• در IntelliJ IDEA برای هدایت شدن به سمت تعریف ، تنها لازم است که موشواره خود را بر روی نام عبارت برده و دکمه Ctrl را نگه داشته و بر روی آن کلیک کنید.

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

class NotANumberException : Throwable() {

}

fun main(args: Array<String>) {
    throw NotANumberException()
}

و اگه این کد رو اجرا کنیم متوجه خواهیم شد که NotANumberException رو throw کردیم.

حالا بیایم و یکم این سناریو رو طبیعی تر کنیم

class NotANumberException : Throwable() {

}

fun checkIsNumber(obj: Any){
    when(obj){
        !is Int, Long, Float, Double -> throw NotANumberException()
    }
}

fun main(args: Array<String>) {
    checkIsNumber("A")
}

و همینطور که انتظار داریم اگه این برنامه رو اجرا کنیم

میبینیم همون Exception مورد انتظارمون رو throw کرد.

و خب اینجوری حالا میتونیم با try-catch این موضوع رو هندل کنیم

class NotANumberException : Throwable() {

}

fun checkIsNumber(obj: Any){
    when(obj){
        !is Int, Long, Float, Double -> throw NotANumberException()
    }
}

fun main(args: Array<String>) {

    try {
        checkIsNumber("A")
    } catch(e: NotANumberException) {
        println("It was not a number")
    }
}

حالا بیایم یکم با try-catch بازی کنیم، مثلا از فایل یک مقدار بخونیم

من توی شاخه ی اصلی یک فایل باز کردم به نام input.txt و داخلش یه متن کوچیک نوشتم. حالا میریم و یک سری خط کد مینویسم که از اون تابع بخونم. کدی که میزنیم خیلی از قسمتاش که مربوط به خوندن از فایل میشه که مهم نیست و خیلی شبیه جاواست:

fun main(args: Array<String>) {

    val buffer = BufferedReader(FileReader("input.txt"))
    try {
        val chars = CharArray(30)
        buffer.read(chars,0,40)
    }finally {
        println("Closing")
        buffer.close()
    }
}

خودتون متوجه هستین که من سعی کردم باعث ایجاد مشکل بشم، چون دارم 40 خونه از یک بافری که 30 خونه بیشتر نداره میخونم.

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

ارور indexOutOfBoundException رو گرفتیم، چون همونطور که خودمون میدونستیم داریم 40 تا از یک آرایه 30 خونه ای میخونیم. ولی اگه دقت کنید، به هر حال Closing اجرا شده!

اگه یادتون باشه از قسمت if، ماتونستیم یک عبارت شرطی رو به یک متغیر بدیم. با بلاک try-catch هم همینکار رو میتونیم انجام بدیم.

fun main(args: Array<String>) {
    val buffer = BufferedReader(FileReader("C:/Users/Darvishi/IdeaProject/KotlinFarsiRepo/src/input.txt"))
    val result = try {
         val chars = CharArray(30)
         buffer.read(chars,0,40)
    }catch (e: IndexOutOfBoundsException){
         "Exception handled"
    }finally {
          println("Closing")
          buffer.close()
    }

    println(result)
}

دقیقا به مانند if و when که اخرین خط مقدارش تعلق میگرفت به متغیر، اینجا هم اخرین خط مقدارش تعلق میگیره به متغیر. فقط یادتون باشه که مقادیر بلاک catch به متغیر تعلق میگیرند، نه مقادیر بلاک finally .