พจนานุกรมปูพื้นฐานฟังก์ชันตัวช่วย (Helper Dictionary)
มารู้จักคำศัพท์เทคนิคที่เป็นเสมือนสมองการคำนวณของโปรเจกต์กันก่อนเรียนรู้แบบเจาะลึก:
บล็อกชุดคำสั่งคำนวณประมวลผลขนาดจิ๋วที่ดึงแยกสัดส่วนออกมาจากหน้า UI เพื่อความสะดวกในการหยิบไปเรียกซ้ำได้จากทุกจุดในแอปพลิเคชัน
ฟังก์ชันการคำนวณที่อาศัยเพียงพารามิเตอร์ขาเข้าที่โยนมาเท่านั้น และมีผลลัพธ์การคายส่งออกกลับคืนสม่ำเสมอ ปราศจากการทำลายหรือเปลี่ยนแปลงตัวแปรภายนอก
ชื่อโฟลเดอร์สำหรับรวบรวมไฟล์ Helper ทั้งหมดของโครงการ (มักตั้งชื่อว่า src/utils/ หรือ helpers/ เพื่อจัดเก็บเป็นระเบียบ)
คำสั่งดั้งเดิมของจาวาสคริปต์ที่ใช้ตรวจสอบความถูกต้องของข้อมูลว่าไม่ใช่ตัวเลข (NaN - Not a Number) เพื่อป้องกันการเจอบั๊กเมื่อคำนวณคณิตศาสตร์
1ทำไมเราถึงต้องมีผู้ช่วย (Helper)? ลองจินตนาการถึงปัญหานี้ดู...
สมมติว่าคุณกำลังทำเว็บขายของออนไลน์ (E-Commerce) ที่ใหญ่มากๆ เว็บหนึ่ง ในเว็บนี้มีการแสดง "ราคาสินค้า" อยู่ในหลายๆ หน้าเต็มไปหมด เช่น:
- หน้าแรก (แสดงสินค้าแนะนำ)
- หน้ารายละเอียดสินค้า (ตอนกดเข้าไปดูรูปใหญ่ๆ)
- หน้าตะกร้าสินค้า (ตอนสรุปยอดว่าต้องจ่ายกี่บาท)
- หน้าชำระเงิน (ตัดบัตรเครดิต)
- หน้าบิลใบเสร็จ (หลังจากจ่ายเงินเสร็จแล้ว)
ในทางเขียนโปรแกรม ข้อมูลที่หลังบ้าน (Database/Server) ส่งมาให้เราเพื่อแสดงผลนั้น มักจะเป็น ตัวเลขดิบๆ (Raw Number) เสมอ เช่น เซิร์ฟเวอร์ส่งมาว่า 2500000 (สองล้านห้าแสน)
แต่ในฐานะคนทำหน้าเว็บ (Frontend) เราคงไม่อยากเอาเลข 2500000 ไปแสดงให้ลูกค้าดูโดยตรงใช่ไหม? ลูกค้าคงตาลายและนับศูนย์กันเหนื่อยแน่ๆ สิ่งที่เราต้องทำคือ "การจัดรูปแบบ (Formatting)" ให้มันกลายเป็น ฿2,500,000.00 เพื่อให้อ่านง่ายและดูเป็นมืออาชีพ
วิถีคนเขียนโค้ดแบบ "มือใหม่" (ถ้าไม่ใช้ Helper)
ถ้าเราไม่รู้จักสิ่งที่เรียกว่า Helper Function สิ่งที่โปรแกรมเมอร์มือใหม่จะทำคือ... พวกเขาจะเขียนคำสั่งทางคณิตศาสตร์หรือใช้คำสั่งของ JavaScript ยืดยาวเพื่อแปลงตัวเลขนี้ และพวกเขาก็จะ "ก๊อปปี้" โค้ดยาวๆ ชุดนี้ ไปแปะในทุกๆ หน้าที่มีการแสดงราคา! (แปะในหน้าแรก, แปะในหน้าตะกร้า, แปะในหน้าบิล ฯลฯ)
🚨 หายนะจะมาเยือนเมื่อ... วันดีคืนดี ฝ่ายการตลาดเดินมาบอกว่า
"น้องโปรแกรมเมอร์ พี่ขอเปลี่ยนสัญลักษณ์ ฿ เป็นคำว่า THB แทนได้ไหม? แล้วพี่ไม่อยากได้ทศนิยม .00 ด้านหลังแล้ว เอาออกให้หน่อยนะ"
ผลลัพธ์คือ: โปรแกรมเมอร์คนนั้นต้องเปิดไฟล์หน้าเว็บทีละไฟล์ (บางทีอาจจะมีเป็นร้อยไฟล์) เพื่อไล่หาโค้ดส่วนนี้และแก้ทีละจุด ถ้าแก้ตกหล่นไปแค่จุดเดียว หน้าเว็บก็จะแสดงราคาคนละรูปแบบกันทันที! (นี่คือฝันร้ายของการเขียนโปรแกรมเลย)
2ทางออกของปัญหา: สร้างเครื่องจักรส่วนตัว (Helper Function)
เพื่อแก้ปัญหาฝันร้ายด้านบน โปรแกรมเมอร์มืออาชีพจึงคิดค้นสิ่งที่เรียกว่า Helper Function (บางคนเรียก Utility Function) ขึ้นมา
มันคืออะไร? อธิบายง่ายๆ Helper Function เปรียบเสมือน "เครื่องจักรแปรรูปส่วนกลาง" ที่เราสร้างเอาไว้ในโรงงาน (โปรเจกต์) ของเรา โดยเครื่องจักรนี้มีหน้าที่รับวัตถุดิบดิบๆ (Raw Data) เข้ามาในสายพาน ทำการหั่น สับ ปรุงรส (คำนวณ/ปรับรูปแบบ) และคายผลผลิตที่พร้อมเสิร์ฟ (Formatted Data) ออกมาทางปลายสายพาน
แทนที่เราจะสอนให้พนักงานทุกคนในโรงงานทำอาหารจานนี้เป็น เราก็แค่สร้างเครื่องจักรขึ้นมา 1 เครื่อง แล้วให้ทุกคนเอาวัตถุดิบมาหย่อนใส่เครื่องนี้แทน! ถ้าวันนึงเราอยากเปลี่ยนรสชาติอาหาร เราก็แค่เดินมาตั้งค่าที่เครื่องจักรนี้เครื่องเดียว จบเลย!
📁 ในโปรเจกต์จริงๆ เขาเก็บไว้ที่ไหน?
ในโปรเจกต์ Next.js หรือ React เรามักจะสร้างโฟลเดอร์ชื่อ src/utils/ (ย่อมาจาก Utilities ที่แปลว่าเครื่องมือ) หรือ src/helpers/ เอาไว้แยกต่างหากเลย เพื่อให้ทุกคนในทีมรู้ว่า "อ๋อ ถ้าต้องการเครื่องมือแปลงค่าต่างๆ ให้มาหาในโฟลเดอร์นี้นะ"
Interactive Helper Sandbox
ลองพิมพ์เปลี่ยนค่า "ข้อมูลดิบ" ฝั่งซ้าย แล้วดูว่าเครื่องจักร (Helper) จะทำการแปรรูปข้อมูลให้ออกมาหน้าตาเป็นอย่างไร
เลือก Helper Function
3เจาะลึกโค้ด: การสร้างและเรียกใช้งานจริง
การเขียน Helper Function ที่ดี จะต้องเขียนในรูปแบบที่เรียกว่า "Pure Function (ฟังก์ชันบริสุทธิ์)"ความหมายคือ มันจะต้องไม่ไปยุ่งเกี่ยวกับข้อมูลข้างนอก ไม่ไปดึงข้อมูลจาก Database หรือ API ใดๆ หน้าที่ของมันมีแค่อย่างเดียวคือ: "รับวัตถุดิบเข้ามา (Input) -> แปลงร่าง -> ส่งผลลัพธ์กลับไป (Return Output)"
ขั้นตอนที่ 1: การสร้างเครื่องจักร (ในโฟลเดอร์ src/utils)
src/utils/formatters.ts// เราใช้คำว่า 'export' นำหน้า เพื่อบอกว่า "อนุญาตให้ไฟล์อื่นดึงเครื่องจักรตัวนี้ไปใช้ได้นะ!" export const formatCurrency = (amount) => { // กฎเหล็ก: ต้องเช็คก่อนว่าวัตถุดิบที่ส่งมามันใช่ 'ตัวเลข' จริงๆ ไหม? // ถ้าพนักงานเผลอส่งตัวหนังสือมา (isNaN = Is Not a Number) เราก็แค่ตีกลับไป ไม่ต้องทำงานต่อ if (isNaN(amount)) { return amount; } // ถ้าเป็นตัวเลขถูกต้อง ก็ใช้คำสั่งของ JavaScript เพื่อแปรรูปเป็นเงินบาท // (มีลูกน้ำ และมีหน่วย THB ตามหลัง) return new Intl.NumberFormat("th-TH", { style: "currency", currency: "THB" }).format(amount); };
ขั้นตอนที่ 2: การเรียกใช้เครื่องจักร (ในหน้าจอ UI ของเรา)
สมมติว่าคุณกำลังทำ Component "การ์ดแสดงสินค้า" สิ่งที่คุณต้องทำก็แค่ นำเข้า (Import) เครื่องจักรตัวนั้นมา แล้วโยนตัวเลขดิบๆ ลงไปในวงเล็บของมัน
src/components/ProductCard.tsx// 1. นำเข้าเครื่องจักรมาจากโฟลเดอร์ utils import { formatCurrency } from "@/utils/formatters"; export default function ProductCard({ name, price }) { // สมมติว่า Props 'price' ที่ส่งมาคือเลขดิบ 2500000 return ( <div className="card"> <h2>{name}</h2> {/* 2. โยนเลข 2500000 เข้าไปในเครื่องจักร formatCurrency() */} {/* หน้าจอจะแสดงผลออกมาเป็น: "ราคา: THB 2,500,000.00" อย่างสวยงาม! */} <p className="text-xl font-bold text-green-600"> ราคา: {formatCurrency(price)} </p> </div> ); }
4ข้อดีที่โปรแกรมเมอร์ทุกคนหลงรัก
UI สะอาดตา
ไฟล์ Component จะเหลือแต่โค้ดที่เกี่ยวกับการจัดหน้าจอจริงๆ เพราะโค้ดคำนวณอันซับซ้อนถูกย้ายไปเก็บที่ Helper หมดแล้ว
แก้ง่ายในจุดเดียว
ถ้าอยากเปลี่ยนการแสดงผลจากวันที่ภาษาไทย ไปเป็นวันที่แบบอังกฤษ ก็แค่เข้าไปแก้ใน Helper เพียงจุดเดียว เว็บเปลี่ยนตามทั้งโปรเจกต์
เทส (Test) ได้ง่ายมาก
ฟังก์ชันที่แยกออกมาเดี่ยวๆ สามารถทำ Automated Test (เช่น Jest) เพื่อจำลองการโยนค่าแปลกๆ เข้าไปทดสอบความพังได้ง่ายกว่าฟังก์ชันที่ฝังอยู่ใน UI
