Kotlin Extension Function ภารกิจพิทักษ์จักรวาลลลลลล ~~~~ Vol.1

Thaveelid Junsead
te<h @TDG
Published in
2 min readJun 23, 2020
https://www.wallpaperflare.com/guardians-of-the-galaxy-movie-poster-marvel-comics-star-lord-wallpaper-qxejk

ก่อนอื่นเลยต้องขอบอกก่อนว่า เพิ่งได้มีโอกาสเขียนและใช้งาน Kotlin อย่างจริงจังได้ไม่นานหนัก และเมื่อเริ่มใช้งานไปได้ซักพัก ก็รู้สึกว้าวววว กับเจ้าตัว Extension Function ของ Kotlin เป็นอย่างมาก จึงเป็นที่มาของสิ่งที่จะพูดถึงในวันนี้

มาเริ่มกันเลยยย !~

Extension Function นั้นอยู่ใน Kotlin standard library ซึ่งเราสามารถนำมาใช้งานได้เลย Extension Function ถ้าให้พูดง่ายๆและสั้นที่สุด มันก็เหมือนกับ การที่เราสามารถขยายความสามารถหรือเพิ่มฟังก์ชันเข้าไปใหม่ให้กับ Class ตามที่เราต้องการนั้นเอง ตัวอย่างเช่น

fun String.toMinute() = "$this Minutes"

fun main(args: Array<String>) {
val countDown = "29"
println(countDown.toMinute()) // "29 Minutes"
}

จากตัวอย่างด้านบน ก็เป็นการเพิ่มความสามารถให้กับ String ให้สามารถมีข้อความต่อท้ายในตัว String เองได้ จะเห็นได้ว่าสั้นและใช้งานง่ายมากๆ แต่ถ้าเป็น Java เราคงต้องเขียนกันแบบ Utility method ซึ่งก็หน้าจะรู้กันอยู่แล้วว่าจะเป็นแบบไหน ฮ่าๆ มาดูต่อกันอีกซักตัวอย่างนึง

// Utility method in Java
public static String formatDDMMYYYY(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return sdf.format(date);
}
// Extension Function in Kotlin
fun Date.formatDDMMYYYY(): String {
val sdf = SimpleDateFormat("dd-MM-yyyy")
return sdf.format(this)
}

จะเห็นได้ว่า การเรียกใช้งานแบบ Extension Function ที่เรียกใช้ Class Date ในการเปลื่ยน format นั้นมีความเรียบง่าย ดูน่าใช้งานและสามารถใช้งานได้หลากหลายกว่า Utility Class ที่ต้องประกาศ Static method

https://www.pinterest.com/pin/717620521848467046/

นอกจากนี้ยังมี Extension properties อีกด้วย ตัวอย่างการใช้งานเช่น ถ้าเราต้องการจะหา Index สุดท้ายของ List ที่เราใช้งาน เราก็ต้องใช้ list.size -1 แบบนี้ในทุกๆที่ ที่เราเรียกใช้งานตลอด แต่ถ้าเราสร้าง properties เป็นของตัวเอง แบบนี้ละ

val <T> List<T>.lastIndex: Int
get() = this.size - 1
// How to use
val numbers = listOf("1", "2", "3")
println("Last number index is ${numbers.lastIndex}")

มันจะทำให้เราสร้าง properties แค่ที่เดียว แต่สามารถเรียกใช้งาน .lastIndex() ได้ทุกที่ ที่เราต้องการเลย สะดวกไหมละ !!

หรือถ้าเราต้องการ First element ของ List ตัวที่เราทำงานกับมันอยู่ละ จะต้องมาใช้ list[0] ในทุกๆที่เลยใช่ไหม คำตอบคือใช่ 5555 แต่ถ้าเราสร้าง properties เพิ่มขึ้นอีกซักตัว หน้าตาประมานนี้

fun <T> List<T>.first(): T {
if (isEmpty())
throw NoSuchElementException("List is empty.")
return this[0]
}
//How to use
val names = listOf("Mike", "Pepo", "Louis")
println("The best friend is ${names.first()}")

ดูสั้นๆ แต่ทรงพลัง เพียงเท่านี้เราก็สามารถ ใช้ .first() กับ List ที่เราต้องการข้อมูลของมันได้แล้ว แถมยังสามารถใช้งานได้จากทุกที่อีกด้วยเยี่ยมจริง ๆ

ทั้งนี้อยากแนะนำว่าควรจะสร้างไฟล์ Extensions.kt แยกไว้ สำหรับเก็บ Extensions Function เพื่อที่ Class ต่างๆ ที่เราสร้าง Extensions ไว้จะได้สามารถเรียกใช้งานได้จากทุกๆที่อยู่ใน package เดียวกัน

สรุป

Kotlin Extension ทั้ง Function/Properties เป็นสิ่งอำนวยความสะดวกที่จะช่วยให้นักพัฒนาอย่างพวกเรา ง่ายต่อการเขียน Code และเพิ่มความสามารถให้หลากหลายและเหมาะกับการทำงานของเรา ส่วน Vol. ต่อไป เราจะมาดู Extension ที่น่าสนใจและเราน่าจะได้ใช้งานบ่อยๆกัน หวังว่าเพื่อนๆคงได้ประโยชน์จากบทความนี้กันนะครับ สำหรับวันนี้ขอบคุณครับ บรัยย~~!

ถ้ายังอยากจะอ่านต่อ ก็สามารถไปอ่านต่อกันจากลิ้งค์ด้านล่างได้เลยครับ ^ ^

--

--