ทำไมโค้ดที่ "ฉลาด" ถึงอันตรายกว่าโค้ดที่ "ยาว"
เวลาเขียนโค้ดได้สักพัก มักมีช่วงหนึ่งที่เราอยากเขียนอะไรเท่ ๆ ยุบสามบรรทัดให้เหลือบรรทัดเดียว แล้วรู้สึกดีกับตัวเอง ปัญหาคือ ความรู้สึกนั้นมักจะอยู่ได้ไม่เกินหกเดือน
ต้นทุนที่จริงของโค้ดไม่ใช่เวลาเขียน
โค้ดหนึ่งชิ้นถูกเขียนครั้งเดียว แต่ถูกอ่านอีกสิบครั้ง ตอนแก้บั๊ก ตอนเพิ่มฟีเจอร์ ตอนมีคนใหม่เข้าทีม ถ้าโค้ดสั้นลงหนึ่งบรรทัดแต่ทำให้ทุกคนที่อ่านต้องหยุดคิดสามวินาที คุ้มไหม
// สั้น
const r = xs.reduce((a, x) => (a[x.k] ??= []).push(x) && a, {});
// ยาวกว่า แต่อ่านรวดเดียวจบ
const ordersByStatus = {};
for (const order of orders) {
if (!ordersByStatus[order.status]) {
ordersByStatus[order.status] = [];
}
ordersByStatus[order.status].push(order);
}ความสั้นที่ดี กับความสั้นที่แย่
ไม่ใช่ว่าโค้ดสั้นจะแย่เสมอไป ความสั้นที่ดีคือการ "ตัดสิ่งที่ไม่จำเป็นออก" ส่วนความสั้นที่แย่คือการ "ยัดสิ่งที่จำเป็นเข้าด้วยกันจนดูไม่ออก"
| สั้นแบบดี | สั้นแบบอันตราย |
|---|---|
| ตัด if ซ้อน if ที่ไม่จำเป็นออก | ยัด 3 เงื่อนไขมาอยู่ใน ternary ชั้นเดียว |
| แยกฟังก์ชันยาวเป็นส่วน ๆ ที่มีชื่อ | รวบ 3 ขั้นตอนเป็น chain เดียวที่ไม่มีชื่อกำกับ |
| ใช้ early return ตัดเคสที่ไม่ปกติออกก่อน | ใช้ regex ยาวหนึ่งบรรทัดแทน parser ทั้งตัว |
| เอา magic number ไปเป็นค่าคงที่มีชื่อ | ใช้ side effect ใน map เพื่อประหยัด loop |
ตัวชี้วัดง่าย ๆ ที่ใช้ได้จริง
ลองอธิบายฟังก์ชันนั้นให้เพื่อนที่นั่งข้าง ๆ ฟังภายในสามประโยค ถ้าทำได้แปลว่าโค้ดนั้นอยู่ในระดับที่ดี ถ้าต้องเปิดจอแล้วไล่นิ้วตาม แปลว่ามันสั้นเกิน
เขียนโค้ดเหมือนคนที่จะมาดูแลต่อคือคนที่รู้ที่อยู่ของคุณและมีอารมณ์เสีย
บทสรุป
ความเก่งของโปรแกรมเมอร์ที่โตเต็มวัยไม่ได้อยู่ที่การเขียนโค้ดที่คนอื่นอ่านไม่รู้เรื่อง แต่อยู่ที่การเขียนสิ่งที่ซับซ้อนให้ดูเรียบง่ายจนคนอ่านแล้วคิดว่า "ก็แค่นี้เอง"

ความคิดเห็น
กำลังโหลดความคิดเห็น