เราจะลดเวลาการเขียนโค้ดลงได้อย่างไร ตอนที่ 3
Framework ที่ว่านี้หมายถึง "กรอบการทำงาน" ของตัวเอง ไม่ใช่การสร้าง Framework แบบคชสารนะครับ เทคนิคนี้สามารถใช้ได้ทั้งการทำงานส่วนตัว (ฟรีแล้นซ์) และการทำงานเป็นทีม ใจความสำคัญของวิธีนี้มีข้อเดียวคือ
ออกแบบ "กรอบการทำงาน" ก่อนที่จะเริ่มงาน
จริงๆแล้ววิธีการเขียนโค้ดเปรียบเสมือนลายมือของ "โปรแกรมเมอร์" ได้เลย แต่ละคนจะมีวิธีคิดเป็นของตัวเอง และ จะมีแนวทางการเขียนเป็นของตัวเอง
ใครที่ยังไม่สามารถมีลายมือของตัวเองได้ แสดงว่าเพิ่งอยู่ในขั้นเริ่มต้น
เราจะเขียนให้เร็วขึ้นได้แน่ๆ ถ้าเรากำหนดกรอบ วิธีคิด วิธีเขียน ให้มีระเบียบแบบแผน จริงๆมันก็ยากอีตอนเริ่มต้นนั่นแหละครับ ตอนแรกเราอาจต้องลองหลายๆวิธีจนกว่าจะพบวิธีที่ดีที่สุด และมันจะติดตัวเราไปจนวันตายเปรียบเหมือนลายมือเลยทีเดียว
- ในกรณีการทำงานเป็นทีม เราจำเป็นต้องตกลงสร้าง "กรอบการทำงาน" สำหรับทีมก่อน เพื่อให้งานของแต่ละคนสอดคล้องกัน และเป็นไปในทางเดียวกันอย่างไม่มีปัญหา
- ในกรณีการทำงานส่วนตัว "กรอบการทำงาน" จะช่วยให้เราสามารถออกแบบระบบ "ทุกงาน" ได้อย่างเป็นระเบียบ ระบบ และสามารถนำกลับมาใช้ได้ แถมยังดูแลรักษาได้ง่ายด้วย เพราะงานทุกชิ้นของเรามาจากแนวคิด และ วิธีเขียนเดียวกัน
include header.php
if ($module == 'about') {
// โหลดหน้า about เมื่อมีการเรียก module=about
include about.php
} else {
// หน้าแรกของเว็บไซต์ ในกรณีที่เรียกแบบไม่มี module
include home.php
}
include footer.php
การเขียนโค้ดแบบด้านบน เราจะพบได้ในมือใหม่ (ก็ รร. สอนกันมาแบบนี้) ถ้าจะพิจารณาดีๆ วิธีนี้มีข้อเสียดังนี้
- เราไม่สามารถเปลี่ยนข้อความใน header หรือ footer ตามโมดูลที่เรียกได้ เพราะโมดูล ถูกประมวลผลหลังจากการเรียก header แล้ว
- ถ้ามีการเพิ่มหน้า เราต้องมาเขียนโค้ดเพิ่มจำนวนมาก โดยเฉพาะหากมีหน้าจำนวนมากเราก็จะต้องเขียน if หลายๆตัว ให้ครอบคลุมทุกหน้า
// รายการโมดูลที่สามารถใช้งานได้
$modules = array('home', 'about');
// ตรวจสอบโมดูลที่เรียก ถ้าไม่มีใช้โมดูลแรกสุด
$module = in_array($module, $modules) ? $module : $modules[0];
// เรียกโมดูล ให้ผลลัพท์เนื้อหาของโมดูลออกมาที่ $content
$content = include ($module.'.php');
// โหลด template ของเว็บซึ่งเป็น HTML ล้วน
$template = file_get_contents('index.html');
// แสดงผลหน้าเว็บไซต์
echo str_replace(array('{TITLE}', '{CONTENT}'), array($web_title, $content), $template);
โค้ดด้านบนคือแนวคิดที่ปรับปรุงมาจากวิธีแรก เพื่อแก้ปัญหาข้างต้น และผมใช้โครงสร้างเว็บในลักษณะนี้ กับ GCMS
- การเพิ่มหรือลดหน้าทำได้โดยการแก้ไข $modules เท่านั้น แถมยังกำหนดได้ด้วยว่าจะให้โมดูลไหนเป็นหน้าแรก
- สามารถแยกไฟล์ html ออกเป็น template ได้เลย เช่น index.html ประกอบไปด้วยโค้ด HTML ทั้งหมดทั้งส่วนของ header และ footer ภายในโค้ดมีการเขียน {TITLE} สำหรับให้ข้อความไตเติลของเว็บมาแสดง และเขียน {CONTENT} เพื่อนำเนื้อหาเว็บมาแสดงในส่วนนี้ ตัวอย่าง https://github.com/goragodwiriya/GCMS/blob/master/admin/skin/v8/index.html
- แน่นอนว่า เราสามารถเปลี่ยนไตเติลของเว็บได้ โดยแก้ไขตัวแปร $web_title ตามหลัก SEO (ไตเติลของเว็บไม่ควรซ้ำกันและสอดคล้องกับเนื้อหาของหน้า)
- โค้ดมีเท่านี้ จะมีหน้ากี่หน้าก็แทบไม่ต้องแก้ไขหน้านี้เลย (แก้ไขเฉพาะตัวแปร $modules เท่านั้น ซึ่งถ้าย้ายตัวแปรนี้ออกไปที่อื่น เช่นในไฟล์ config หน้านี้จะพร้อมใช้สำหรับทุกงานเลยทีเดียว)
หมายเหตุ แนวคิดของคชสารก็เป็นไปตามโค้ดนี้แหละครับ สั้นๆ ง่ายๆ ไม่มีอะไรซับซ้อน ทำให้มันเร็วและพัฒนาได้ไม่ยาก