آشنایی و شروع با Kotlin – قسمت دو

قسمت یک آموزش و مفاهیم اولیه برای آشنایی با کوتلین – Kotlin و مزایای آن نسبت به جاوا – Java : لینک – صادق خان

با سلام: خب در قسمت اول به اینجا رسیدیم که چرا Kotlin و چرا Kotlin + Android ؟ (کوتلین چیست)

حرکت به جلو، همه چیز در مورد کوتلین در دیدگاه جاوا در برابر کوتلین وجود دارد، برا شگفت زده شدن آماده باشید …. 

کوتلین Propertie ها را در Front قرار می دهد

  • مثال بسیار خورب برای کد boilerplate (به کدهایی میگن که دائما تکرار می شوند. کدهایی که شما در قسمت های مختلف برنامه مجبورید تکرارشون کنید برای یک منظور مشخص. کد های اضافی یا توصیفی هستند. کد هایی که حجم کد رو بالا می برند ولی منطق برنامه شما نیستند. به عنوان یک مثال خوب میشه متد های Getter و Setter در جاوا رو مثال زد! شما برای اینکه بتونید یک متغیر private از کلاسی رو دسترسی داشته باشید باید براش Getter و Setter بنویسید! در هر کلاس برای هر متغیر دو تا از این متد ها وجود داره) یه کلاس جاوا است که در آن همه چیز جز برای شناساندن متغیر ها، به صورت نا خواسته و خطوط بیش از حد کد به نظر می رسد، این جایی است است که کوتلین وارد بازی می شود.
  • کوتلین به نیاز به اضافه کردن و حفظ کد های مانند get و set و تبدیل مقادیر متغیر ها پایان می دهد.
//Java زبان
//Declaring Class
public class Person{
//Variables
String name;
int age;
//Constructors
public Person(String name, int age){
this.name=name;
this.age=age;
}
//Getters and Setters
public String getName(){
return name;
}
public int getAge(){
return age;
}
public setName(String name){
this.name=name;
}
public setAge(int age){
this.age=age;
}
}
//Kotlin Equivalent
معادل کوتلین تکه کد بالا:
data class person(val name:String val age:Int)// That's it?

کوتلین دارای Getter و Setter ها نمی باشد و تنها دارای مشخصه ها هست.

 

زبان کوتلین Functional است:

در مورد Functional در قسمت اول مطلب آشنایی با کوتلین به اندازه کافی نوشتم، کوتلین Kotlin حقیقتا Functional است و دلیل بر اینکه ظریف، آسان، مختصر، بیانگر و قابل خواندن و فهم است.

 

کوتلین (Kotlin) به صورت 100درصد Functional نیست، چرا که تغییر ناپذیری (Immutability) به صورت دلخواه و یک آپشن است اما به صورت حرفه ای است.

 

سینتکس کوتلین (Kotlin’s Syntax) خیلی آشناست:

  • سینتکس کوتلین بسیار نزدیک به سینتکس منطق آن است.
  • بسیاری از کد های boilerplate که در زبان های برنامه نویسی شی گرا رایح بودند را کاهش داده است.
  • به راحتی توسط توسعه دهندگان تازه کار قابل فهم سات و همچنین ساده و کوتاه.
//Java
int num=0;
String str="Kotlin"; // Both are mutable and has side effects of being changed anywhere in the code.
//Kotlin
val str="Kotlin" // Type is optional & can be explicitly defined. 
val str: String = "Kotlin" //val is immutable & remains unchanged.
var num: Int = 0 // var is mutable & can be changed anytime.

خصوصیات غیر قابل تغییر بودن توسط دو متغیر var و val کنترل می شود، نوع داده به صورت خود به خوود تعریف می شود.

کوتلین (kotlin) سازگار با  Java:

کوتلین به صورت 100% با جاوا سازگار است، اجازه ی نه تنها تبدیل به جاوا و از جاوا را می دهد بلکه در کنار حاوا نیز کار می کند، بنابراین  می تواند به دسترسی، تغییر و استفاده از جاوا د رکنار کوتلین پرداخت.

JavaMoney یک کلاس Java است که درون کوتلین (Kotlin) استفاده شده است (تصویر سمت چپ)

Money یک کلاس داده کوتلین می باشد که در کلاس جاوا استفاده شده است (تصویر سمت راست)

ممکن است موارد فوق دسترسی به یک کلاس جاوا یا کلاس داده کوتلین باشد، تمام این تبدیلات توسط کوتلین انجام و مدیریت می شود.

 

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

سربارگذاری توابع function overloading دیگر بهم ریخته و زائد نیست: سربارگذاری توابع در طول تمام تکامل برنامه نویسی یکسان باقی مانده است. اما مهمه به این توجه بشه کهم مقدار کدهای زائد که همراه با سربازگذاری است، سردرگمی توسعه دهنده (برنامه نویس) را افزایش می دهد.کوتلین در این مورد یه رویکرد بی پرده و صریح دارد.

نکته: منظور از سربارگذاری تابع در برنامه نویسی، ایجاد نسخه‌های مختلفی از یک تابع با نام یکسان است که قادر به انجام کارهای تقریبا مشابهی هستند. در واقع تابع سربارگذاری شده دارای چندین پیاده سازی است که بسته به نیازهای مختلف برنامه، هر پیاده سازی دستورات متفاوتی را اجرا می‌کند.

آرگومان های دارای نام از ترتیب پیروی نمی کنند: آرگومان های نام دار اجازه کنترل کامل روی آن که چه مقداری به کدام متغیر پاس داده شود را می دهد و این مفید است مخصوصا زمانی که با مقادیر بولین (Boolean) برخورد می شود، مانند مثال زیر:

//Java
void check(boolean isAlpha, boolean isNum){ //function definition
}
check(true,false);//function call
//Kotlin
fun check(isAlpha:Boolean,isNum:Boolean=false) {
//function definition
}
//function call
check(true)// Gets isAlpha as true & gets isNum default value false
check(true,true)// Overrides isNum with true
//Named Arguments
check(isAlpha=true,isNum=false)// Same as below
check(isNum=false,isAlpha=true)// Same as above

توابع متفاوت بیشتری برای تعداد آرگومان یا نوع آرگومان وجود ندارد. تمامیشان یکی و یکسان هستند اما با مقادیری که بهشون پاس می دیم وفق داده می شود. 

توابع ترجیح می دهند که تنها (Single) باشند: عبارت های تک-خطی (Single-line expressions) اولین قدم در بهبود خوانایی کد می باشد.

//Java
int sum(int x, int y){ //Return type has to be declared.
x=x+y; //value of x is changed and is a side effect.
return x;
}
//Kotlin
fun sum(x : Int, y : Int) = x+y // Perfect.

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

 

کوتلین به Null یه No بسیار بزرگی گفته:

اختصاص دادن یه مقدار Null : هرکسی که تو نت در مودر Null جستجو کنه حتما با Java Null Pointer Exception مواجه خواهد شد. این یکی از بزرگترین و قدیمی ترین مشکلات جاوا می باشد و به همین دلیل است که کوتلین Kotlin با امنیت Null را کنار گذاشته است. کوتلین تنها در حالتی که عملگر “؟” در هنگام اختصاص دادن همانند مثال زیر استفاده شود، به Null اجازه می دهد که در کد شما حضور داشته باشد. 

//Java
String text1=null // Oops! Exception
//Kotlin
var text1: String = "Kotlin" // Yay..Works
var text2: String = null // Oops!
var text2:String?=null// Now it Works

بررسی null : بر خلاف جاوا ، شما در حقیقت هرگز نباید به بررسی null ، قبل از انجام دادن یه عمل بپردازید و نگران اتفاق افتادن Null exception باشید. کونلین این را با استفاده از عملگر “؟” تضمین می کند.

//Java 
if(a!=null){
int x=a.length();
}
//Kotlin
val x=a?.length //Compiles only if a is not null

عملگر Elvis : مواردی وجود دارد که ما ممکن است بخواهیم که مقداری را برای تابع برگردانیم (return) که با null سروکار دارد (به جای اینکه ردش کنه (skip)). در این مورد، عملگر Elvis(?:)  در ترکیبی با فراخوانی امن استفاده میشه، بنابراین null هیچ وقت ممکن نیست.

val x =b?.length ?: 0 // x will have length of b or 0(if b is null)
val x = b?.length ?: throw NullPointerException() 
val x = b!!.length                                 // same as above

هرگز Null وحود نخواهد داشت مگر اینکه در نظر گرفته شود.

لامدا (Lamda) بیشتر بهینه می شود:

عبارات لامدا به ویژگی مخصوصی از لامدا اضافه شده است، در نتیجه منجر به قابل فهم بودن کد نیز می شود. 

//Java
No Lambda function in Java 6
//Kotlin
val sum = { x: Int, y: Int -> x + y }   // type: (Int, Int) -> Int
val result = sum(2,7)                      // result == 9

شرایط از هر زمان بیشتر طبیعی است:

“if/else” و “switch” های سنتی و رایح زبان جاوا نه تنها موثر تر شده اند بلکه خوانا تر نیز شده اند، این کار توسط کوتلین و با تعویضشان با “when” صورت گرفته.

//Java
if(x==1)
println("x is 1");
else if(x==2)
println("x is 2");
else if(x==3||x==4)
println("x is 3 or 4");
else if(x>=5||x<=10)
println("x is 5, 6, 7, 8, 9, or 10");
else
println("x is out of range");
//Kotlin
when (x) {
    1 -> print("x is 1")
    2 -> print("x is 2")
    3, 4 -> print("x is 3 or 4")
    in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
    else -> print("x is out of range")
}

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

توسعه دهنده اندرویدی وجود نداره که از مجموعه کد ناخوشایند وابسته به event handleing متنفر نباشه. کوتلین تقریبا تشریفات رو به صفر رسونده 🙂

//Java
view.setOnClickListener(new View.OnClickKistener(){
@Override
public void onClick(View v){
System.out.println("This is irritating");
}
});
//Kotlin
view.onClick{
println("Woah!!")
}

کوتلین تنها دغدغه اش عملکر تابع مورد نظر هست و نه چیز دیگه!

کوتلین آن را با نادیده گرفتن view binding حل کرده است:

view binding ها در جاوا برای همه کدهای Boilerplate است و اغلب متعدی و اعصاب خورد کن هستند. به همین دلیل کوتلین آن را برای همیشه پایان داده است.

//Java
TextView program = (TextView) findViewById(R.id.program);
program.setText("Kotlin");
//Kotlin
view.program.text="Kotlin"

دیگر ویژگی های دوست داشتنی کوتلین:

کوتلین متمرکز بر آنچه که توسعه دهنده ممکن است بخواهد بوده است. و تمامیشان را در کتابخانه استاندارد کوتلین (Kotlin Standard Library) که قدرتمند تر ، متستقل و کاراتر از کتابخانه استاندارد جاوا است جا داده است.

//Java 
if(name.toLowerCase().contains(firstName.toLowerCase())){
...
}
//Kotlin
if(name.contains(firstName,true)){...}

برخلاف جاوا، در کوتلین قبل از بررسی مشروز نیازی نیست که نگران case sensitivity باشید.

حالا با توجه به مواردی که در این مطلب و قسمت اولش در مورد کوتلین نوشتم، شما ممکن است که بخواید به کوتلین سوییچ کنید اما هنوز فکر می کنید که ممکن قضیه سوییچ کردن طولانی بشه و خب این منصفانه است، اما دلیلی که شما باید به کوتلین سوییچ کنید این هست که 100% با جاوا سازگار است. به این مسئله در قسمت سوم این مطلب خواهم پرداخت….