Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 2036

ตัวอย่างของ code ที่ขัดแย้งต่อแนวคิด Single Responsibility Principle (SRP)

$
0
0

duplication

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 อย่างมาก [gist id="bfa175694d859fb831e2216c5b6fef95" file="OrderRecyclerAdapter.java"]

คำถามที่หนึ่ง มันขัดแย้งกับ 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 [gist id="bfa175694d859fb831e2216c5b6fef95" file="After_OrderRecyclerAdapter.java"] เป็นไงล่ะครับ ง่ายไหม ? ตอบได้เลยว่า ปัญหานี้มันง่ายนะครับ แต่การทำงานจริงมันยากกว่านี้เสมอ ปล. นี่ก็มาจาก code จริง ๆ นะครับ

สุดท้ายแล้ว

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

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

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

Viewing all articles
Browse latest Browse all 2036

Trending Articles