เราจะลดเวลาการเขียนโค้ดลงได้อย่างไร ตอนที่ 3
ตอนนี้ก็เป็นอีกเรื่องหนึ่งที่ผมอยากเขียนมานานแล้ว ว่าด้วยเรื่องการสร้าง Framework ของตัวเอง
Framework ที่ว่านี้หมายถึง "กรอบการทำงาน" ของตัวเอง ไม่ใช่การสร้าง Framework แบบคชสารนะครับ เทคนิคนี้สามารถใช้ได้ทั้งการทำงานส่วนตัว (ฟรีแล้นซ์) และการทำงานเป็นทีม ใจความสำคัญของวิธีนี้มีข้อเดียวคือ
ออกแบบ "กรอบการทำงาน" ก่อนที่จะเริ่มงาน
จริงๆแล้ววิธีการเขียนโค้ดเปรียบเสมือนลายมือของ "โปรแกรมเมอร์" ได้เลย แต่ละคนจะมีวิธีคิดเป็นของตัวเอง และ จะมีแนวทางการเขียนเป็นของตัวเอง
ใครที่ยังไม่สามารถมีลายมือของตัวเองได้ แสดงว่าเพิ่งอยู่ในขั้นเริ่มต้น
เราจะเขียนให้เร็วขึ้นได้แน่ๆ ถ้าเรากำหนดกรอบ วิธีคิด วิธีเขียน ให้มีระเบียบแบบแผน จริงๆมันก็ยากอีตอนเริ่มต้นนั่นแหละครับ ตอนแรกเราอาจต้องลองหลายๆวิธีจนกว่าจะพบวิธีที่ดีที่สุด และมันจะติดตัวเราไปจนวันตายเปรียบเหมือนลายมือเลยทีเดียว
การเขียนโค้ดแบบด้านบน เราจะพบได้ในมือใหม่ (ก็ รร. สอนกันมาแบบนี้) ถ้าจะพิจารณาดีๆ วิธีนี้มีข้อเสียดังนี้
โค้ดด้านบนคือแนวคิดที่ปรับปรุงมาจากวิธีแรก เพื่อแก้ปัญหาข้างต้น และผมใช้โครงสร้างเว็บในลักษณะนี้ กับ GCMS
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('เราจะลดเวลาการเขียนโค้ดลงได้อย่างไร ตอนที่ 3', '{CONTENT}'), array($web_title, $content), $template);
โค้ดด้านบนคือแนวคิดที่ปรับปรุงมาจากวิธีแรก เพื่อแก้ปัญหาข้างต้น และผมใช้โครงสร้างเว็บในลักษณะนี้ กับ GCMS
- การเพิ่มหรือลดหน้าทำได้โดยการแก้ไข $modules เท่านั้น แถมยังกำหนดได้ด้วยว่าจะให้โมดูลไหนเป็นหน้าแรก
- สามารถแยกไฟล์ html ออกเป็น template ได้เลย เช่น index.html ประกอบไปด้วยโค้ด HTML ทั้งหมดทั้งส่วนของ header และ footer ภายในโค้ดมีการเขียน เราจะลดเวลาการเขียนโค้ดลงได้อย่างไร ตอนที่ 3 สำหรับให้ข้อความไตเติลของเว็บมาแสดง และเขียน {CONTENT} เพื่อนำเนื้อหาเว็บมาแสดงในส่วนนี้ ตัวอย่าง https://github.com/goragodwiriya/GCMS/blob/master/admin/skin/v8/index.html
- แน่นอนว่า เราสามารถเปลี่ยนไตเติลของเว็บได้ โดยแก้ไขตัวแปร $web_title ตามหลัก SEO (ไตเติลของเว็บไม่ควรซ้ำกันและสอดคล้องกับเนื้อหาของหน้า)
- โค้ดมีเท่านี้ จะมีหน้ากี่หน้าก็แทบไม่ต้องแก้ไขหน้านี้เลย (แก้ไขเฉพาะตัวแปร $modules เท่านั้น ซึ่งถ้าย้ายตัวแปรนี้ออกไปที่อื่น เช่นในไฟล์ config หน้านี้จะพร้อมใช้สำหรับทุกงานเลยทีเดียว)
หมายเหตุ แนวคิดของคชสารก็เป็นไปตามโค้ดนี้แหละครับ สั้นๆ ง่ายๆ ไม่มีอะไรซับซ้อน ทำให้มันเร็วและพัฒนาได้ไม่ยาก