Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Kotlin meetup #01] สรุปความสามารถที่น่าสนใจของภาษา Kotlin

$
0
0

kotlin-01

kotlin-01 จากงาน Thailand Developer Konference #1 ของกลุ่ม Thailand Kotlin Android Developer มีหลายเรื่องที่น่าสนใจ ไม่ว่าจะเป็น feature ของภาษา Kotlin ไม่ว่าจะเป็นการนำมาพัฒนา Android app ไม่ว่าจะเป็นการใช้งานร่วมกับ Android Studio แต่ขอทำการสรุปเรื่อง feature ที่น่าสนใจของภาษา Kotlin ไว้นิดหน่อย ที่สำคัญสามารถนำมาพัฒนา Android app ได้แบบสบาย ๆ นะ เหตุผลแสดงดังรูป kotling-02

เริ่มจาก Null Safety

ปัญหาของ Null ในภาษา Java นั้นจัดการลำบากบาก ๆ แน่นอนว่าทำให้เจอปัญหา NullPointerException (NPE) บ่อยมาก !! รวมทั้งใน code มีการตรวจสอบค่า Null ของตัวแปรต่าง ๆ วุ่นวายไปหมด ซึ่งเป็นหนึ่งในความผิดพลาดของภาษาโปรแกรม ดังนั้น Kotlin จึงออกแบบมาเพื่อแก้ไขปัญหานี้ ให้สามารถกำหนดได้ว่ามีข้อมูลชนิดใด ตามความต้องการ เช่น
  • Non-null
  • Nullable
มาดูตัวอย่างกัน เริ่มด้วย Non-null [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nonnull.kt"] ดังนั้นจึงไม่สามารถกำหนดค่า Null ให้กับตัวแปรที่เป็น Non-null ได้ ทำให้ code ปลอดภัยมากขึ้นเยอะ ต่อมาคือ Nullable นั่นคืออนุญาตให้เป็นค่า Null ได้ แต่จะมีปัญหาตามมาก็คือ ถ้ามีการเรียกใช้ method/property ของตัวแปรนั้น ๆ จะเกิด error ตอน compile ขึ้นมา สามารถเขียนได้ดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable.kt"] จาก error message จะบอกวิธีการแก้ไขให้แล้ว ซึ่งมี 2 วิธีที่ให้ผลที่แตกต่างกัน [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable02.kt"] จากเอกสารอธิบายเพิ่มอีกว่าสามารถใช้ Safe call แบบต่อ ๆ กันได้ด้วย ซึ่งผลการทำงานจะได้ค่า Null กลับมา ไม่เกิด NullPointerException นะ เมื่อทำการเรียกใช้งาน property/method ของ null object แสดงดังตัวอย่าง [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="nullable_chain.kt"] บ่อยครั้งที่ระบบต้องทำงานกับข้อมูลที่ Non-null เท่านั้น แต่ในชุดของข้อมูลกลับมีบางตัวที่เป็น Null ดังนั้นเราสามารถกรองข้อมูลเหล่านั้นออกไปด้วยการใช้ let แสดงดังตัวอย่าง [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_01.kt"] ซึ่งจะพบว่าเกิด Error ขึ้นมาเมื่อเจอกับข้อมูลที่เป็น Null แต่ถ้าไม่ต้องการเราสามารถกรองออกไปได้ ดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_02.kt"] หรืออาจจะใช้งานผ่าน Collection ก็ได้นะ ซึ่งมี method filterNotNull() ให้ใช้งานดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="filter_null_03.kt"] ทำให้การเขียน code ง่ายและสะดวกมากยิ่งขึ้น ยังไม่พอนะเรื่องของ Null Safety  เช่นถ้าเราพยายาม cast type ของข้อมูลที่ผิด ๆ แล้ว มักจะเกิด ClassCastException ขึ้นมา แต่ใน Kotlin นั้นจะทำการ return ค่า null ออกมาให้ ดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="cast_null.kt"] เยอะจริง ๆ แต่มีประโยชน์มาก

ต่อมาเรื่องของ Enum Class

Enum ใน Java นั้นใช้กันน้อยมาก เนื่องจากความสามารถของ Enum ไม่เยอะเท่าไร รวมทั้งใช้งานยาก แต่ใน Kotlin นั้นทำให้ใช้งานง่ายและมีประโยชน์ สำหรับคนที่เขียนภาษา Swift มาคงไม่แปลกใจเท่าไร เนื่องจากมันเหมือนกันเลย ในการใช้งานเบื้องต้นคือ การกำหนดค่าคงที่ขึ้นมา ซึ่งเราสามารถกำหนดค่าให้ได้ แถมประกาศ Anonymous class ข้างในได้อีก ตัวอย่างเช่นเรื่องของเพศ (Gender) [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="enum.kt"]

ต่อมาเรื่องของ Immutable ของตัวแปรต่าง ๆ ซึ่ง build-in มาใน Kotlin เลย

ซึ่งมีทั้ง mutable และ immutable หลาย ๆ คนฟังแล้วก็อาจจะงงว่ามันคืออะไรกัน ? อธิบายง่าย ๆ คือ ตัวแปรที่เป็น immutable คือ ไม่สามารถกำหนดค่าซ้ำได้ ดังนั้นค่าของตัวแปรจะไม่มีการเปลี่ยนแปลงเลย ถ้าใครพยายามจะทำการแก้ไข จะ compile error ทันที ส่วน mutable ก็ตรงกันข้าม ทำอะไรกับมันก็ได้ โดยตัวแปรที่ต้องการให้เป็น immutable ก็ประกาศด้วย val เท่านั้นเอง ส่วน mutable ก็ใช้ var ไป ดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="immutable.kt"]

ต่อมาเรื่องของ Properties และ Fields ใน Class ต่าง ๆ

โดย property ใน class นั้นมีอยู่ 2 แบบ คือ
  1. ถ้าต้องการให้เป็นแบบ read-only ก็ประกาศด้วย val
  2. ถ้าต้องการทั้ง read และ write หรือ mutable ก็ประกาศด้วย var
ส่วนการเรียกใช้งาน property ต่าง ๆ สามารถเรียกใช้ผ่านชื่อ property ได้เลยดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person.kt"] แต่ถ้าต้องการกำหนด getter/setter ในแต่ละ property ก็ทำได้ง่าย ๆ ดังนี้ [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person02.kt"] ยังไม่พอนะ มีเรื่องของ Delegate Property อีก เป็นความสามารถที่น่าสนใจก็คือ เราสามารถเฝ้าดูการเปลี่ยนแปลงค่าของ property ต่าง ๆ ได้ (Observable) ตัวอย่างเช่นเฝ้าดูการเปลี่ยนค่าของ firstName ใน Person [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Person03.kt"] จากความสามารถนี้เราสามารถนำไปใช้ประโยชน์ได้อย่างมาก เช่นเมื่อเกิดการเปลี่ยนแปลงค่าต่าง ๆ จะให้ทำอะไรบ้าง ถ้าเป็นแบบปกติเราต้องสร้าง interface และ implement code ให้วุ่นวายกันอย่างมาก แต่ใน Kotlin ได้เตรียมไว้ให้หมดแล้ว

ต่อมาคือเรื่องของ Data Class

สำหรับ class ที่สร้างขึ้นมาสำหรับเก็บข้อมูลต่าง ๆ (Data class) ซึ่งเรามักจะเรียกว่า POJO บ้าง Data Object บ้าง Transfer Object บ้าง Bean class บ้าง Entity class บ้าง โดยมีส่วนการทำงานต่าง ๆ เหมือนกัน และ ต้องเขียน code ซ้ำ ๆ เช่น
  • Constructor และ overload constructor
  • Getter/Setter method
  • Equals() method
  • HashCode() method
  • toString() method
  • การ copy
ซึ่งมันเป็นเรื่องที่น่าเบื่อหน่ายอย่างมาก บางคนก็บอกว่าใช้เครื่องมือช่วย generate code สิ แต่ code มันก็เยอะเหมือนเดิม ดังนั้นใน Kotlin จึงเตรียมสิ่งต่าง ๆ เหล่านี้ไว้ให้ใน Data class โดยที่ Data class จะต้องมีคุณสมบัติต่าง ๆ ดังนี้
  • ใน constructor จะต้องมี parameter อย่างน้อย 1 ตัว
  • ในการประกาศ parameter ต้องกำหนดว่าเป็น immutable หรือ mutable ด้วย val หรือ var เสมอ
  • Data class ไม่สามารถเป็น abstract class ได้
  • Data class ไม่สามารถ extend จาก class อื่น ๆ ได้
[gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Dataclass.kt"]

ปิดด้วย Extension function ก็แล้วกัน

ใน Kotlin นั้นสามารถเพิ่มความสามารถเพิ่มเติมของ class ต่าง ๆ ด้วยการใช้งาน extension โดยไม่ต้องมาทำการ inheritance อีกต่อไป ตัวอย่างเช่น ถ้าต้องการเพิ่มความสามารถของ Int ด้วยการเพิ่ม Day() และ Hour() สำหรับการแปลงวันเป็นชั่วโมง ทำให้ code เราอ่านง่าย และ เข้าใจง่ายขึ้น แถมสะดวกอีกด้วย ดังตัวอย่าง [gist id="0fe7576363adbe328c60dcc6fb110ea3" file="Extension.kt"]
ปล. ความสามารถยังมีอีกเยอะเลย ลองไปศึกษาเพิ่มเติมได้จาก Kotlin Document Reference รวมทั้งฝึกเขียน Kotlin ผ่าน web ที่ Try Kotlin

ยังไม่พอนะ Kotlin ยังสามารถนำไปพัฒนาระบบต่าง ๆ ได้เช่น

มีข้อดีก็ย่อมต้องมีข้อเสียกันด้วย

ทั้ง community ที่ยังมีขนาดเล็กอยู่ ทั้งเรื่องความเข้ากันได้กับ library บางตัวเช่น Mockito ปัญหาและอุปสรรคสำคัญของการนำ Kotlin มาใช้ไม่ใช่เรื่องของ feature นะ แต่มันคือเรื่องของคนล้วน ๆ ทั้งการโน้มน้าวให้หัวหน้าเชื่อ ทั้งการโน้มน้าวให้ทีมเชื่อ และตัวคุณเอง !!

สามารถดูเพิ่มเติมได้จาก


Viewing all articles
Browse latest Browse all 1997

Trending Articles