MVC มุมมองใหม่ 3F to 3S

หลังจากนั่งทำ Refactoring code ของตัวเอง ทำให้ได้มุมมองใหม่ๆ จากที่เคยจิตนาการว่า MVC คือ 3F

  • Fat Model: พยายามยัดทุกอย่างลง model เพื่อให้มันอ้วนๆ
  • Fast Controller: เมื่อทุกอย่างไปอยู่ใน model ทำให้ view เปลี่ยนได้ง่าย
  • Flexible View: ต้องทำให้ View ปรับแต่งได้เร็วที่สุด

แต่จิตนาการแบบนี้กลับทำให้ผมพลาดครั้งใหญ่

หลังจาก Refactoring แล้วผมพบว่าเราไม่ได้ต้องการให้ model มันอ้วนเฮะ ผมต้องการให้ model มันฉลาดต่างหาก มองเหมือน model เป็นลูกน้องของ controller เปลี่ยนจาก Fat model ไปเป็น Smart Model เวลาพิจารณาว่าอะไรควรอยู่ใน model ก็ให้จับหลักว่าลูกน้องควรรู้อะไร เพื่อให้หัวหน้าสบายที่สุด

สำหรับ Fast Controller นั้นไม่ค่อยตรงเท่าไหร เพราะ controller ไม่ค่อยเปลี่ยนบ่อยขนาดนั้น สิ่งที่ต้องการคือ ความเข้าใจและ ความถูกต้องซะมากกว่า ยิ่งสั้นยิ่งผิดยาก ไม่ควรยาวเกิน action ละ 15 บรรทัด การเป็นหัวหน้าต้องสั่งน้อยๆ ถ้าเมื่อใดสั่งมากแสดงว่าลูกน้องเราไม่ฉลาด ต้องไปเพิ่มความฉลาดให้ลูกน้อง (model) ดังนั้นต่อไปผมจะท่องไว้เสมอว่า Short controller

ข้อที่ผมพลาดมากที่สุดคือ Flexible view เมื่อพิจารณาจากจุดเริ่มต้น ผมเริ่มใช้ MVC เพราะผมต้องการแยกงานเขียน code ออกจากงานด้านออกแบบ ถ้าผมพยายามทำให้ View มัน Flexible เป็นผลให้มี Business logic บางส่วนมาอยู่บน view ด้วย เพื่อแก้ปัญหานี้ ต่อไปผมจะพยายามสร้าง Stupid View ให้ความฉลาดของ view มันอยู่ที่การออกแบบไม่ได้อยู่ที่ code ของโปรแกรม

ผมไม่ได้หมายความว่าให้ใช้แต่ HTML/CSS นะครับการใช้ Helper ก็เป็นตัวช่วยให้ view มันโง่ๆ ด้วย สิ่งที่ไม่ควรมีบน view คือพวกการคำนวนหรือ Businees logic เราควรเตรียมให้เรียบร้อยมาตั้งแต่ model หรือ controller เลย

เมื่อคิดได้ดังนั้นจึงเปลี่ยนนิยามของ MVC จาก 3F ไปเป็น 3S แทนครับ

  • Smart Model: เป็นลูกน้องที่ทำงานอย่างฉลาด ไม่ใช่ทำทุกอย่าง
  • Short Controller: ไม่ควรเกิน 15 บรรทัด ถ้าเกินแสดงว่าลูกน้องเราโง่อยู่
  • Stupid View: ให้ความฉลาดอยู่ที่การออกแบบ ไม่ได้อยู่ที่ code

ถ้าทำ Refectoring ต่อไปน่าจะได้มุมมองใหม่ๆ เพิ่มเติมอีก ถึงตอนนั้นนิยามอาจจะเปลี่ยนไปจากนี้ก็ได้ ตื่นเต้นจริงๆ

ไอเดียดีนะครับ

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.