วันจันทร์ที่ 24 ตุลาคม พ.ศ. 2559

ความคิดที่เป็น OOP กรณีตัวอย่างที่ 1

สวัสดีครับเพื่อนๆ ผมไม่ได้เขียนบล็อกตั้งนาน ก็จะแชร์สิ่งที่ทราบมาอยู่ 2 เรื่องใหญ่ๆ ได้แก่การออกแบบ OOP กับ การออกแบบตารางในฐานข้อมูล มาดูเรื่อง OOP กันก่อน เข้าเรื่องเลยนะครับ
1) สมมติเรามีคลาสที่รับผิดชอบเกี่ยวกับการเคลื่อนไหวของราคา คือ
- ราคาเปิด (open price)
- ราคาปิด (close price)
- ราคาสูง (high price)
- ราคาต่ำ (low price)
ทำนองนี้ เราจะเรียกเขาว่า OCHLMovement

2) เรามีอีกคลาสรับผิดชอบเกี่ยวกับปริมาณ กล่าวคือ
- ปริมาณล่าสุด (last volume)
- ปริมาณสูงสุด (max volume)
- ปริมาณต่ำสุด (min volume)
ทำนองนี้ ซึ่งเราเรียกเขาว่า VolumeMovement
มันเป็นแค่การสมมตินะครับ เมื่อให้ทั้งสองคลาสนี้ทำงานในส่วนที่ตนรับผิดชอบ OCHLMovement จะไม่ยุ่งกับ VolumeMovement และ VolumeMovement ไม่มั่วกับ OCHLMovement ต่างก็ทำงานของตนอย่างผาสุก

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

วิธีที่ 1. โอ้ข้าเห็นแล้ว ข้ารู้ข้าเห็น โอ้ มันมีส่วนที่เป็นราคาและส่วนที่เป็นปริมาณ แสดงว่าแบบนี้คลาสอย่าง OCHLMovement กับ VolumeMovement ก็น่าจะใช้ได้ ออกแบบได้อย่างนี้
class Stock
- ochlMovement: OCHLMovement
- bidVolume: VolumeMovement
- offerVolume: VolumeMovement
- lastTradeDate: Date

หรือ วิธีที่ 2. อื่ม...คิดไม่ออก ไม่รู้ว่าระบบที่มีมีคลาสอะไรบ้าง เอ้~จะคิดแบบนั้นไปทำไม ก็สร้างมันขึ้นทื่อๆเลย จัดไปตามที่มันต้องมี class Stock
- openPrice: double
- closePrice : double
- highPrice: double
- lowPrice: double
- bidVolume: double
- offerVolume: double
- lastTradeDate: Date

มาถึงตรงนี้ผมอยากจะถามเพื่อนๆว่า วิธีการแบบไหนที่เป็น OOP หรือมีแนวทางการออกแบบไปในทิศทางของ OOP ที่ควรเป็น?
คำตอบคือ วิธีการที่ 1. มีแนวโน้มไม่เป็น OOP ครับ เพราะเป็นการนำ (ขีนเส้นใต้เลยนะ) ลักษณะอื่นที่มีผลการทำงานในลักษณะอื่นมาเป็นลักษณะของมัน ซึ่งไม่ถูกต้อง ลักษณะอื่นเหล่านั้นไม่ชัดเจนในลักษณะของมัน แม้ว่าจะให้กลไกอย่างเดียวกันได้ แต่ก็ไม่ใช่ลักษณะของสิ่งที่ควรเป็น เหตุนี้วิธีการที่ 1. นี้จึงมีแนวโน้นไม่เป็น OOP ครับ ฟันธงไปเลยว่าไม่ถูกต้อง
ดังนั้นคำตอบ วิธีการที่ 2. การคิดลักษณะของมันเพื่อเป็นตัวตนของมัน จึงเป็น OOP ที่ถูกต้องนั่นเองครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น