Inheritance และ Composition
การออกแบบทาง OBJECT-ORIENTED จะมีเทคนิค 2 แบบ ที่เป็นแนวคิดในการออกแบบ คือ รูปแบบของIntance และ Composition ซึ่งทั้ง 2 วิธีนี้จะให้ผลในการออกแบบที่ต่างกัน ทั้งจากแนวคิดและหลักการและทั้งสองเทคนิคนี้ก็มีส่วนช่วยให้การออกแบบทาง OBJECT-ORIENTED มีประสิทธิภาพมากขึ้น
Inheritance จะคำนึงถึงความสัมพันธ์ระหว่าง Class (Superclass และ Subclass) ในการถ่ายทอดความสัมพันธ์ของ attribute ส่วน method เป็นหลัก ซึ่งมีรูปแบบความสัมพันธ์เป็น is-a relationship เช่น poodle is a dog. เป็นต้น ส่วน Composition จะไม่คำนึงถึงความสัมพันธ์ในลักษณะของการถ่ายทอด แต่จะมองความสัมพันธ์ของ object ในลักษณะของส่วนประกอบระหว่างกัน ในรูปแบบความสัมพันธ์เป็น has-a relatiionship เช่น car has an engine หมายความว่า car จะมี engine เป็นส่วนประกอบหนึ่ง โดยที่ทั้ง engine และ car มีลักษณะการทำงานเป็นของตนเองไม่มีความสัมพันธ์กันในลักษณะการถ่ายทอดคุณสมบัติใดๆ นนอกจากนี้ object engine ยังอาจประกอบด้วย object ย่อยๆ ได้อีกหลาย object เช่น object piston, object oilTank เป็นต้น
ในการออกแบบทั้งสองวิธี โดยส่วนใหญ่แล้ว วิธี Composition มักจะได้รับความนิยมมากกว่าวิธี Inheritance เนื่องจากความซับซ้อนของเทคนิคการ Inheritance ที่สามารถสร้างความสับสนให้กับผู้ที่ไม่เชี่ยวชาญในการออกแบบได้ แต่วิธีการออกแบบด้วยเทคนิค Inheritance ก็มีข้อดีอยู่ไม่น้อย ถ้าสามารถนำไปใช้ได้อย่างถูกวิธี จะเป็นประโยชน์อย่างมากต่อการเขียนโปรแกรมต่อไปด้วย
ไม่ว่าอย่างไรก็ตาม ทั้ง Inheritance และ Composition ก็มีส่วนสำคัญในการออกแบบทาง object orientedโดยที่ทั้งโปรแกรมเมอร์ ผู้ออกแบบ ระบบ และผู้พัฒนาระบบ จำเป็นต้องรู้และเข้าใจถึงวิธีการ รวมทั้งข้อดีและข้อเสียของการออกแบบในทั้ง 2 วิธี เพื่อจะได้นำไปใช้ปรับปรุงเพื่อการออกแบบที่ได้มีความสมบูรณ์มากที่สุด
Inheritance
จากที่เคยกล่าวมาแล้วในบทที่ 1 เกี่ยวกับการ Inheritance ที่สามารถสรุปได้ว่า Inheritance คือ การสืบทอดลักษณะทั้งหมดของ attribute และ method จาก Parent class ไปยัง Child class และในบทนี้จะกล่าวถึงหลักการนี้อีกครั้ง แต่จะบอกถึงรายละเอียดที่มากขึ้นเกี่ยวกับการออกแบบระบบด้วยเทคนิคการ Inheritance รวมถึงข้อดีและข้อเสียของเทคนิคนี้ซึ่งจะได้ศึกษาต่อไป
หลักแนวคิดในการออกแบบ OBJECT-ORIENTED ด้วยเทคนิคการ Inheritance
การหา class ของระบบ ให้หาความสัมพันธ์จาก class ที่มีอยู่ก่อน โดย class ซึ่งเกิดใหม่จะสืบทอดลักษณะจาก class เดิม
มองระบบให้ประกอบด้วยระดับชั้น (hierarchy) ของ class ต่างๆ โดยที่ในระดับเดียวกันของการสืบทอดลักษณะจาก parent class แต่ละ class จะต้องมีพฤติกรรมต่างกันโดยสิ้นเชิง
การเชื่อมความสัมพันธ์ จะเริ่มจาก Superclass เป็นหลัก และเชื่อมความสัมพันธ์กับ Child class ไปเรื่อยๆ ในลักษณะต้นไม้ (tree)
ตัวอย่างการออกแบบด้วยเทคนิคการ Inheritance
การสร้างระบบข้อมูลภายในร้านขายสัตว์เลี้ยง ด้วนเทคนิค Inheritance มีวิธีการดังนี้คือ
1. หาความต้องการของระบบ
ร้านขายสัตว์เลี้ยงจะต้องมีสัตว์เลี้ยงประเภทที่นิยมเลี้ยงกันทั่วไป , ดูน่ารัก หรือเป็นประเภทที่มีไว้เพื่อความสวยงาม ขนาดต้องไม่ใหญ่โตนัก สามารถนำไปเลี้ยงที่บ้านได้ และต้องเลี้ยงง่าย ต้องแบ่งข้อมูลให้เป็นประเภทเพื่อความง่ายในการค้นหารายชื่อและประเภทของสัตว์แต่ละชนิด
2.หา class ของระบบ
-Aquatic animal class = ประเภทสัตว์ที่อาศัยอยู่ในน้ำ
-Fly animal class = ประเภทสัตว์ปีก มีปีก และ บินได้
-Dog class = มีสี่ขา , เห่าได้ , หายในหอบ , รักเจ้าของ , ชอบกินกระดูก , กระดิกหางเมื่อดีใจ
-Cat class
มีหาง สี่ขา , ร้องเหมี๊ยว ๆ , ชอบอ้อน , ชอบกินปลา
-Fish class
ว่ายน้ำ , หายใจทางเงือก , ผิงหนังเป็นเกล็ด , มีหางไว้ควบคุมทิศทางการว่ายน้ำ
-Turtle class
มีสี่ขา , มีหาง , ว่ายน้ำได้ , มีกระดองไว้ป้องกันตัว
-Bird class
มีปีก , บินได้ , ร้องได้ , มีสีสันสวยงาม , บางตัวพูดได้
สร้างความสัมพันธ์ระหว่าง class
แนวคิด
-มองระบบให้ประกอบด้วยระดับชั้น (hierarchy) ของ class ต่างๆ โดยที่ในระดับเดียวกันของการสืบทอดลักษณะจาก parent class
-แต่ละ class จะมีความสัมพันธ์กันในรูปแบบ is a relationship
-จากแนวคิดสามารถดังกล่าว สามารถนำมาสร้างความสัมพันธ์ระหว่าง class ต่างๆ ได้ดังนี้
● Pet class
-เป็น superclass ของ class ทั้งหมด เนื่องจาก class อื่นๆ จะแสดงพฤติกรรมของการเป็นสัตว์เลี้ยงตาม class นี้
● On land animal class
-สัตว์เลี้ยงที่อาศัยอยู่บนดินจะเป็นสัตว์ประเภทสัตว์บก
-สัตว์บกในที่นี้คือสัตว์เลี้ยงประเภทหนึ่ง
● Aquatic animal class
-สัตว์เลี้ยงที่อาศัยในน้ำจะเป็นสัตว์ประเภทสัตว์น้ำ หรือสัตว์ครึ่งบกครึ่งน้ำ
-สัตว์น้ำบางชนิดคือสัตว์เลี้ยงประเภทหนึ่ง
● Fly animal class
-สัตว์เลี้ยงที่บินได้จะจัดอยู่ในประเภทสัตว์ปีก
-สัตว์ปีกบางชนิดคือสัตว์เลี้ยงประเภทหนึ่ง
● Dog class
-สุนัขเป็นสัตว์ประเภทอาศัยอยู่บนบก
-สุนัขนิยมเลี้ยงไว้ดูเล่น เพราะความน่ารัก และแสนรู้
-สุนัขมักจะเห่า และหายใจหอบ
● Fish class
-ปลาเป็นสัตว์ประเภทอาศัยอยู่ในน้ำ
- ปลานิยมเลี้ยงไว้ดูเล่น เพื่อความสวยงาม
- ปลาว่ายน้ำด้วยครีบ หายใจด้วยเหงือก
● Turtle class
-เต่าเป็นสัตว์ครึ่งบกครึ่งน้ำ
-เต่านิยมเลี้ยงไว้ในตู้โชว์ หรือในบ่อน้ำ เพื่อความสวยงาม
-เต่ามีกระดองไว้ป้องกันตัว
● Bird class
- นกเป็นสัตว์ปีกชนิดหนึ่ง
-นกนิยมเลี้ยงไว้เพื่อความสวยงาม และความบันเทิง
- นกมักจะร้องเสียงไพเราะ เคลื่อนไหวด้วยการบิน หรือกระโดด
class model
แนวคิด
- การเชื่อมความสัมพันธ์ จะเริ่มจาก Superclass เป็นหลัก และเชื่อมความสัมพันธ์กับ Child class ไปเรื่อยๆ ในลักษณะต้นไม้ (tree)
จาก class modle ข้างต้นสมมุติว่าทางร้านได้เพิ่มสุนัขเข้ามาในร้าน 2 พันธุ์คือ LhasaApso และ GoldenRetriever ซึ่งสุนัขทั้งสองพันธุ์มีพฤติกรรมดังนี้
- LhasaApso เป็นสุนัขพันธุ์หนึ่ง ประเภทเลี้ยงไว้ป้องกันอันตรายต่างๆ (guard) ได้ เพราะ สุนัขพันธุ์นี้ทั้งฉลาด และมีความรู้สึกไวนอกจากนี้แล้ว LhasaApso ก็ยังมีสัญชาติญาณความเป็นสุนัข เช่น เห่า และ การหายใจหอบ เป็นต้น
-GoldenRetriever เป็นสุนัขประเภทเลี้ยงไว้ล่าเยื่อ เพราะ GoldenRetriever จะมีความรวดเร็วในการล่าเหยื่อ หรือการเก็บเหยื่อที่ล่าได้ และพฤติกรรมโดยทั่วไปแล้วก็จะมีการเห่า และ การหายใจหอบ ไม่ต่างจากสุนัขทั่วไป
ตามหลักการของการ Inheritance จะพบว่าพฤติกรรมของสุนัขทั้งสองพันธุ์นี้มีลักษณะความเป็นสุนัข เป็นสัตว์บก และสามารถนำไปเลี้ยงไว้ ภายในบ้านได้ ทำให้สามารถนำมาสร้างเป็น class เพิ่มเติมจาก class modle
จะเห็นได้ว่าการออกแบบโดยวิธีการ Inheritance นั้น จะช่วยให้ประหยัดเวลาในการทำงานรวามทั้งการออกแบบก็สามารถทำได้ง่ายขึ้น เนื่องจากสามารถใช้การสืบทอดลักษณะมาจาก Parent class ได้ แต่ในบางกรณีวิธีการ Inheritance ก็ก่อให้เกิดปัญหาเช่นกัน ยกตัวอย่างเช่น
เมื่อทางร้านขายสัตว์เลี้ยงได้สั่งซื้อสุนัขเข้ามาเพิ่มในร้าน เป็นพันธุ์ Basenji ซึ่งพฤติกรรมของสุนัขพันธุ์ Basenji นั้นจะเป็นสุนัขที่ไม่เห่าหรือเห่าน้อยมาก แต่จะใช้เสียงร้องแทน ต่างจากพฤติกรรมโดยทั่วไปของ dog class ที่ได้กำหนดไว้ ดังนั้นการเพิ่ม Basenji class ข้ามาทำให้ต้องเกิดการปรับโครงสร้างระบบที่ได้ออกแบบไว้แล้ว
ข้อดีและข้อเสียของเทคนิคการออกแบบ ด้วยวิธี Inheritance
ข้อดี
1. ประหยัดเวลาในการเขียนโปรแกรมและการทดสอบโปรแกรมส่วนโปรแกรมที่เขียนหรือใช้อยู่ใน parent class ซึ่งสามารถสืบทอดมายัง child class ได้ จึงไม่จำเป็นต้องเขียนใหม่ และไม่ต้องทำการทดสอบใหม่อีกครั้งด้วย
2. การแก้ไขเพิ่มเติมสามารถทำได้ที่ superclass ที่เดียว ไม่จำเป็นต้องทำการแก้ไขในทุกๆ Subclass ที่มีการแก้ไขลักษณะเดียว
เช่น การเพิ่มคุณสมบัติให้สุนัขทุกตัวที่อยู่ในร้านให้มีคุณสมบัติ การกลิ้ง สุนัขทุกตัวจะชอบกลิ้งตัวไปมาบ่อยๆ เป็นต้น ในลักษณะนี้ จะสามารถแก้ไขการออกแบบได้ อย่างง่ายๆ
3. ประโยชน์ของ Polymorphism
เนื่องจากหลักการ Polymorphism จะใช้วิธีการของ inheritance ซึ่งในบางลักษณะของโปรแกรมเมื่อใช้ Polymorphism เข้ามาร่วมในการออก แบบ จะทำให้เกิดประโยชน์อย่างมากต่อผู้ทำการออกแบบ เพราะจะลดความยุ่งยากในบางส่วนลงไปได้ ทั้งนี้ก็เนื่องมาจากคุณสมบัติของการ inheritance ที่ส่งผลถึงการ polymorphism
1. ทำให้เกิดจุดอ่อนขึ้นกับการ Encapsulate
Inheritance จะทำให้การ Encapsulate เกิดจุดอ่อนขึ้นระหว่าง Superclass และ Subclass และปัญหาที่เกิดขึ้นก็คือ ในการเปลี่ยนแปลงส่วน implement ของ Superclass จะส่งผลต่อ Subclass ทั้งหมดและอาจจะทำให้ดกิดผลกระทบต่อระบบโดยที่ไม่ได้คาดคิดมาก่อนได้ เช่น เกิดความยากลำบากอย่างมากในการทดสอบระบบ เนื่องจากหลักการแท้จริงของการ Encapsulate จะช่วยให้การทดสอบระบบง่ายขึ้นเพราะส่วนของ implement จะเปลี่ยนแปลงได้โดยส่วน interface ของ class ตนเองเท่านั้น แต่ในกรณีที่มีการ Inheritanceร่วมด้วยแล้ว เมื่อเกิดการเปลี่ยนแปลงส่วนของ implement ขึ้นที่ Superclass ผลกระทบนี้จะต่อเนื่องไปยังทุกๆ Subclass ทั้งหมดเช่น ดังนั้น ถ้าส่วนของการ implement ไม่สามารถป้องกันได้ หรือไม่สามารถควบคุมได้แล้วนั้น การทดสอบระบบจึงได้ยากยิ่งขึ้น
2. บาง class ที่เพิ่มขึ้นมาในระบบ อาจจะไม่เป็นไปตามโครงสร้างที่ตั้งไว้แต่เดิม และยากต่อการแก้ไขในภายหลัง
ยกตัวอย่างเช่น การเพิ่ม class ของสุนัขพันธุ์ Besenji เข้ามาในโครงสร้างระบบซึ่งต้องทำให้เกิดการแก้ไขเปลี่ยนแปลงโครงสร้างระบบใหม่ ซึ่งถ้าเหตุการณ์นี้เกิดขึ้นกับระบบขนาดใหญ่ย่อมทำให้เกิดความเสียหายตามมาอย่างมาก
Composiition
Composiition หมายถึง การที่ object หนึ่งๆ ประกอบขึ้นจาก object อื่นๆ อีกหลาย object เช่น Car object ประกอบขึ้นจาก engine object, wheels object, steering wheel object และ stereo object เป็นต้น นอกจากนี้ object ที่เป็นส่วนประกอบเหล่านี้ยังประกอบไปด้วย object อื่นๆ เช่นกัน เช่น engine object จะประกอบไปด้วย object piston, object oilTank ซึ่งจริงๆ แล้ว แต่ละ object สามารถทำงานได้เป็นอิสระต่อกัน และ เมื่อนำมารวมกันก็สามารถสร้างการทำงานที่สมบูรณ์ขึ้นให้กับ object ใหม่ได้
โครงสร้างของ Composition จะมีลักษณะเป็นต้นไม้ (Tree) ที่แผ่ขยายกิ่งก้านออกไปเรื่อยๆ ขึ้นอยู่กับความละเอียดของการออกแบบ เพราะจริงๆ แล้วภายในส่วนประกอบของ object หนึ่งๆ จะประกอบไปด้วย object จำนวนมากมายที่ซับซ้อนกันอยู่
Coppyright 2004 By Webmaster All Right Reserved Comments