![]()
![]()
จากงาน Google I/O 2017 นั้นมีของใหม่ ๆ ออกมาเยอะมาก ไม่รู้จะเยอะไปไหน !!
มีหลายสิ่งอย่างน่าสนใจ ยกตัวอย่างเช่น
Guide to App Architecture
หรือโครงสร้างต่าง ๆ สำหรับการพัฒนา Android app
ซึ่งทางทีมพัฒนาได้สรุปและเตรียม component ต่าง ๆ ไว้ให้อย่างครบครัน
โดยแยกส่วนการทำงานต่าง ๆ ออกเป็น component อย่างชัดเจน
ประกอบไปด้วย
- Component สำหรับการจัดการ Lifecycle ของ Activity/Fragment ให้ง่ายขึ้น
- LiveData คือ observer สำหรับ data holder เพื่อคอยดูการเปลี่ยนแปลงของข้อมูล โดยทำงานร่วมกับ lifecycle ของ Activity/Fragment/Service อีกทั้งยังช่วยจัดการไม่เกิด memory leak อีกด้วย มีการทำงานเช่นเดียวกับ RxJava และ Agera
- ViewModel เตรียมข้อมูลสำหรับ UI component ต่าง ๆ ซึ่งข้อมูลต่าง ๆ มาจาก LiveData นั่นเอง
- Room Persistence Library คือ Object mapping สำหรับ SQLite นั่นเอง ที่สำคัญยังคอยดูการเปลี่ยนแปลงข้อมูลอีกด้วย นั่นคือทำงานร่วมกับ LiveData นั่นเอง
- Repository คือคนกลางสำหรับจัดการข้อมูลจากที่ต่าง ๆ ไม่ว่าจะมาจาก Local หรือ Remote ก็ตาม
- Networking แนะนำให้ใช้ Retrofit
- การจัดการ component ที่ต้องทำงานร่วมกันแนะนำให้ใช้ Dagger 2
แสดงโครงสร้างของระบบดังนี้
ซึ่งโครงสร้างนี้มีเป้าหมายเพื่อ ช่วยแก้ไขปัญหาต่าง ๆ ดังนี้
การจัดการ Life Cycle ของ Activity/Fragment/Service ซึ่งมันซับซ้อนและยากต่อการจัดการ
ส่งผลให้นักพัฒนาลำบากมาก ๆ และ จัดการหรือเอาไม่อยู่ !!
ส่งผลให้ App พังหรือหยุดทำงานได้ง่ายมาก ๆ
บ่อยครั้งพบว่า การจัดการต่าง ๆ เขียนอยู่ใน Activity/Fragment ทั้งหมด
บ่อยครั้งพบว่า เขียน code จัดการแบบผิด ๆ
บ่อยครั้งพบว่า มีการใช้ resource แล้วไม่ยอมคืน
บ่อยครั้งพบว่า เกิด memory leak ขึ้น
ดังนั้นตามแนวคิดของ Separation of Concern (SoC)
นั่นคือแยกส่วนการทำงานออกเป็นส่วน ๆ หรือ component
ตาม component ด้านบน
โดยแนวทางนี้เป็นเพียงแนวทางหนึ่งในการแก้ไขปัญหาเท่านั้น
ซึ่งช่วยทำให้ app มีความน่าเชื่อถือ ทดสอบและดูแลรักษาได้ง่าย
แน่นอนว่า มันน่าลองทำตามเป็นอย่างยิ่ง
ดังนั้นมาเริ่มกันดีกว่า !!
ปิดท้ายมาดูการทดสอบกันหน่อย
เนื่องจากแยกส่วนการทำงานออกจากกันชัดเจน
ดังนั้นทำให้แต่ละส่วนทดสอบได้ง่าย
มาดูกันว่าทดสอบกันอย่างไร ?
1.ในส่วนของ User Interface ใช้งาน Espresso
ส่วนการทำงานต่าง ๆที่ User Interface ต้องการใช้งาน
เช่น ViewModel ก็ให้ mock ไว้ซะ
2. ViewModel สามารถทดสอบด้วย JUnit ได้เลย
ส่วนอื่น ๆ ที่ทำงานด้วย เช่น Repository ก็ให้ mock ไว้ซะ
3. Repository สามารถทดสอบด้วย JUnit เช่นกัน
4. DAO (Data Access Object) สำหรับการจัดการข้อมูลผ่าน Room
แนะนำให้ใช้งานผ่าน Instrumentation test นั่นเอง
เนื่องจากมีการใช้งาน library ของ Android นั่นเอง
จากนั้นให้ทำการทดสอบด้วย in-memory database
ซึ่งจะส่งผลกระทบต่อการทำงานน้อยมาก ๆ
และอย่าทดสอบผ่าน SQLite ตรง ๆ
เนื่องจากในแต่ละ device อาจจะใช้ SQLite version ต่างกัน !!
5. WebService/REST API ให้ทำการทดสอบผ่าน WebMockServer
ซึ่งช่วยทำงานสร้าง face webserver ขึ้นมาแบบง่าย ๆ นั่นเอง
6. Testing Artifact
โดยที่ Architecture component ได้เตรียม library สำหรับการควบคุมการทำงานใน background thread มาให้ ประกอบไปด้วย InstantTaskExecutorRule และ CountingTaskExecutorRule
ซึ่งน่าจะทำให้การพัฒนา Android app ง่ายและเป็นมาตรฐานยิ่งขึ้น
ดังนั้นจะช้าอยู่ทำไม มาเขียน code กันเถอะ