เอา NMoneys มาประยุกต์ใช้กับเรื่องเงินๆ

NMoneys คืออะไร

NMoneys คือ OpenSource libraly สำหรับ .NET ที่  implement มาจาก Money Patterns

load มาใช้ฟรีได้ที่:  http://code.google.com/p/nmoneys/

ตัวอย่างเล็กน้อยให้พอเห็นการใช้งาน NMoneys libraly

เรามี class Account หรือ class แทนบัญชีเงิน และเพิ่มความสามารถให้บัญชีเงินฝากนี้ เพิ่มจำนวนเงินได้

public class Account
{
public Account(decimal amount)
{
_amount = amount;
}

decimal _amount;
public decimal Add(decimal addAmt)
{
_amount = _amount + addAmt;
return _amount;
}
}

แต่งเรื่องเล็กน้อยเพื่อให้มีเหตุการณ์เกิดขึ้น(ไม่มีเรื่องใดๆ ปัญหาใดๆไม่มี) คือ

เริ่มต้นเปิดบัญชีด้วยจำนวนเงิน 500 บาท

var myAccount = new Account(500m);

ฝากเงินเพิ่มอีก 100 บาท

myAccount.Add(100);

ไม่มีอะไรเกิดขึ้นยังปกติดี อะฝากเงินเพิ่มอีก 100 US ดอลล่า ง่ายๆ

myAccount.Add(100);

เฮ้ย! นี่มันไม่ใช่แล้ว เพราะเราสร้าง Account ที่มี amount เป็นเงินบาทนะ งั้นแก้ไขแบบนี้สิ ก่อนเรียก Add เราต้องรู้ว่า จำนวนเงินที่ใส่ไปนั้น มีค่าเงินเป็นอะไร

เป็นดอลล่าใช่มั้ย งั้นตอนนี้อัตราแลกเปลี่ยนเท่าไรละ อ๋อนี่ไง 35 บาท ต่อ 1 US ดอลล่า งั้นเราต้องเขียนแบบนี้

decimal amountUsdtoThb = 100*35;

myAccount.Add(amountUsdtoThb);

นี่ไงเสร็จแล้ว แต่… ไม่เสร็จง่ายๆครับ เพราะก่อนหน้านั้นเราได้ทำผิดไปแล้ว(กลับไปแก้ฐานข้อมูลกันยาวเลย) และ การแก้ไขด้วยวิธีด้านบนก็ไม่ถูกอีก ถ้าใส่ปริมาณเงินที่เป็นบาท หรือ เยนญี่ปุ่น เข้ามาอีกละ

ในที่สุดก็ต้องเพิ่ม enumeration ที่แสดงค่าเงินทั้งหมดที่มี (USD, THB, JPY … อีกเยอะแยะ)เข้าสู่ระบบครับ และเปลี่ยนแก้ method Add กับเพิ่ม enumeration เงื่อนไขไว้ตรวจสอบ สกุลเงินก่อนเพิ่มจำนวนเข้าไป

ซับซ้อนไปใหญ่แล้วเห็นมั้ยครับ OK นี่แค่ method Add แค่ method เดียวนะครับ แล้วถ้าเป็น opertaion ที่ทำงานซับซ้อนมากกว่านี้ละก็ 555 พอๆ ยาวแน่ๆ

เอาละเรามาหยุดความซับซ้อนนี้เพียงเท่านี้ดีกว่า เพราะเราจะใช้ NMoneys ที่สร้างมาจาก Money Patterns(patterns นี่อยู่ใน PoEAA ผมจะเขียนอธิบายแยกต่างหาก) และมัน

ทำตามมาตรฐาน ISO ซะด้วยครับ เข้าไปอ่านเพิ่มเติมที่นี่ NMoneys, a Money Value Object implementation in .NET

กลับมาแก้ตัวอย่างเราต่อโดยใช้ lib NMoneys

เริ่มจากเพิ่ม lib NMoneys เข้าไปที่ projects เราก่อน และ include NMoneys.Extensions เข้า class Account ของเรา

using NMoneys.Extensions;

แก้ไข class Account ให้ใช้ ตัวแปร Money โดย default ของเราให้กำหนดเป็น THB ตามเรื่องราวของเรา

public Account(decimal amount)
{
_amount = amount;
_money = new Money(_amount, Currency.Thb);
}

Money _money;

เพิ่ม methd Add เข้าไปใหม่โดยรับค่า money แทน และ method Add เดิมที่รับค่า decimal ให้ใส่ Obsolete

decimal _amount;
[Obsolete(“กรุณาใช้ Add(Money addMoney) แทน Example: Account.Add(100m.Thb())”)]
public decimal Add(decimal addAmt)
{
_amount = _amount + addAmt;
return _amount;
}

Money _money;
public Money Add(Money addMoney)
{
_money = _money + addMoney;
return _money;
}

เสร็จแล้วครับ ลองเอาไปใช้งานครับ

myAccount.Add(100m.Thb());//ฝากเงิน 100 บาท

myAccount.Add(100m.Thb().Perform(amt => 35 * amt));//ฝากเงิน 100 US ดอลล่า ที่แปลงเป็นบาทแล้ว อัตรา 1 US ดอลล่า เท่ากับ 35 บาท

myAccount.Add(1000m.Thb().Perform(amt => 0.35 * amt));//ฝากเป็นเงินเย็น 1000 เยน ที่แปลงเป็นบาทแล้ว อัตรา 100 เยน เท่ากับ 35 บาท

ข้อให้สนุกกับการเขียนรหัส

ขอบคุณครับ

Advertisements

#c