medium
เพื่อความสนุกในการศึกษา Android app ของชาวบ้าน
เลยนำ app ที่ได้รับความนิยมในด้านดีมาดูกันหน่อย
ซึ่งนำไฟล์ APK มา decompile
เพื่อเรียนรู้ว่า app เหล่านั้นมีอะไรที่น่าสนใจบ้าง
ทั้ง Library ที่ใช้งาน
ทั้งแนวทางในการเขียน code
ทั้งโครงสร้างของ code
โดยมาเริ่มที่ Medium app กันเลย

medium02

เริ่มต้นด้วย Library หรือ Dependency ที่ใช้งาน

บอกได้เลยว่ามันเยอะมาก ๆ
จะเยอะไปไหน ?

  • Google GSON
  • Google Guava
  • Square Dagger เป็น Dependency Injector ลงไปในส่วนต่าง ๆ ของระบบ ทำให้ส่วนการทำงานแยกเป็นส่วน ๆ ชัดเจนมากขึ้น
  • Square Phrase สำหรับจัดการรูปแบบของข้อมูล ซึ่งสะดวกมาก ๆ
  • Square Picasso
  • Square Retrofit
  • RxJava with RxAndroid
  • Chrisjenx Calligraphy สำหรับการ custom font ใน app
  • Bumptech Glide
  • JakeWharton Timber สำหรับจัดการ Log
  • JakeWharton ButterKnife
  • JakeWharton DiskLRUCache
  • Flipboard BottomSheet

ซึ่งเป็นไปตาม Android app ทั่วไป
ที่นิยมใช้งาน library จาก Square และ Google
ส่วน library ที่ใช้เยอะ ๆ คือ JakeWharton ทั้ง Timber, DiskLRUCache และ ButterKnife

คำถามที่น่าสนใจคือ ทำไมถึงใช้ทั้ง Square Picasso และ Bumptech Glide ด้วยล่ะ ?
เมื่อไปดูใน code พบว่า code ใน version ใหม่ของ Medium app นั้น
ใช้งาน Bumptech Glide แต่ใน feature เก่า ๆ ยังใช้งาน Square Picasso อยู่
ซึ่งดูจากการกำหนด Module ใน Dagger นั่นเอง

มาดูโครงสร้างของ App กันหน่อย

ประกอบไปด้วยส่วนการทำงานดังนี้

  • Activity สำหรับแสดงผล และ ดักจับการใช้งานจากผู้ใช้
  • View Presenter สำหรับกำหนดการทำงานในแต่ละหน้า
  • Controller เป็นส่วนควบคุมการทำงานหลัก
  • Data store สำหรับจัดเก็บข้อมูล
  • API สำหรับดึงข้อมูลจาก API ต่าง ๆ

เนื่องจากใช้ Dagger จึงมีการสร้าง Component/Module จำนวนมาก
ขอบอกเลยว่าเยอะจริง ๆ
ซึ่งเป็นส่วนการทำงานหลักของ Medium app เลยก็ว่าได้

ส่วนที่ชอบมาก ๆ ใน App นี้ก็คือ การใช้งาน Optional จาก Google Guava

ทำให้ข้อมูลในตัวแปร และ ข้อมูลจาก method ต่าง ๆ ไม่เป็น Null
แน่นอนว่า ไม่ต้องมาตรวจสอบค่า Null
หรือเจอกับปัญหา NullPointerException อีกต่อไป
รวมทั้งลด ละ เลิกการใช้งาน Android Annotation ต่าง ๆ ซึ่งรกตาอย่างมาก เช่น

  • @Nullable
  • @NotNull

ตัวอย่าง code ของการใช้ Optional

ปล. ในภาษา Swift และ Kotlin นั้นเรื่อง Optional มันเข้าไปอยู่ใน type system อยู่แล้ว

เมื่อไปดูใน res/drawable พบว่ามีแต่ไฟล์ xml เท่านั้น

ไม่มีไฟล์รูปภาพใด ๆ เลย
เพราะว่าไฟล์รูปภาพแยกออกไปยัง folder ตามขนาดหน้าจอไปเลย
เป็นแนวปฏิบัติในการพัฒนาที่ดีเลย

วันนี้ได้เรียนรู้สิ่งต่าง ๆ เยอะมากจาก Medium app
เพื่อนำไปประยุกต์ใช้ในการพัฒนาต่อไป
มันสนุกดีนะ

Tags: