duplication
วันนี้เห็น code ของ Android app ตัวหนึ่ง
ซึ่งมี code ที่น่าสนใจ และ น่าศึกษา
นั่นก็คือ code ที่ใช้งาน RecyclerView
แน่นอนว่า ต้องทำงานร่วมกับ Adapter ของมันนั่นเอง

ทำให้คิดถึงแนวคิดของ SOLID
หนึ่งในนั้นคือ S = Single Responsibility Principle (SRP)
มาดู code กันดีกว่า

RecyclerView นั้นมันช่วยทำให้

การแสดงผลข้อมูลมันง่ายและยืดหยุ่นขึ้นมาก
ซึ่งต้องทำงานร่วมกับ RecyclerView Adapter
เพื่อนำข้อมูลที่เราต้องการมาแสดงผลใน View ต่อไป

โดยจะมีการทำงานที่ method onBindViewHolder() หรืออาจจะไปทำที่ ViewHolder เลยก็ได้
แต่ code ตัวอย่างจะทำงานอยู่ใน method onBindViewHolder()

ถ้าปฏิบัติตามแนวคิดของ Single Responsibility Principle (SRP)

ใน Adpater จะต้องทำงานเพียงอย่างเดียว
นั่นก็คือ ทำการ mapping ข้อมูลที่จะทำการแสดงผลบน View เท่านั้น

แต่นี่คือ code ที่เรามักจะเขียนกันขึ้นมา !!
ซึ่งขัดแย้งกับแนวคิด SRP อย่างมาก

คำถามที่หนึ่ง มันขัดแย้งกับ SRP อย่างไร ?

ใน code ก็ทำการ mapping ข้อมูลของ order เพื่อมาแสดงผลนะ
มันไม่น่าจะผิดหรือขัดแย้งกับ SRP นะ ?

ลองพิจารณา code ใหม่สิ ว่าทำอะไรบ้าง ?

  • ทำการคำนวณราคารวมของ order
  • ทำการคำนวณราคาก่อนแสดงผล
  • ทำการจัดรูปแบบของราคาก่อนแสดงผล

ซึ่งในความเป็นจริงหน้าที่ของ Adpater มันทำอะไร ?
ลองกลับไปอ่านจากขางบนนะ !!

ดังนั้น Adapter มันทำงานเยอะไปหรือเปล่า ?
และการทำงานเหล่านั้น มันควรเป็นหน้าที่ของ Adapter หรือไม่ ?

คำถามที่สอง ปัญหาคืออะไร ?

นักพัฒนาก็มักจะบอกว่า
code มันนิดเดียวเอง ไม่เป็นไรหรอกนะ ไม่มีปัญหาหรอกนะ !!
code มันก็ทำงานได้อย่างถูกต้องนะ
แต่เดี๋ยวก่อน …

Class หรือ method ที่มันมีหน้าที่การทำงานมากกว่า 1 อย่างนั้น
มันมักจะเกิดปัญหาตามมาเสมอ

ลองคิดดูสิว่า
ถ้ารูปแบบการแสดงผลของราคาทำแบบนี้แล้ว
มันจะเกิด code ที่ซ้ำซ้อนหลาย ๆ ที่หรือเปล่านะ ?
จะมี code สำหรับคำนวณราคาต่อ order หลาย ๆ ที่หรือเปล่านะ ?

นั่นคือเกิด Duplication code ขึ้นมา (Duplication is evil !!)
มันไม่น่าจะเป็นเรื่องที่ดีสำหรับการพัฒนา software นะ

คำถามที่สาม แก้ไขอย่างไรดีล่ะ ?

จากตัวอย่างนี้ก็ไม่ยากเท่าไร
นั่นคือ ทำการแยกส่วนการทำงานต่าง ๆ เหล่านั้น
ออกมาจาก Adapter ซะ

คำถามที่สี่ แล้วจะย้ายการทำงานไปไว้ที่ไหนล่ะ ?

สำหรับการคำนวณราคาของ order
ควรย้ายไปไว้ที่ class Order สิ

สำหรับการจัดการรูปแบบการแสดงผลของราคา
ควรย้ายไปไว้ที่ class สำหรับจัดการรูปแบบของค่าเงิน เช่น class CurrencyFormatter
และถูกเรียกใช้จาก class Order ต่อไป

แสดง code ใน Adapter หลังจากการแก้ไข code ให้เป็นไปตาม SRP

เป็นไงล่ะครับ ง่ายไหม ?
ตอบได้เลยว่า ปัญหานี้มันง่ายนะครับ
แต่การทำงานจริงมันยากกว่านี้เสมอ

ปล. นี่ก็มาจาก code จริง ๆ นะครับ

สุดท้ายแล้ว

สำหรับนักพัฒนาอย่าลืมแนวคิด SOLID กันนะครับ
หนึ่งแนวคิดที่สำคัญคือ S = Single Responsibility Principle
ลองกลับไปดู class และ method ที่เราสร้างขึ้นมา
แล้วลองตั้งคำถามสิว่า

  • Class และ method มันทำงานอะไรบ้าง ?
  • Class และ method มันจะถูกเปลี่ยนแปลงด้วยเหตุผลอะไรบ้าง ?

คำถามสุดท้าย SRP มันยากไหม ?

ตอบได้เลยว่ายากมาก ๆ
แต่ถ้าคุณกลับมาดู code ที่เขียน
จะพบว่า code เหล่านั้นมันมีความซับซ้อนสูงมาก ๆ
ดังนั้น แทนที่จะพูด จะบ่น จะด่า
ให้ลงมือแก้ไข ปรับปรุง เปลี่ยนแปลงให้มันดีขึ้นกว่าเดิมดีกว่า
ให้เวลากับมันเยอะขึ้น
รวมทั้งไม่สร้าง code ที่ไม่ดีเพิ่มขึ้นมาอีก

Code ที่เขียนขึ้นมามันพร้อมรับต่อการเปลี่ยนแปลงหรือไม่ ?