Kotchasan PHP Framework

เราจะลดเวลาการเขียนโค้ดลงได้อย่างไร ตอนที่ 2

ในตอนที่แล้วผมได้อธิบายถึงการลดเวลาการเขียนโค้ดโดยการสร้างระบบพื้นฐานที่พร้อมสำหรับการใช้งานไปแล้ว ตอนนี้ผมจะมาพุดถึงอีกเทคนิคหนึ่งที่ผมใช้

นอกจากระบบพื้นฐานที่เราสามารถเตรียมไว้ได้แล้ว การออกแบบโครงสร้างของโปรเจ็คก็สำคัญไม่น้อย เพราะมันสามารถทำให้เราสามารถ "นำกลับมาใช้ใหม่" ได้เหมือนกัน เทคนิคที่ว่าคือการออกแบบระบบที่เป็น โมดูล

ลองพิจารณาการออกแบบที่เป็นที่นิยมกันดู
  • หนึ่งไฟล์ที่สร้างขึ้นคือหนึ่งโมดูล เช่น document.php, news.php, board.php หมายถึงระบบบทความ ระบบข่าว หรือเว็บบอร์ด ที่สร้างขึ้นเพื่อใช้งาน และยังอาจมีไฟล์อื่นๆ ประกอบ ที่วางอยู่ภายใต้ไดเร็คทอรี่เดียวกัน (เช่นในไดเร็คทอรี่ Controllers)
  • ไฟล์ประกอบอื่นๆ ที่อาจจะมีเพื่อใช้สำหรับหน้านั้นๆ เช่นหน้า submit form สำหรับการเขียนข่าว หรือ บทความ บางคนอาจ submit ไปที่เดียวกันเลย เพื่อลดจำนวนไฟล์
วิธีด้านบน เราจะพบเห็นได้ในโปรเจ็คส่วนใหญ่ รวมถึงใน Framework ที่เป็นที่นิยมทั้งหลาย แต่วิธีนี้มีข้อเสียสำหรับการ นำกลับมาใช้ใหม่ คือ
  • ถ้าเลือกวิธีสร้างไฟล์เดียวแต่ทำหลายหน้าที่ การนำกลับมาใช้จะต้องมาคอยลบส่วนที่ไม่ได้ใช้ออก เช่น ระบบใหม่ต้องการระบบข่าว แต่ไม่ต้องการบทความ เราต้องมาคอยลบโค้ดส่วนที่ไม่เกี่ยวข้องออก (จริงๆ ไม่ลบก็ได้ แต่จะได้ขยะเพิ่มขึ้นในระบบ)
  • มีแนวโน้มที่จะตั้งชื่อยาก เช่น อาจต้องสร้างไฟล์ชื่อ document_save.php และ news_save.php เพื่อทำหน้าที่แยกกันในแต่ละโมดูล
  • การขยายระบบในอนาคตทำได้ยาก โดยเฉพาะหากต้องคำนึงถึงการนำกลับมาใช้ใหม่ ต้องพยายามตั้งชื่อไฟล์ให้ไม่ซ้ำกับโมดูลอื่นๆ
วิธีการแก้ปัญหา ซึ่งผมใช้ในคชสาร

ผมออกแบบให้คชสารเป็นโมดูล โดยหนึ่งไดเร็คทอรี่คือหนึ่งโมดูล ซึ่งข้อดีที่ได้รับคือ
  • เมื่อไดเรคทอรี่หนึ่งๆคือหนึ่งโมดูล การนำกลับมาใช้ใหม่ก็ง่าย โดยการนำไดเร็คทอรี่ของโมดูลมาติดตั้งเท่านั้น หากไม่ต้องการใช้ก็ลบไดเร็คทอรี่ออก
  • หมดปัญหาเรื่องการตั้งชื่อไฟล์ เพราะแต่ละไฟล์อยู่ในไดเร็คทอรี่ของตัวเอง ทำหน้าที่ของแต่ละโมดูลเท่านั้น
  • ชื่อไดเร็คทอรี่ใช้เป็น Namspaces ได้ด้วย ทำให้สามารถใช้งาน autoload ได้ด้วยตามมาตรฐาน PSR-4
จะเห็นได้ว่าการออกแบบเว็บไซต์ในลักษณะที่เป็นโมดูลแยกกันจะทำให้การนำโค้ดกลับมาใช้ใหม่ได้ง่ายยิ่งขึ้น ลดเวลาในการเขียนโค้ดลงได้มาก ลองเอาไปใช้ในโปรเจ็คของตัวเองดูนะครับ
โมดูลของคชสารจะถูกติดตั้งลงในไดเร็คทอรี่ modules/ โดยในแต่ละโมดูลจะประกอบด้วย Controlles Models และ Views แยกกันในแต่ละโมดูล