วันอังคาร, มีนาคม 10, 2552

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

หลังจากนั่งทำ Refactoring code ของตัวเอง ทำให้ได้มุมมองใหม่ๆ จากที่เคยจิตนาการว่า [MVC](http://en.wikipedia.org/wiki/Model-view-controller) คือ 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) ดังนั้นต่อไปผมจะเปลี่ยนจาก

Fast Controller มาเป็น Short controller

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

Flexible View ไปเป็น Stupid View

ให้ความฉลาดของ view มันอยู่ที่การออกแบบไม่ได้อยู่ที่ code ของโปรแกรม ผมไม่ได้หมายความว่าให้ใช้แต่ HTML/CSS นะครับการใช้ Helper ก็เป็นตัวช่วยให้ view มันโง่ๆ ด้วย สิ่งที่ไม่ควรมีบน view คือพวกการคำนวนหรือ Businees logic เราควรเตรียมให้เรียบร้อยมาตั้งแต่ model
เมื่อคิดได้ดังนั้นจึงเปลี่ยนนิยามของ MVC จาก 3F ไปเป็น 3S แทนครับ
  • Smart Model: เป็นลูกน้องที่ทำงานอย่างฉลาด ไม่ใช่ทำทุกอย่าง
  • Short Controller: ไม่ควรเกิน 15 บรรทัด ถ้าเกินแสดงว่าลูกน้องเราโง่อยู่
  • Stupid View: ให้ความฉลาดอยู่ที่การออกแบบ ไม่ได้อยู่ที่ code

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