Kotlin Week 5

Playing with Functions

function တွေရဲ့ အခြေခံ usage အသုံးပြုမှု၊ ရေးသားမှုတွေကို ဆက်လက်လေ့လာသွားကြပါမယ်။
အခြား programming language တွေလိုပဲ Hello world program လေးနဲ့ပဲ စကြတာပေါ့။
hello.kt // Kotlin file တွေက .kt ဆိုတဲ့ extension နဲ့ ဆုံးပါတယ်။

Hello World!

ပထမဆုံးတွေ့ရတာတော့ function ပေါ့နော်။ function တွေသည် ‘fun’ ဆိုတဲ့ keyword နဲ့ စပါတယ်။
ပီးရင်တော့ function ရဲ့ နာမည် ( function name ) ပေါ့။ နောက် parameter ရှိရင် parameter ပါတဲ့
bracket ၊ ပြီးရင်တော့ function body ပေါ့။
နောက်ထပ် example လေး ထပ်ကြည့်ပေးပါဦး။ ပိုပြီး familiar ဖြစ်သွားအောင်။

Another Function Example

function call ကတော့ တခြား programming languange တွေလိုပါပဲ။

ဒီ ဥပမာကတော့ parameter အသုံးပြုပုံဖြစ်ပါတယ်။

function parameter

parameter မှာ type ကို ကြိုက်တဲ့ type ကို ပေးဖြတ်စေချင်ရင် Any ဆိုတဲ့ keyword ကို သုံးနိုင်ပါတယ်။

Any parameter

Null ကိုပါ ပေးဖြတ်မယ်ဆိုရင်တော့ ထုံးစံအတိုင်း ‘?’ ထည့်ပေးရင် ရပါပြီ။ ဒါမျိုးပါ။

fun presentGently ( v : Any? ) { }

function return ကတော့ Java နဲ့ သိပ်မတူပဲ အနည်းငယ် ကွဲသွားပါတယ်။ 
return type ကို function name နဲ့ function paremeter နောက်မှာ ရေးပါတယ်။ ဥပမာပြထားပါတယ်။

fun sumPositive ( a : Int, b : Int ) : Int {
 if ( a >= 0 & b >= 0 ) {
 return a + b
 }
 return 0
 }

နောက်ထပ် parameter မှာ vararg ဆိုတဲ့ modifier လည်း ရှိပါသေးတယ်။
arguement တွေ အတွဲလိုက်ကို လက်ခဲပေးနိုင်တဲ့ modifier မျိုးပါ။

အဲဒီ function သည် 1,2,3,4,5 စတဲ့ variable အတွဲလိုက် ပေးဖြတ်စေနိုင်ပါတယ်။

printSum ( 1,2,3,4,5 ) 
printSum ( )

ကျွန်တော်တို့ရဲ့ vararg သည် parameter တွေကို တစ်ခုပြီးတစ်ခု ( one by one ) ပေးဖြတ်စေပါတယ်။
သို့သော် အားလုံးကို တစ်ပြိုင်နက် ဖြတ်စေချင်ရင်တော့ spread operator ဖြစ်တဲ့ (*) ကို အသုံးပြုနိုင်ပါတယ်။

val texts = arrayOf ( “B”, “C”,”D )
 printAll (*texts ) // B,C,D
 printAll(“A”, *texts, “E”) //A,B,C,D,E

Kotlin မှာ single expression function တွေကိုတော့ အောက်ပါအတိုင်းရေးပါတယ်။

fun square ( x : Int ) : Int { return x*x }
OR
 fun getGmail ( ) : String {
 return emailView.text.toString ( ) 
 }

နောက်ထပ် Android မှာ ရေးသားတဲ့ ပုံစံတစ်ခုကို ဥပမာပြပါဦးမယ်။

override fun onOptionItemSeleted ( item : MenuItem ) : Boolean = when {
 item.itemId == android.R.id.home -> {
 onBackPressed ( )
 true
 }
 else -> super.onOptionsItemSelected ( item )
 }

function တွေအကြောင်းပြောရင် recursive function တွေအကြောင်းကလည်း ချန်ထားလို့မရပါဘူး။
recursive function ဆိုတာ fuction သည် မိမိဘာသာ ပြန်လည်ခေါ်ယူ အသုံးပြုခြင်းကို လုပ်ဆောင်တာမျိုးပါ။
Kotlin မှာတော့ tail-recursive လိုမျိုး modern recursive function မျိုးကို အထောက်အပံ့ပေးထားပါတယ်။

tailrec fun getState ( state : State, n : Int ) : State = 
 if ( n<=10 ) state
 else getState ( state.nextState ( ), n-1 )

Kotlin က top-level function တွေသာမက local fuction တွေကိုပါ အထောက်အပံ့ပေးပါတယ်။

fun printTwoThreeTimes ( ) 
 fun printThree ( ) { print(3) }
 printThree ( )
 printThree ( ) 
 }

အဲဒီမှာ printThree ဆိုတဲ့ function က location ဖြစ်ပါတယ်။ local function ကို သူရဲ့ mother function အပြင်ကနေ ခေါ်သုံးလို့မရပါဘူး။


Class and Object

Kotlin က OOP ကို full support ပေးပါတယ်။
class declaration ကတော့ java နဲ့တူတူပါပဲ။ ‘class’ ဆိုတဲ့ keyword နဲ့ပဲပေါ့။

class Person

အဲဒီမှာ Java နဲ့စတူတော့တာက constructor ဆောက်တာကနေ စပါတယ်။ ဒါမျိုးပါ။

val person = Person ( )

သတိထားမိမှာပါ။ ‘new’ keyword မလိုတော့တာကိုလေ။ ဟုတ်တယ်ဟုတ်။

နောက် properties တွေအကြောင်းထပ်ပြောကြတာပေါ့။ ကျွန်တော်တို့မှာ ခုနက Person ဆိုတဲ့ class ရှိတယ်ဆိုကြပါစို့။
အပြည့်အစုံရေးမယ်ဆိုရင် Java မှာ ဆိုရင်တော့ အောက်ကလို ရေးသားပါတယ်။

in Java

အဲဒီ class မှာဆိုရင် properties ၂ ခု ပါပါတယ်။ accessor code တွေကိုတော့ IDE တွေအကူအညီနဲ့ အလွယ်တကူထုတ်ယူထားပါတယ်။
ပြောစရာရှိလာတာက code review ပြန်လုပ်ရင် accessor code တွေ method တွေကို ပြန်ဖတ်ရတာ က annoy ဖြစ်စေပါတယ်။
Kotlin မှာရော ဘယ်လိုရေးရပါလိမ့်။ ဒီလိုရေးပါတယ်။

Person class in Kotlin

constructor ဆောက်တာကတော့ java နဲ့ similar ဖြစ်ပါတယ်။

သူ့မှာ getter setter တို့ကတော့ Kotlin compiler က အလိုအလျောက် ဆောက်ပေးသွားပါတယ်။ custom getter setter အကြောင်းကတော့ နောက်မှ ထပ်ရေးတော့မယ်နော်။
အိုကေ getter setter ရေးစရာမလိုတော့ဘူး၊ ဒါဖြင့်ရင် read-only property တွေအတွက်ကျ ဘယ်လိုလုပ်ကြမလဲ? 
ဆိုလိုတာက getter ပဲ ရှိရမယ့်ဟာမျိုးပေါ့။
စဥ်းစားသွားတယ် ဟုတ်! အဲဒီအတွက် Kotlin က ဒီလို ဖြေရှင်းထားပါတယ်။

read-only property in Kotlin

compiler က error ထိုးနေပါလိမ့်မယ်။

ဒီလောက်ဆိုရင်တော့ သိသွားလောက်ပါပြီ။

Kotlin မှာ write-only prperty ကိုတော့ support မပေးထားပါဘူး။

ဒီတစ်ပတ်တော့ ဒီလောက်ပါပဲနော်။ နောက်အပတ်ကျမှ ဆက်ကြတာပေါ့။

see you