จาก session Architecture Components in Real Life (Android) ในงาน Mobile Conf 2018
มีคำถามหนึ่งที่น่าสนใจคือ
ทาง Google ได้ปล่อย source code ของ Google I/O 2018 app ออกมา
เหล่า Android developer ได้เข้าไปดู เข้าไปศึกษาหรือไม่ ?
คำตอบที่ได้รับกลับมาคือ เงียบ (อาจจะมีคนเข้าไปดูก็ได้ แต่ไม่แสดงตัวเท่านั้นเอง)
เป็นสิ่งที่แปลกมาก ๆ นะ (หรือเป็นเรื่องปกติไปแล้วนะ)
ดังนั้นเหล่า Android developer มาลองศึกษากันหน่อย ว่า Google I/O 2018 app นั้นเขาพัฒนากันออกมาอย่างไร ? มีโครงสร้างอย่างไรบ้าง ? ดังนั้นมาลองดูกัน
เมื่อเข้าไปดูก็พบว่า
ใน Android Developer Blog เขียนอธิบายไว้คร่าว ๆ แล้ว ถูกเขียนใหม่ ด้วยโครงสร้างใหม่ นั่นก็คือ Architecture Component และภาษา Kotlin ซึ่งมีโครงสร้างดังรูป จากรูปโครงสร้างของ app ประกอบไปด้วย- Presentation layer สำหรับการแสดงผลซึ่งมีสองส่วนหลักคือ Activity/Fragment และ ViewModel โดยในส่วนนี้จะใช้งาน Data Binding Library สำหรับการ binding UI เข้ากับข้อมูล หรือ ViewModel ต่อไป
- Domain layer สำหรับ Use case หรือ business process ต่าง ๆ
- Data layer สำหรับการจัดการข้อมูลจาก data source ต่าง ๆ ผ่านสิ่งที่เรียกว่า Repository ประกอบไปด้วย FireStore, Local cache และ Google Cloud Storage โดยที่ข้อมูลจะมีทั้งแบบ static data, schedule data และ realtime data ที่สำคัญ app นี้สนับสนุนการทำงานแบบ offline ด้วยนะ
- Dagger2 จัดการเรื่อง Dependency Injection
- OkHTTP จัดการเรื่องการใช้งาน API ผ่านระบบ network
- Gson สำหรับจัดการข้อมูล JSON
- ThreeTen สำหรับจัดการเรื่อง datetime
- Timber สำหรับจัดการเรื่อง logging
- Crashlytic
ดูไปดูมามันคือ Clean Architecture ชัด ๆ
ยกตัวอย่างของ Use Case ที่อยู่ใน module sharedยังไม่พอนะ ยังมีส่วนของการทดสอบอีกด้วย
ทั้ง Unit testing ด้วย jUnit และ Mockito , Mockito-Kotlin ทั้ง UI testing ด้วย Espresso สิ่งที่น่าสนใจคือ code ใน app นี้มีการทดสอบเยอะมาก ๆ มันสะท้อนให้เห็นว่า โครงสร้างของระบบมันทดสอบได้ง่ายมาก (Testable) ดังนั้นสิ่งที่เหล่านักพัฒนาต้องเข้าใจคือ ถ้าระบบงานของเราทดสอบยากแล้ว มันกำลังบ่งบอกว่า โครงสร้างระบบของเรานั้นไม่ถูกอย่างแน่นอนมาดูโครงสร้าง module ของ app กันหน่อย
ทำการแบ่งออกเป็น module ย่อย ๆ เพื่อแยกส่วนการทำงานต่าง ๆ ออกจากกัน แต่ต้องระวังในเรื่องของ dependency กันด้วยนะ ถ้าออกแบบไม่ดี สิ่งที่เกิดขึ้นคือ cyclic dependency หรือการเรียกกันไปมา Module ต่าง ๆ ประกอบไปด้วย- mobile เป็น module หลักของการทำงานประกอบไปด้วย activity, fragment, ViewModel และสิ่งต่าง ๆ ที่เกี่ยวข้องกับ UI เช่น adapter ของ data binding เป็นต้น
- tv สำหรับ Android TV app
- model สำหรับ model class ที่ใช้ใน app ทั้งหมด เช่น User, Speaker, Session, Room และ Tag เป็นต้น
- shared สำหรับ business logic นั่นคือ UseCase ต่าง ๆ ที่แยกออกตาม domain เช่น Agenda, Authentication, Session, User และ Speaker เป็นต้น รวมไปถึง class การทำงานหลักอีกมากมาย
- test-shared สำหรับสร้างข้อมูลที่ใช้ในส่วนของ Unit testing
- androidTest-shared สำหรับเก็บ utilities class ที่ใช้ในส่วนของ UI testing
ผลจากการแยก module ทำให้การ build แบบ incremental เร็วขึ้น ถ้าแยกแล้วช้าลงน่าจะผิดนะ รวมทั้งสามารถแยกทีมช่วยกันพัฒนาได้ง่ายอีกด้วยคำถามคือ เราควรใช้งานสิ่งต่าง ๆ เหล่านี้หรือไม่ ? จาก session นี้บอกไว้ว่า เราควรศึกษาทำความเข้าใจก่อน จากนั้นลงมือทำ PoC (Proof of Concept) ใน use case ต่าง ๆ ไม่ใช่แค่ login หรือ ดึงข้อมูลจาก github นะ เมื่อถึงเวลา และ use case ที่เหมาะสม จะได้นำมาใช้งานได้เลย มาศึกษากันดูครับ ผมว่าน่าจะได้ความรู้และแนวทางการพัฒนาที่ดีเพียบเลย ขอให้สนุกกับการ coding