มา meetup แรกของปีนี้ ที่งาน Kotlin Meetup 2019.1
เดี๋ยวนะเดี๋ยวนี้ไม่นับเป็น version ของ Kotlin แล้วใช่ไหมค่ะ 555

เรียกได้ว่าช่วงต้นปีไม่ได้ไปงานอะไรเลย เพราะไม่ค่อยมีจัดเท่าไหร่ในเดือนแรกของปี 2019 นี้ แล้วเริ่มมาจัดกันเดือนนี้นะ ซึ่งงานนี้กดบัตรตั้งแต่นาทีแรกๆเช่นเคย และพบว่าบัตรหมดในเวลาประมาณ 24 ชั่วโมงด้วยอ่ะ สุดจริง
สถานที่จัดงาน คือ Fastwork สามารถรองรับคนได้เยอะเลยแหละ แถมเดินทางสะดวกเพราะ Fastwork ตั้งอยู่บนตึก Emporium นั่นเอง ลง BTS พร้อมพงษ์ ไม่เผลอไผลกับร้านข้าวหน้าปลาไหลและราเมงฮัทแถวนั้นก็น่าจะมาถึงได้ไว 555555 //ว่าแต่ Fastwork อยู่ชั้นไหนนะ แล้วต้องแลกบัตรแม่ะ? มีโพสของ speaker บอกวิธีการเดินทางล่วยยยย
วันนี้มี Kotlin Meetup 2019.1 นะครับ ผมพูดเรื่อง composition over inheritance สไตล์ OOP มี pizza + soft drinks พร้อม...
Posted by Travis P Subannaphong on Wednesday, February 27, 2019
พอมาถึงก็หูอื้อเลย เพราะเป็นลิฟต์ชั้นสูงๆ 55555
เข้ามาก็หาอะไรทานหน่อยโน๊ะ ซึ่งพิซซ่าอร่อยมาก และมี soft drink ที่แอบเข้าใจว่าเป็นสวัสดิการของ Fastwork ด้วย

และแล้วเวลา 1 ทุ่มโดยประมาณ ก็ได้เวลา เปิดงาน โดยพี่เบิร์ดเช่นเคยค่าาา

และมีช่วงแนะนำ Fastwork โดยคุณเฟิร์น Head of Talent ของ Fastwork ค่าาา (ชอบชื่อตำแหน่งมาก จริงๆก็คือ HR นั่นแหละจ้า)

ตอนนี้ Fastwork มีสาขาที่อินโดด้วย (รู้สึกว่า startup ในไทยหลายๆที่ไปขยายสาขาที่อินโดด้วย เช่น ฟังใจ) อยู่ใน series A และกำลัง rising สู่ A+ จ้า
Fastwork มีแบบ Enterprise ด้วยหล่ะ เผื่อใครสนใจ มีเปรียบเทียบว่าถูกและดีกว่า agency

สำหรับส่วน Engineering จะอยู่ใน HQ ที่ไทยแห่งนี้จ้า ซึ่งจุดที่น่าสนใจ คือ kotlin multiplatform, developer ที่นี่จะเขียน Swift และ Kotlin ได้ การทำ multiplatform เป็นการลด cost ในเรื่อง 2 code base เข้าด้วยกัน แต่ส่วน UI แยกกันทำตาม platform นะ

What is new in 1.3.20 by Verachad Wongsawangtham [Lead Mobile Engineer @ Fastwork]

เป็นเนื้อหาเบาๆ (ที่ควรเรากลับไปหาข้อมูลเพื่อเข้าใจเพิ่มเติม) สำหรับการ update version kotlin 1.3 ไปยัง 1.3.20 มี 3 หัวข้อหลักด้วยกัน
Improvement for Kotlin Gradle DSL
สำหรับใครที่ไม่รู้จัก Kotlin Gradle DSL สามารถดูคลิปนี้ได้จ้า
หลักๆเลย คือ support multiplatform project ให้มีความ flexible และ auto complete เนื่องจากเดิมที เวลาเราจะแก้พวก gradle ที่ไม่มี document โดยเฉพาะ มันช่างยุ่งยากเหลือเกิน และต้องมานั่งหาเองตาม stackoverflow ลองผิดลองถูกแล้วแต่บุญกรรมที่ทำมา

อ่านเพิ่มเติมได้ที่
https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html
Inline Class
ก่อนคือพูดถึง Inline Function กันก่อนน มันจะถูกแทนที่ด้วย content ของ function ใช่ม่ะ ส่วนเจ้า Inline Class ก็จะคล้ายๆกัน ซึ่งทุกครั้งที่สร้าง object ใหม่ขึ้นมา ทุกครั้งที่ใช้ก็จะถูกสร้างขึ้นเรื่อยๆ ก็จะเกิด overhead ทำให้ memory leak ได้
มีตัวอย่างให้ดูด้วย ตอนแรกจะเป็นแบบนี้

อันนี้อธิบายเรื่อง Inline Function ถ้าจำไม่ผิดนะ
fun Long.formatFileSize() : String {
return ""
}
ตอนเอาไปใช้ก็จะเป็น
1234L.formatFileSize()
สุดท้ายเจ้า Inline Class เมื่อ decompile ออกมาเป็น byte code จะเป็น static method เรียก 2 ครั้งเหมือนกันแต่เป็น 2 ครั้งแรก จะไม่เรียกทุกครั้งที่เรียกใช้ object

แต่ๆๆๆๆ มันไม่ compatible กับ Java นะ เพราะมันห้ามมี symbol ในชื่อ method และยังอยู่ใน experimental อยู่
อ่านเพิ่มเติมได้ที่
https://kotlinlang.org/docs/reference/inline-classes.html
Contract
สัญญาใจระหว่างเราและ compiler กับโค้ดที่เราเขียน และมี 2 type คือ ซึ่งจริงๆจด detail ไม่ทันเท่าไหร่ ฮืออออ ฟังอย่างตั้งใจแต่ลืมจด

ตอนใช้ใส่ @ExperimantalContracts
ไว้หน้า method นะ

ถ้าไม่ใส่ จะเรียกใช้ไม่ได้ อาจจะแก้โดยการประกาศเป็น lateinit var

การใส่ contract จะบอก compiler ว่าถูกเรียกใช้สิ่งนี้ 1 ครั้งแน่นอนจากการ run ในครั้งนี้
อ่านเพิ่มเติมได้ที่
สุดท้าย KEEP เปิด feature ที่เราอยากให้ Kotlin มี และสามารถอ่านทิศทางในการพัฒนาภาษา Kotlin ได้ที่นี่เลย
แอบเพิ่มเติมนะ อันนี้ video ย้อนหลัง session แรกจากทางกูโค้ดค่าา
Composition over inheritance like a boss by Travis Subannaphong [Senior Android Software Engineer @ Fastwork]

มีการเปลี่ยนชื่อ session เล็กน้อย พร้อมบอกว่ายังไม่ได้พูดถึง functional ในตอนนี้นะเออ
ตอนแนะนำตัว มีขายของด้วย งั้นขายเลยแล้วกัน เป็น Co-Founder บล็อก Kotlin ที่ดีที่สุดในประเทศไทย นั่นคือออออ

ขายให้เขาทำไมหล่ะ คือเราเป็น writer ของที่นี่ด้วยง่ะ เอ้าาา ฝากร้านน
หลักจาก speaker ได้ฝากร้านกันไปแล้ว ใน session นี้จะกล่าวถึงการสร้าง hero class แต่ละตัว ซึ่งเป็นตัวละครใน โดต้า2 (กริบ) ดอทเอสอง (เฮ) ซึ่งบอกตามตรง เคยแต่ได้ยินชื่อเกมส์ (กา กา กา….)
Majority การเขียนโค้ดขึ้นอยู่กับ Inheritance
hero แต่ละตัวหลักๆก็จะมี move การเคลื่อนที่ และ attract การโจมตี ซึ่งแต่ละตัวจะมีคุณสมบัติไม่เหมือนกัน เช่น สองตัวนี้ Sven และ BloodSeeker จะเดินและตีใกล้เหมือนกัน

ส่วนคนนี้ Slardar เคลื่อนที่ด้วยการเลื้อย ก็ override move ไป
อีกตัว DrowRanger โจมตีไกล ก็ override attract ไป

ในเกมส์ยังมี hero อื่นๆอีก แล้วก็ override ไปเรื่อยๆๆๆ สุดท้าย duplicate duplicate duplicate

เปลี่ยนจาก Inheritance เป็น Composition
Composition เป็นการห่อแต่ละส่วนเป็น object แต่ละก้อน ดังนั้นจะมีการใช้ abstract class และเพิ่ม interface แล้วมา implement กัน อ่ะชีวิตดูง่ายขึ้นแล้ว


ต่อมาสร้าง hero แต่ละตัวจากการเอา object มา compose กัน คือ delegation เอางานให้คนอื่นทำ

ตัวโค้ดจะเป็นการ reuse แต่ๆๆๆๆก็ยังมีความ duplicate จากการ override ต่างๆนั่นเอง
Implementation by Delegation
Kotlin มันมีความแฟตาซีในจุดนี้ เราไม่ต้อง delicate core ให้เจ้า kotlin จัดการ สุดท้ายจะได้ผลลัพธ์เหมือนกัน โดยพิสูจน์จาก bytecode

แต่ก็มีบางตัวที่ blink ได้นี่นาาา ว่าแต่ blink คืออะไร ใช่อันนี้ไหมนะ

ไม่ใช่เนอะ ดังนั้นเราสร้าง Blinker เพิ่ม เพราะ hero แต่ละตัวมี range ต่างกัน

Dependency Injection เราสามารถทำได้โดยรับจาก constructor

คอนเซป Mixin ใน Flutter ก็เอามาใช้ได้นะ
Mixin เป็นการ reuse class body/function หรืออื่นๆ โดยไม่ Inherit กัน
ซึ่งทำได้โดยการทำ class deligation ได้ เป็นการห่อเป็นก้อนๆแล้วแปะ

Default Implementation Interface
ถ้าประกาศ interface อาจจะต้องใส่ค่าเพิ่มด้านนอก การมี Mixin มาช่วยทำให้เราไม่ต้องประกาศค่าเองซํ้าๆ

สามารถอ่านเพิ่มเติมได้ที่
https://kotlinlang.org/docs/reference/delegation.html
https://en.wikipedia.org/wiki/Delegation_pattern
อันนี้สไลด์ของ speaker จ้าา
เพิ่มเติม video session ที่ 2 ค่าา
Composition over inheritance like a boss by Travis P Subannaphong Kotlin Meetup 2019.1 by Thai Kotlin Developer
Posted by กูโค้ด on Wednesday, February 27, 2019
สุดท้ายพี่เบิร์ดกล่าวปิด ถ้าใครอยากจัดกิจกรรมอะไร หรืออยากจัดอะไรแล้วอยากใช้สถานที่เป็น Fastwork ก็ติดต่อได้จ้า
ส่วน meetup ครั้งหน้านั้น น่าจะเดือนเมษายน ซึ่งเป็นเดือนที่หยุดเยอะพอสมควรเลยหล่ะ ติดตามรายละเอียดได้เลย ไหนๆเขาก็มีเพจแล้วเนอะ
สุดท้ายฝากร้านกันสักนิด ฝากเพจด้วยนะจ๊ะ
อย่าลืมกด like กด share บทความกันด้วยนะคะ :)
Posted by MikkiPastel on Sunday, December 10, 2017