کاتلین فارسی

فهرست

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 در کاتلین

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

ویرایش

حالا فرض کنید من یک اینتفریس دارم به نام EmployeeRepository و این کد هارو براش زدم

class Employee

interface EmployeeRepository{
    fun store(onj: Employee){

    }
    fun getById(id : Int) : Employee
}

میبینین که ما درواقع یک سری کد رو تکرار کردیم. کلاس CustomerRepository (که جلسه قبل نوشتیم) و کلاس EmployeeRepository مون، دوتابع تکراری store و getById دارن و تنها تفاوت بین این دو تایپی که توابعش بر میگردونن است ، یکی Employee و یکی دیگه Customer.حالا اگه شما با برنامه نویسی اشنا باشین میدونین که چجوری بتونیم به مقصود دلخواهمون برسیم و اون هم استفاده از Generic هاست. بذارین شیوه کارمون رو توضیح بدم، ما یک سری کلاس های Generics تولید میکنیم که قراره یک سری پارامتر به نامType Parameter رو بگیرن و محصولی رو تولید کنن.خب پس بیاین ببینیم چجوری این کار انجام میشه.

interface Repository<T> {
    fun getById(id:Int) : T

    fun getAll() : List<T>
}

یک اینترفیس ساختیم به نام Repository که یک Type Parameter میگیره به نام T و دو تابع هم داریم که یکی اون پارامتر رو با یک شماره برمیگردونه و یکی دیگه هم لیست کل پارامتر هارو برمیگردونه.

نحوه استفاده ازش هم راحته، کافیه یک کلاس بسازیم به نام CustomerGenericRepository به فرم زیر

class Customer

interface Repository<T> {
    fun getById(id:Int) : T

    fun getAll() : List<T>
}

class CustomerGenericRepository<T> : Repository<T> {
    override fun getById(id: Int): T {
        TODO("not implemented")
    }

    override fun getAll(): List<T> {
        TODO("not implemented")
    }
}

fun main(args: Array<String>) {
    val customerRepo = CustomerGenericRepository<Customer>()
}

حالا شما تقریبا متوجه شدین که Customerهه اول نام CustomerGenericRepository درواقع اضافه است! چون لازم نیست که لغت Customer رو اولش بیاریم. تنها کاری که باید انجام بدیم اینه که یک کلاس بسازیم به نام GenericRepository و بعدش Employee و Customer رو بهش پاس بدیم!خب پس میریم و Customer رو از اولش بر میداریم.

class Customer
class Employee

interface Repository<T> {
    fun getById(id:Int) : T

    fun getAll() : List<T>
}

class GenericRepository<T> : Repository<T> {
    override fun getById(id: Int): T {
        TODO("not implemented")
    }

    override fun getAll(): List<T> {
        TODO("not implemented")
    }
}
fun main(args: Array<String>) {
    val customerRepo = GenericRepository<Customer>()
    val employeeRepo = GenericRepository<Employee>()
}

همچنین ما میتونیم Generic هارو برای توابع هم استفاده کنیم

interface Repo{
    fun <T> getById(id : Int) : T
    fun <T> getAll() : List<T>
}

class MyRepo : Repo {
    override fun <T> getById(id: Int): T {
        TODO("not implemented")
    }

    override fun <T> getAll(): List<T> {
        TODO("not implemented")
    }
}

البته زمانی که کل کلاس از یک تایپ استفاده میکنن، خب بهتره که کل کلاس رو Type Parameter بدیم تا این که تک تک توابع رو، ولی زمانی که توابع داخل کلاس، هر کدوم Type Parameter های متفاوت میگیرن اون موقع این کار منطقیه.

خلاصه بخش 6:

1- به صورت پیش فرض تموم کلاس ها final هستند، در هنگام ارث بری نیاز به کلید واژه open داریم

2- کلاس های abstract به مانند interface هستند با این تفاوت که اجازه میدن حالت رو نگه داریم

3- کاتلین هم همچنین اجازه میده تا کلاس و متد های Generic داشته باشیم و البته در دوره Advance بیشتر به این مورد ها میپردازیم.