บทความโดย ผศ.ดร.ณัฐโชติ พรหมฤทธิ์
ภาควิชาคอมพิวเตอร์
คณะวิทยาศาสตร์
มหาวิทยาลัยศิลปากร
ให้นักศึกษา จับคู่ (Pair Programming) เพื่อร่วมกันพัฒนา Program บริหารจัดการธุรกรรมธนาคาร (Banking System) ในภาษา Go โดยมีการ แยก Code เป็น Package 2 Package ได้แก่
- Package bank สำหรับเก็บ Code ส่วน Business Logic เกี่ยวกับบัญชีธนาคาร (เช่น Struct ต่าง ๆ Interface, Error Handling)
- Package main File หลักสำหรับรัน Program และทดสอบ โดยเรียกใช้ Package bank
Program ต้องประกอบด้วยบัญชีหลายประเภท (เช่น บัญชีออมทรัพย์ บัญชีให้ดอกเบี้ย) พร้อมรองรับการจัดการ Error, Defer, Panic และ Recover อย่างเหมาะสม
รายละเอียดสำคัญที่ต้องมี
1. Account Interface (Abstraction + Polymorphism)
กำหนด Interface ชื่อ Account ที่มี 3 Method ได้แก่
- Deposit(amount float64) error
- Withdraw(amount float64) error
- GetBalance() float64
2. Encapsulation
- มี Struct สำหรับ “บัญชีออมทรัพย์” (savingsAccount)
Field ภายใน (balance) ขึ้นต้นด้วยตัวพิมพ์เล็ก (private field) และให้มี Method (public) สำหรับจัดการ
3. Struct Embedding (Composition Over Inheritance)
- สร้างอีก Struct สำหรับ “บัญชีที่มีดอกเบี้ย” (interestAccount) ด้วยการ Embed savingsAccount และเพิ่ม Field ใหม่ (interestRate) และ Method คำนวณดอกเบี้ย (AddInterest())
4. Polymorphism ผ่าน Account Interface
- Function Transfer(from, to Account, amount float64) error สำหรับโอนเงินระหว่างบัญชี
- Function PrintBalance(a Account) สำหรับพิมพ์ยอดเงินคงเหลือ
5. Error Handling
- เมื่อมีการฝาก/ถอนเป็นจำนวนไม่เหมาะสม (ฝาก/ถอนติดลบ หรือถอนเกินยอด) ให้ส่ง error กลับ
- มี Custom Error 1 ชนิด (InsufficientFundsError)
Function Error
return String ดังต่อไปนี้
return fmt.Sprintf("ยอดเงินไม่เพียงพอในการถอน: ต้องการ %.2f แต่มีแค่ %.2f", e.Requested, e.Balance)
6. Panic และ Recover (จำลองสถานการณ์ Error ร้ายแรง)
- สร้าง Function RiskyBankOperation() ที่มีเงื่อนไขบางอย่างจะทำ panic
- ใช้ defer + recover() เพื่อจัดการเมื่อเกิด panic โดยยังให้ Program ทำงานต่อได้
7. Defer
ใช้ defer เพื่อสาธิตว่า Code ส่วนหนึ่งจะถูกเรียกก่อนที่ Function จะ return หรือในกรณีเกิด panic ใน RiskyBankOperation()
8. ใน main.go (package main)
- สร้างบัญชีต่าง ๆ (Savings / Interest)
- สาธิตการฝาก/ถอน/โอน
- ทดลอง Error (เช่น ถอนเกินยอด)
- ทดลอง RiskyBankOperation() ให้เกิด panic และใช้ recover()
- พิมพ์ผลลัพธ์และ Error ที่เกิดขึ้นให้ชัดเจน
การ Pair Programming
- วางแผนร่วมกัน ตกลงกันว่าจะสร้าง Function อะไรบ้าง และจะแยก File/PAckage อย่างไร
- ทำโครงสร้าง bank.go และ main.go ที่จะใช้
- สลับบทบาท Driver/Navigator
Driver คนพิมพ์ Code
Navigator คนแนะนำ/ตรวจสอบ Code
สลับกันทุก ๆ 10 นาที - ทดสอบกับไฟล์ Unit Test ที่กำหนดต่อไปนี้ ด้วยคำสั่ง
go test -v ./bank
โครงสร้าง Project ที่ควรจะมี
.
├── bank
│ ├── bank.go
│ └── bank_test.go
├── banking
├── go.mod
└── main.go