- หลัีกการของ Object-Oriented คือ การนำวัตถุที่มีอยู่ในโลก มามองว่าวัตถุนั้นประกอบด้วยอะไรบ้าง มีคุณลักษณะยังไง
- attribute คือ ส่วนประกอบของวัตถุ เช่น รถ มี attribute คือ สีรถ ยี่ห้อ รุ่น เป็นต้น
1) Naming : ใช้แยกความแตกต่างของแต่ละ object ออกจากกัน ซึ่งเทียบได้กับ PK ใน Database เช่น เลขทะเบียนรถ
2) Descriptive : มีการเปลี่ยนแปลงค่าได้ตลอดเวลา เช่น เลขไมล์
3) Referential : มีการอ้างอิง object ของอีก class นึง เช่น object ชื่อ owner
- method คือ วิธีการเพื่อใช้ในการจัดการกับคุณลักษณะของ object เช่น วิธีการวิ่งของรถ เป็นต้น
ตัวอย่างการแยก Class กับ Object
ถ้ามองว่ารถ Honda เป็น Class ดังนั้นรถ Honda แต่ละคันจะเป็น Object โดยใช้รุ่นเป็นตัวระบุความแตกต่าง
แต่ถ้ามองว่ารถ เป็น Class ดังนั้นรถแต่ละยี่ห้อจะเป็น Object เช่น Honda
ทั้งนี้การจะมองว่าอะไรเป็น Class อะไรเป็น Object ขึ้นอยู่กับ Domain
Key Concept
Polymorphism - เป็นการสืบทอดคุณสมบัติจากแม่สู่ลูก ซึ่งลูกสามารถนำ method ของแม่มาดัดแปลงให้เป็นแบบของตัวเอง ซึ่งเรียกว่า method override หรืออาจจะสร้าง method ใหม่ทับของเดิมไปเลย ซึ่งเรียกว่า method hiding
Abstract Class - เป็นวิธีการที่จะเรียกใช้ object ได้ โดยไม่ต้องไปรู้ว่ามันสร้างมายังไง ซึ่งเราไม่สามารถสร้างการทำงานให้กับมันได้ ต้องให้ Class ลูก มาทำการ implement ต่อจาก Class แม่
ถ้า Class แม่ มี abstract method >> Class ลูกต้องทำการ override method ทุก method ให้ครบ ไม่เช่นนั้น Class ลูกก็ต้องเป็น abstract class ด้วยเช่นกัน จนกว่าจะมี Class ที่ทำการ override ครบทุกตัว ถึงจะทำการเรียกใช้ Class นั้นได้
Interfaces - มีวิธีการใช้งานเหมือน Abstract Class แต่มีข้อจำกัดมากกว่้าตรงที่
ทุก ๆ method ต้องเป็น abstract method
data ทุกตัวต้องเป็น static final และสมาชิกทุกตัวต้องเป็น public เท่านั้น
ถ้าเราไม่ทำการระบุ ตัว compiler จะระบุให้เราเองอัตโนมัติ
The Unified Modeling Language
Representing a Class in UML - Class Diagram จะประกอบด้วย Class name, Attribute: type, Operations, Comments(ไม่ต้องมีก็ได้)
คำแนะนำ : ไม่จำเป็นต้องใส่ getter, setter เข้าไปใน Class Diagram
Representing Inheritance in UML - จะแสดงการสืบทอดด้วยลูกศรสามเหลี่ยม ถ้าหัวลูกศรชี้ที่ Class ไหน แสดงว่า Class นั้นเป็น Class แม่ และ Class ที่ชี้ไป เป็น Class ลูก
Representing Aggregation in UML - จะแสดงความสัมพันธ์ด้วยสี่เหลี่ยมข้าวหลามตัดและลูกศร โดย Class ที่ถูกสี่เหลี่ยมข้าวหลามตัดชี้ จะเป็น Class ที่มี Class ที่ถูกลูกศรชี้ เป็นส่วนประกอบ
ซึ่งเหมือนกับ Composition เพียงแต่ว่า สี่เหลี่ยมข้าว
หลามตัดของ Composition เป็นสีดำ และ Class ที่ถูกลูกศรชี้จะไม่เกิดขึ้นเลย ถ้า Class ที่ถูกสี่เหลี่ยมข้าวหลามตัด เกิดตายไป หรือจบการทำงาน
แต่ทั้งสองอย่างนี้ เวลานำไปเขียนโปรแกรม จะได้ Code ที่เหมือนกัน
Representing Dependency - จะไม่มีส่วนประกอบ แต่จะเป็นความสัมพันธ์แบบขึ้นต่อกัน ซึ่งถ้าลูกศรชี้ไปที่ Class ไหน Class นั้นจะถูกอ้างในอีก Class
โดยเราสามารถเขียนการอ้างอิงได้สามวิธี คือ
1) ประกาศให้ Classที่ถูกอ้างอิง เป็น parameter ของ method ใน Classที่อ้างอิง เช่น void myFunction1(MyReferencedClass r){...} โดย myF
unction1 เป็น method ใน Classที่อ้างอิง และMyReferencedClass r เป็น parameter
2) เป็น return type ของ Class ที่อ้างอิง เช่น M
yReferencedClass myFunction2(...){...}
ซึ่งมีการ return object ของ Classที่ถูกอ้างอิงออกมา
3) ประกาศเป็น local variable ของClassที่อ้างอิง เช่น void myFunction3(...){ MyReferencedClass m ... }
ซึ่งประกาศ object ของClassที่ถูกอ้างอิง อยู่ภายใต้ methodของ Classที่อ้างอิง
Use Cases - เป็นการจำลอง function การทำงานของระบบ
Sequence Diagrams - แสดงลำดับการทำงานของ program
State Diagrams - แสดงสถานะการทำงาน เมื่อระบบมีการเปลี่ยนแปลงสถานะ
- Component หลีกเลี่ยงการใช้ Inheritance และ Polymorphism เพราะปัญหาประการหนึ่งของการใช้ inheritance
ภายหลังจะทำให้กระทบถึง subclass ทันที
แบ่งได้ออกเป็น 2 แบบ คือ
1) syntactic คือ การเปลี่ยนแปลงโครงสร้างไวยากรณ์ เช่น การเพิ่ม method, attribute หรือสลับ method ขึ้นลงระหว่าง Class แม่ กับ Class ลูก เป็นต้น
วิธีแก้ของปัญหานี้คือไม่ต้องไปทำอะไร เพราะ Java มีกลไกในการจัดการให้เรา
2) semantic คือ การเปลี่ยนแปลงความหมาย โดยมีการแก้ implement ใน superclass เช่น นำเอาการเรียกใช้ method นึงออกไป แล้ว subclass ได้มีการ override method นั้น ดังนั้นเวลา run ออกมา methodของ subclass จะไม่ถูกเรียกใช้งาน เพราะ superclass ไม่มีการเรียกใช้ method นั้นแล้ว
วิธีแก้ของปัญหานี้คือการใช้ source code ดูอ้างอิง
2 ความคิดเห็น:
ก็สรุปมาใช้ได้นะครับ แต่มีที่ที่ไม่ถูกต้องอยู่จุดหนึ่ง คือ "Component หลีกเลี่ยงการใช้ Inheritance และ Polymorphism หรือเรียกว่า Fragile base class problem (FBC)"
จริง ๆ ควรจะเป็นว่าปัญหาประการหนึ่งของการใช้ inheritance และ polymorphism คือ FBC
ขอบคุณคะ
จะทำการแก้ไขตามที่แนะนำนะคะ
^______________^
แสดงความคิดเห็น