วันเสาร์ที่ 23 สิงหาคม พ.ศ. 2557

Interface, Abstract และ Concrete class

วันนี้เราพูดกันถึงเรื่อง Design Pattern ที่เกี่ยวข้องกับ
: หมู หมา แมว งู และนก

>> การเขียนโปรแกรมด้วยหลักการ OOP มักมาคู่กับการออกแบบคลาสเสมอ ซึ่งถือเป็นปัญหาสำคัญของผู้เขียนโปรแกรมที่อิงตามหลักการนี้แทบทุกคน ไม่เราก็เขาต้องมีคำถามหรือคำตอบทำนองว่า เอาล่ะวะ ได้ล่ะ หรือ เอาประมาณนี้ หรือ หื้อ~โอเคแบบนี้ ไม่กับตัวเองก็กับเพื่อนร่วมทีม

>> การเขียนโปรแกรมจับหลักการดีอย่างไร สำหรับผม ดีที่มั่นใจ ดีที่อุ่นใจได้ว่ากลวิธีที่เราหรือเขาได้ออกแบบมานี้สามารถนำมาประยุกต์แก้ปัญหาและจัดระบบงานได้ในเวลาขณะนั้น ทำให้โค้ดที่เขียนหรือคลาสที่สร้างขึ้นมีคุณภาพ อย่างน้อยก็ในระดับที่ตัวเราเองพอใจ

>> ปัญหาที่อยากแชร์ในโพสต์นี้ก็คือ สมมติเกมของเรามีสัตว์อยู่สามตัว ได้แก่ หมู หมา แมว เราต้องเขียนโปรแกรมเข้าไปควบคุมลักษณะการเดินของมัน คือให้มันส่ายขาดุ๊กดิ๊ก เดินดิ้นยุ๊กยิ๊กๆไปมา จะออกแบบคลาสของเจ้าสัตว์สามตัวนี้อย่างไร


>> งานนี้สมชายยกมือตอบทันที ให้มีคลาส (Concrete Class) ชื่อ หมู หมา แมว (สีเขียว) แต่ละคลาสมีเมธอดหรือพฤติกรรมการเดินสี่ขาของใครของมันไง ตามรูปที่ 1)

>> ปรากฏว่าเมื่อสมชายสร้างคลาส หมู หมา แมว ตามที่เขาคิด เขาก็ได้รู้ว่า โอ๊ะโอ๋! โค้ดที่เขียนลักษณะการเดินสี่ขามันซ้ำกันทั้งสามคลาสเลยนี่นะ ประเด็นคือเขียนโค้ดซ้ำ

>> ดังนั้นสมชายคิดใหม่ สร้าง Abstract Class ขึ้นมาแล้วกัน (สีส้ม) จับเอาสิ่งที่ซ้ำกันไปไว้ที่คลาสนามธรรมนั้น (Abstract Class คือคลาสที่เตรียมขึ้นเพื่อใช้ในการสืบทอดเท่านั้น) แล้วให้คลาส หมู หมา แมว เดิมทั้งสามไปสืบทอดมาอีกต่อหนึ่ง โดยตั้งชื่อคลาสนามธรรมว่า สัตว์ ดังรูปที่ 2) ทีนี้โค้ดของเขาก็ไม่ซ้ำอีกแล้ว

>> และโดยหลักการทั่วไป กลุ่มคลาสใดๆที่มีเมธอดหรือพฤติกรรมซ้ำกัน เมธอดหรือพฤติกรรมเหล่านั้นมักถูกบัญญัติให้เป็นข้อตกลงหรือกติกาที่ใช้ Interface (สีฟ้า) เข้ามากำหนดก่อน หลังจากนั้นจึงให้คลาสใดๆที่ใช้ข้อตกลงหรือกติกานี้มา implement อีกทีหนึ่ง ในที่นี้สมชายให้คลาสนามธรรมที่ชื่อ สัตว์ ไป implement เจ้า Interface ที่เขาได้สร้างและตั้งชื่อว่า สัตว์ เช่นกัน ตามรูปที่ 3) เรียกได้ว่าจัดมาเต็มองค์ประกอบ

>> สัตว์ทั้งสามตัวของสมชายเคลื่อนไหวด้วยการเดินสี่ขาได้เป็นอย่างดี หัวหน้าของเขาพอใจในผลงานมาก หลังจากขายเกมนี้ไปแล้วไม่นาน สมชายก็ได้รับคำร้องขอให้เพิ่มสัตว์อีกสองตัวเข้าไปในเกม นั่นคือ งู กับ นก

>> ครั้นอีตาสมชายจะให้งูกับนกเดินสี่ขาเหมือน หมู หมา แมว มันก็ได้นะ แต่ว่า... งูที่ไหนมีขา? แล้วนกก็ไม่เคยมีสี่ขา? สมชายงานงอก เพราะจะยกเซตเดิมมาหากินไม่ได้แล้ว ดังรูปที่ 4)

>> สมชายจึงสร้างคลาสนามธรรม (Abstract Class) ขึ้นมาใหม่ ให้เป็นของงูและนกตามที่เขาต้องการ ตามรูปที่ 5) แน่นอนว่าเขาไม่ลืมที่จะบัญญัติข้อตกลงที่ว่า งูกับนกเป็นสัตว์ชนิดหนึ่ง ดังนั้นจึงมี Interface เปล่าๆเพิ่มเข้ามาด้วย

>> และเพื่อให้งานใหม่นี้เข้ากับงานเก่าได้ เขาจึงตัดสินใจเปลี่ยนชื่อคลาสนามธรรมที่เป็นของ หมู หมา แมว ให้สอดคล้องกับคลาสนามธรรมใหม่ที่เป็นของงูและนก ได้ตามรูปที่ 6) สมชายส่งงานแบบจัดเต็มเหมือนเคย งูกับนกที่เพิ่มเข้ามาภายหลังจึงสามารถทำงานกับ หมู หมา แมว กลายเป็นเกมที่สนุก + มีเพื่อนใหม่เพิ่มเข้ามาได้เรื่อยๆ เรียกได้ว่าเป็นภาคเสริมที่สร้างความฮือฮาเป็นอย่างยิ่ง

>> งานนี้สมชายรับทรัพย์กลับบ้านพาสาวเที่ยวสบายใจแฮ สวัสดีครับ

*** ประโยชน์ทั้งหมดที่ได้รับ ยกให้กับพี่ชายที่ทำงานหนักคนหนึ่ง นับถือๆ

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

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