หน้าหลัก/บทเรียนพื้นฐาน/4. Helper Function
เวลาเรียนโดยประมาณ: 15 นาที
Chapter 4: Utilities & Logic

Helper Function ผู้ช่วยตัวเก่งประจำแอป

เราเรียนรู้วิธีการยุบรวม "หน้าตา (UI)" ด้วย Component กันไปแล้ว แต่ในการเขียนโปรแกรม เรายังมี "ตรรกะการคำนวณ" (Logic) ที่ต้องใช้ซ้ำๆ อยู่เต็มไปหมด บทเรียนนี้จะสอนวิธีดึงสมองส่วนนี้แยกออกมาเป็น Helper Function

Helper Function Robot Illustration

พจนานุกรมปูพื้นฐานฟังก์ชันตัวช่วย (Helper Dictionary)

มารู้จักคำศัพท์เทคนิคที่เป็นเสมือนสมองการคำนวณของโปรเจกต์กันก่อนเรียนรู้แบบเจาะลึก:

1. Helper Function (ฟังก์ชันตัวช่วย)

บล็อกชุดคำสั่งคำนวณประมวลผลขนาดจิ๋วที่ดึงแยกสัดส่วนออกมาจากหน้า UI เพื่อความสะดวกในการหยิบไปเรียกซ้ำได้จากทุกจุดในแอปพลิเคชัน

2. Pure Function (ฟังก์ชันบริสุทธิ์)

ฟังก์ชันการคำนวณที่อาศัยเพียงพารามิเตอร์ขาเข้าที่โยนมาเท่านั้น และมีผลลัพธ์การคายส่งออกกลับคืนสม่ำเสมอ ปราศจากการทำลายหรือเปลี่ยนแปลงตัวแปรภายนอก

3. Utilities (โฟลเดอร์รวมเครื่องมือ)

ชื่อโฟลเดอร์สำหรับรวบรวมไฟล์ Helper ทั้งหมดของโครงการ (มักตั้งชื่อว่า src/utils/ หรือ helpers/ เพื่อจัดเก็บเป็นระเบียบ)

4. isNaN (การตรวจค่านนทบุรี)

คำสั่งดั้งเดิมของจาวาสคริปต์ที่ใช้ตรวจสอบความถูกต้องของข้อมูลว่าไม่ใช่ตัวเลข (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

ข้อมูลดิบ (Raw Data)
formatCurrency()
ผลลัพธ์ (Output)
฿2,500,000.00

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


บททดสอบท้ายบทเรียน (Quiz)

มาลองตอบคำถามง่ายๆ เพื่อทบทวนการใช้งาน Helper Function กัน

🧠 ทบทวนความเข้าใจ (Mini Quiz)

ข้อ 1 / 5

Q:ข้อใดคือเหตุผลหลักที่เราควรสร้าง Helper Function?

💡

ลองศึกษาเฉลยเพื่อดูแนวคิดเพิ่มเติม...

Helper Function ช่วยให้ Component สะอาดขึ้น เนื่องจากมีการย้ายโค้ดคำนวณที่ซับซ้อนไปไว้ข้างนอก และสามารถเรียกใช้ซ้ำได้จากทุกที่ในโปรเจกต์

คุณเรียนจบบทที่ 4 แล้ว!

บทต่อไป: การประกาศฟังก์ชัน

เรารู้จัก Helper Function ไปแล้ว บทต่อไปเราจะมาเจาะลึก วิธีเขียนฟังก์ชัน (Syntax) แบบต่างๆ ทั้งยุคเก่าและยุคใหม่ (Arrow Functions) กัน!

เรียนบทต่อไป