14 มิถุนายน 2552

A Brief Review of Object-Oriented Design


    • หลัีกการของ Object-Oriented คือ การนำวัตถุที่มีอยู่ในโลก มามองว่าวัตถุนั้นประกอบด้วยอะไรบ้าง มีคุณลักษณะยังไง
และมีความสามารถอะไรบ้างซึ่ง Class เป็นต้นแบบของ Object ที่ประกอบไปด้วย attribute และ method โดย

    • attribute คือ ส่วนประกอบของวัตถุ เช่น รถ มี attribute คือ สีรถ ยี่ห้อ รุ่น เป็นต้น
จำแนกประเภทของ attribute ออกได้ 3 ประเภท
ได้แก่

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
และ polymorphism คือ Fragile base class problem (FBC) เนื่องจากว่าถ้าเราใช้ Inheritance แล้วมีการแก้ไข superclass ใน


ภายหลังจะทำให้กระทบถึง 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 ความคิดเห็น:

ajsarun กล่าวว่า...

ก็สรุปมาใช้ได้นะครับ แต่มีที่ที่ไม่ถูกต้องอยู่จุดหนึ่ง คือ "Component หลีกเลี่ยงการใช้ Inheritance และ Polymorphism หรือเรียกว่า Fragile base class problem (FBC)"

จริง ๆ ควรจะเป็นว่าปัญหาประการหนึ่งของการใช้ inheritance และ polymorphism คือ FBC

I3lackCatXIII กล่าวว่า...

ขอบคุณคะ

จะทำการแก้ไขตามที่แนะนำนะคะ

^______________^