AndroidX → Android KTX

Ta Theerasan Tonthongkam
ta tonthongkam
Published in
3 min readJul 4, 2018

ในโลกของการพัฒนา โค้ดจำเป็นต้องมี pattern เพื่อให้เราเข้าใจระเบียบวิธีการทำงานของโค้ด แต่บางครั้ง pattern มันก็มากเกินไป อาจจะเป็นสาเหตุของความผิดพลาดของโปรแกรมด้วยซ้ำ — แต่ในโลกของ Kotlin เราสามารถกำจัดปัญหานี้ได้ และวิธีเดียวกันนี้ก็มีในโลกของ Android เช่นกัน เราเรียกสิ่งนี้ว่า Android KTX

คุณเคยประสบปัญหานี้หรือไม่

ต้องเขียนโค้ดซ้ำๆ แบบนี้

this.beginTransaction()
.replace(R.id.my_fragment_container,
fragment,
FRAGMENT_TAG)
.commit()

ทั้งๆ ที่ทุกคนต้องการ Replace Fragment ทั้งนั้น ทำไมต้องทำการ Commit อีก, ทำไม ทำมายยยยยยย — แต่ซาร่าห์คุณจะไม่เจอปัญหานี้อีกเลย ถ้าคุณใช้ Android X

supportFragmentManager.transaction(allowStateLoss = true) {
replace(R.id.my_fragment_container,
fragment,
FRAGMENT_TAG)
}

จะสังเกตได้ว่าคำสั่ง comit() หายไป, beginTransaction เปลี่ยนเป็น transaction แทน เพื่อให้ตรงคอนเซปของโค้ด, ข้อดีคือ เราจะสามารถเปลี่ยน fragment ได้โดยไม่ลืม comit อีกเลย ถถถถถถถถ

และนี้คือคุณสมบัติของ Android KTX.

Android KTX

ถูกพัฒนามาเพื่อลดโค้ดขยะ ของการเขียน Android แน่นอนว่ามันใช้ feature Kotlin extension เต็มๆ เลย ดังนั้นหัด Kotlin ได้แล้ว

Get Start

เริ่มจากเพิ่ม Depedencies ก่อนเลย

dependencies {
implementation 'androidx.core:core-ktx:1.0.0-alpha1'
}

dependencies ที่เราเพิ่มเข้าไปนั้นคือ core-ktx → core (AppCompat) → Android Platform

สังเกตุ artifact จะเปลี่ยนไปจาก android.<feature>เป็น androidx.<feature> ส่วน androidx มาได้ไง จะเขียน blog สรุปอีกครั้ง

แน่นอนว่า Android KTX ไม่ได้มีแค่ Core แต่ยังมี Extension อื่นๆ ที่จำเป็นอีกด้วย

all Android KTX Library

เพื่อไม่ให้เป็นการนำ Library ที่ไม่จำเป็นมาใส่ในโค้ดเยอะเกินไป, ทีม Android เลยแบ่ง Extension เป็นหมวดหมู่เหมือนรูปข้างบน และในโค้ดบรรดา JetPack ทั้งหมด Paginate, Slice และ WorkManager ยังไม่มี Extension นาจา

เพราะ Paginate, Slice และ WorkManager เป็นอะไรที่ใหม่มากสำหรับทีม Android เอง และยังคงมี Feed back เกี่ยวกับ Library เหล่านี้น้อย เลยยังไม่มี Extension ใดๆ ออกมา

สิ่งที่คาดว่าจะอยู่ใน Android KTX?

แน่นอนว่า Android KTX ใช้ killing feature ของ Kotlin นั้นคือ function Extension. แสดงว่าถ้าเรามีอะไรที่เป็น Pain point เยอะๆ ของ Android เราก็สามารถที่จะสร้าง Extension ออกมาใช้ได้เองเช่น Blog นี้เป็นต้น

แต่การที่ทีม Android จะเพิ่ม Extension ไปซะทุกอย่าง มันอาจจะทำให้ดู “รก” และดูเหมือนมีโค้ดเยอะไปหน่อย Android KTX เลยมี หลักการง่ายๆ ดังนี้

Android KTX principle

i. เอาฟังก์ชันที่มีอยู่เดิมแล้ว มาปรับปรุงให้ใช้งานง่ายขึ้น และมีประโยชน์มากขึ้น
ii. ทำฟังก์ชันเป็น inline เพื่อลบโค้ดไม่จำเป็นทิ้ง
iii. ใช้ประโยชน์จาก Kotlin ให้มากที่สุด

Kotlin
val isDigit = TextUtils.isDigitsOnly("085133450X")
Kotlin + AndroidX
"085133450X".isDigitOnly()

จากโค้ด จะเห็นว่า ถ้าเราอยาก Validate ว่า User ใส่เบอร์โทรมาเฉพาะตัวเลขหรือป่าว การเรียก TextUtils.isDigiOnly() ทุกครั้งก็ดูเหมือนจะเป็นโค้ดขยะไป ดังนั้น Extend CharSequence ไปเลยง่ายกว่า มีตัวอย่างอีกอัน

Kotin
val uri = Uri.parse(myUriString)
Kotlin + AndroidX
val uri = myUriString.toUri()

โค้ดข้างบนเราเห็นชัดเลยว่า Uri.parse มันมีอยู่แล้ว แต่เราสร้าง Extension ให้ String เพื่อให้มันทำงานง่ายขึ้น โค้ด iSDigitOnly() และ toUri() มันตอบโจทย์ i มาก

Kotlin
for (i in 0..view.childCount) {
doSomething()
}
Kotlin + AndroidX
view.children.forEachIndexed { index, view -> doSomething() }

ส่วนโค้ดนี้ มีนการใช้ประโยชน์จาก Kotlin มาก Extend ViewGroup และเขียนเป็นแบบ inline ทำให้อ่านโค้ดง่ายขึ้น โค้ดสั้นลง ตอบโจยท์ ข้อ ii และ iii มาก

iv. จะไม่ทำ Code Golf — หรือการทำให้โค้ดสั้นลง โดยไม่จำเป็น
แน่นอนว่า AndroidKTX ต้องรับฟีดแบคจากนักพัฒนาทั่วโลกอยู่แล้ว เลยมีคำขอ Feature เยอะมาก และ feature ยอดฮิตเลยคือ view.click

Kotlin
view.setOnClickListener { v -> doSomething()}
Request
view.click { v -> doSomething()}

จากโค้ดข้างต้น ทำได้แค่เพียงเปลี่ยนชื่อจาก setOnClickListenerclick แน่นอนว่ามันมีเหตุผลหลักๆ ที่ทีม Android ไม่รับข้อเสนอนี้ มันเป็นแค่การเปลี่ยนชื่อให้สั้นลง แต่วิธีเรียกใช้งานเหมือนเดิม — ทั้งๆ ที่ Android Studio ก็มี feature ที่ยอดเยี่ยมอยู่แล้ว พิมแค่ view.se… คุณก็ได้โค้ดที่ต้องการแล้ว ไม่มีเหตุผลที่ต้องแก้ให้สั้นขึ้น หรือ Advance กว่านั้นพิมพ์แค่ view.socl ก็ได้

พิมพ์แค่ view.socl ก็มีตัวเลือกให้เลือกแล้ว

v. ทำ Extension มาเพื่อใช่เพียงวัตถุประสงค์เดียว
แน่นอนว่าการทำ Android KTX เป็นการทำเพื่อลด Painpoint ของนักพัฒนา เงื่อนไงที่จะมีใน Android KTX ได้ต้อง เจอบ่อยจริงๆ และได้รับฟีดแบคเยอะจริงๆ

More Example

Kotlin
sharedPreferences.edit()
.putBoolean("key", value)
.apply()
Request
sharedPreferences.edit { putBoolean("key", value) }

จากโค้ดข้างบน เดิมทีคงมีคนเคยลืมเรียก method .apply() บ้างหละ, แน่นอนว่า ตัว KTX จะทำให้เราไม่ต้องเผชิญปัญหานั้นอีก

Kotlin
db.beginTransaction()
try {
// insert data
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
Request
db.transaction { // insert data }

โค้ดที่จัดการเกี่ยวกับ Database แน่นอนว่ามันค่อยข้างมี Pattern ที่ตายตัวมาก แต่เราอยากเขียนโค้ดที่ “ไม่จำเป็นกับ Business logic” มากๆ เหรอ — ป๊าววเลย(ตอบให้) KTX ก็ช่วยให้เราเขียนโค้ดกระชับขึ้นอีกแหละ

จะให้ยกตัวอย่างหมดคงไม่ไหว เพราะเขาทำมาเยอะมาก ลองอ่านเพิ่มได้ที่นี่

Alert!!

AndroidX และ Android KTX ยังเป็น alpha อยู่นะ นั้นหมายความว่าพวกชื่อตัวแปร หรือ Return type ยังไม่นิ่ง ใครที่จะเริ่มใช้มันตอนนี้ ใช้ได้นะ แต่ต้องรอรับความเปลี่ยนแปลงด้วย — และไม่เหมาะที่จะใช้ใน Production นะ

AndroidX

AndroidX พูดง่ายๆ คือ Android Support Library ที่ Refactor มาใหม่ ให้มันมีชื่อที่ไม่ซับซ้อน และลดปัญหาทางด้าน Technical ของการพัฒนา Android ลง

Android KTX เป็น feature ใหม่ของ Library การที่เราขะใช้ AndroidX ได้เราต้อง Migrate โปรเจคเก่าเรามาเป็น AndroidX ก่อนนาจา — แน่นอนว่า Android Studio 3.2 มีฟังก์ชันนี้ อ่านต่อที่ https://developer.android.com/topic/libraries/support-library/refactor

สรุป

Android KTX คือ feature ใน AndroidX, เป็นหนึ่งใน library แนะนำของ Jetpack. ช่วยให้เราเขียนโค้ดง่ายขึ้น กระชับขึ้น ลดความผิดพลาดลง และคาดว่าในอนาคตอันใกล้นี้ KTX จะมี feature และฟังก์ชันมากขึ้นเรื่อยๆ ติดตามข่าวสารไว้ด้วยนะครัช จะได้มีของเล่นใหม่ใช้อยู่ตลอด

ขอบคุณที่อ่านจนจบจ้าาา

— จบ —

--

--