name: coding-standards description: บังคับใช้มาตรฐานการเขียนโค้ดของโปรเจกต์นี้ ทุกฟังก์ชัน (PHP และ JavaScript) ต้องมี Docstring ครบถ้วน (Description / Args / Returns) และห้ามเขียน inline script ใน HTML ทุกกรณี Trigger เมื่อผู้ใช้ขอเขียนฟังก์ชัน, เพิ่มโค้ด, review โค้ด หรือถามเรื่อง coding style ของโปรเจกต์นี้
Coding Standards
กฎบังคับ 3 ข้อ
- ทุกฟังก์ชันต้องมี Docstring ครบ 3 ส่วน: Description · Args · Returns
- ห้ามเขียน inline script ใน HTML โดยเด็ดขาด
- หากมีการอัปเดตฐานข้อมูล ที่เกี่ยวข้อง ต้องอัปเดตไฟล์
sql/update.sqlด้วย
1. Docstring Standard
PHP — PHPDoc
ทุก function และ method ต้องมี PHPDoc block เหนือ declaration เสมอ
/**
* [Description] อธิบายหน้าที่ของฟังก์ชันนี้ในหนึ่งบรรทัดหรือมากกว่า
* ถ้ามีพฤติกรรมพิเศษหรือ side effect ให้อธิบายต่อในบรรทัดถัดไป
*
* @param type $paramName คำอธิบาย parameter นี้
* @param type $paramName2 คำอธิบาย parameter นี้
*
* @return type คำอธิบายค่าที่คืนกลับ; ถ้าไม่คืนค่าให้ระบุ void
*/
function myFunction(type $paramName, type $paramName2): type
{
// ...
}
ตัวอย่างที่ถูกต้อง:
/**
* ดึงรายการชิ้นส่วนอะไหล่ที่เหลืออยู่ทั้งหมดสำหรับเครื่องจักรที่กำหนด
* เรียงตามจำนวนคงเหลือจากน้อยไปมาก
*
* @param int $machineId รหัสเครื่องจักรที่ต้องการ
* @param int $limit จำนวนแถวสูงสุดที่ต้องการ (default 50)
*
* @return array array ของ associative array แต่ละแถวมีคีย์ part_id, part_name, qty
*/
function getSparePartsByMachine(int $machineId, int $limit = 50): array
{
// ...
}
ตัวอย่างที่ผิด (ห้ามทำ):
// ❌ ไม่มี docstring เลย
function getSparePartsByMachine(int $machineId): array
{
// ...
}
// ❌ มีแค่ชื่อ ไม่มี @param / @return
/**
* get spare parts
*/
function getSparePartsByMachine(int $machineId): array
{
// ...
}
JavaScript — JSDoc
ทุก function declaration, function expression, และ arrow function ที่ export หรือใช้งานข้ามไฟล์ต้องมี JSDoc block
/**
* [Description] อธิบายหน้าที่ของฟังก์ชันนี้
*
* @param {type} paramName คำอธิบาย parameter
* @param {type} paramName2 คำอธิบาย parameter
*
* @returns {type} คำอธิบายค่าที่คืนกลับ; ถ้าไม่คืนค่าให้ระบุ {void}
*/
function myFunction(paramName, paramName2) {
// ...
}
ตัวอย่างที่ถูกต้อง:
/**
* คำนวณ OEE (Overall Equipment Effectiveness) จากข้อมูล KPI ที่รับเข้ามา
* ผลลัพธ์จะอยู่ในช่วง 0–100 (หน่วยเป็น %)
*
* @param {number} availability อัตราความพร้อมใช้งาน (0–1)
* @param {number} performance อัตราประสิทธิภาพการผลิต (0–1)
* @param {number} quality อัตราคุณภาพ (0–1)
*
* @returns {number} ค่า OEE เป็น % ปัดทศนิยม 2 ตำแหน่ง
*/
function calculateOEE(availability, performance, quality) {
return parseFloat((availability * performance * quality * 100).toFixed(2));
}
2. No Inline Script
กฎ
- ห้าม
<script>tag ภายใน.php/.htmlfile ที่มีเนื้อหา JavaScript โดยตรง - JavaScript ทั้งหมดต้องอยู่ใน ไฟล์
.jsแยกต่างหาก ใต้assets/js/ - ยกเว้นกรณีที่จำเป็นต้อง inject ตัวแปร config จาก PHP ลง JS (เช่น
const BASE_URL = "<?= $url ?>";) — แต่ต้องจำกัดไว้แค่constdeclarations เท่านั้น ห้ามมีตรรกะหรือฟังก์ชันใดๆ ใน inline script - โหลดด้วย
<script src="...">เท่านั้น
ผิด — ห้ามทำ
<!-- ❌ inline script ใน PHP file -->
<button id="btnSave">Save</button>
<script>
document.getElementById('btnSave').addEventListener('click', function () {
fetch('/api/save_repair.php', { method: 'POST' });
});
</script>
ถูก — วิธีที่ถูกต้อง
<!-- ✅ โหลด JS จากไฟล์แยก -->
<button id="btnSave">Save</button>
<script src="../assets/js/repair_form.js"></script>
// assets/js/repair_form.js
/**
* ผูก event listener ให้ปุ่ม Save บนฟอร์มซ่อมบำรุง
* เรียกใช้ครั้งเดียวเมื่อ DOM พร้อม
*
* @param {string} apiUrl URL ของ endpoint ที่จะ POST ข้อมูลไป
*
* @returns {void}
*/
function initSaveButton(apiUrl) {
document.getElementById('btnSave').addEventListener('click', function () {
fetch(apiUrl, { method: 'POST' });
});
}
ข้อยกเว้นที่อนุญาต
| สิ่งที่อนุญาต | เหตุผล |
|---|---|
| <script src="..."> | โหลดไฟล์ภายนอก ไม่ใช่ inline |
| ตัวแปร config ที่ PHP inject ลงไป เช่น <script>const BASE_URL = "<?= $url ?>";</script> | ข้อมูล server-side ที่จำเป็นต้อง inject ณ runtime — ต้องจำกัดไว้แค่ const declarations เท่านั้น ห้ามมีตรรกะ |
3. UI Conventions — ช่องกรอกตัวเลข (number input)
กฎ
<input type="number">ทุกช่อง ให้ตั้งstep="1"(จำนวนเต็ม) เป็นค่าเริ่มต้น ทั้งจำนวนอะไหล่, ชั่วโมงงาน, ดาวน์ไทม์, เลขมิเตอร์ ฯลฯ ห้ามใช้step="any"/step="0.001"/step="0.25"เว้นแต่มีเหตุผลชัดเจนและระบุกำกับไว้- การ แสดงผล จำนวน ให้ตัด trailing zero ทิ้ง (เช่น
2.000 → 2,2.50 → 2.5)- JS: ใช้ helper
fmt()(toLocaleStringแบบmaximumFractionDigits:3ไม่มี min) - SQL:
TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM <col>))
- JS: ใช้ helper
ผิด — ห้ามทำ
<input type="number" id="qty" step="0.001">
<input type="number" id="hours" step="0.25">
ถูก
<input type="number" id="qty" min="1" step="1">
<input type="number" id="hours" min="0" step="1">
Checklist ก่อน commit
ตรวจข้อต่อไปนี้ทุกครั้งก่อนส่งโค้ด:
- [ ] ทุก function/method มี docstring ครบ 3 ส่วน (Description, Args, Returns)
- [ ] ไม่มี
<script>block ที่มี JS logic อยู่ใน HTML/PHP file - [ ] JS ใหม่ทุกชิ้นอยู่ใน
assets/js/*.js - [ ] ชื่อ parameter ใน docstring ตรงกับชื่อจริงใน signature
- [ ]
<input type="number">ใช้step="1"(จำนวนเต็ม) และการแสดงผลตัด.000ทิ้ง
ทำเมื่อ review โค้ดที่ไม่ผ่านมาตรฐาน
- ระบุทุก function ที่ขาด docstring พร้อม file:line
- ระบุทุก inline script พร้อม file:line
- เขียน docstring และ/หรือแยก JS ออกมาให้ครบ ก่อน proceed งานอื่น
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.