แนวคิดพื้นฐาน
Data Structures = Class ที่จัดเก็บข้อมูลอย่างเดียว (Pure Models) เช่น Car, Kid, Animal, Event, Employee, Company, Customer เป็น Instance Variables ใน Class อื่น
Method ของ Class นี้ไม่ควรทำงานจริง (Significant Work) มิฉะนั้นมันจะกลายเป็น Object Class ไม่ใช่ Data Structure อีกต่อไป Method หลักคือ Getters/Setters (Accessors/Mutators) เนื่องจาก Instance Variables มักเป็น Private
2 แนวทางการออกแบบ
แนวทาง 1: Data Structure แบบบริสุทธิ์ + Object Class แยก
Data Structure เปิดเผยข้อมูล (Public Variables หรือ Getters/Setters) ไม่มี Method ที่มี Logic ซับซ้อน
Object Class (เช่น MainActivity, Calculator, Iterator) ซ่อนข้อมูล เปิดเผย Method ที่ทำงานบนข้อมูล
แนวทาง 2: Model Class เป็น Object Class (Encapsulation)
public class Square {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height, width;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.14159;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square) shape;
return s.side * s.side;
} else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle) shape;
return r.height * r.width;
} else if (shape instanceof Circle) {
Circle c = (Circle) shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
ในที่นี้ Shapes = Data Structures, Geometry = Object
ข้อดี/ข้อเสีย
| แนวทาง | ข้อดี | ข้อเสีย |
|---|---|---|
| แยก Data Structure + Object | เพิ่ม Method ใหม่ง่าย (แก้ Object Class เดียว) | เพิ่ม Data Structure ใหม่ยาก (ต้องแก้ทุก Method ใน Object Class) |
| Model เป็น Object (Encapsulation) | เพิ่ม Data Structure ใหม่ง่าย | เพิ่ม Method ใหม่ยาก (ต้องแก้ทุก Class) |
ความแตกต่างสรุป: Data Structures vs Objects
| ลักษณะ | Objects | Data Structures |
|---|---|---|
| สิ่งที่เปิดเผย | Behavior (Methods) - ซ่อน Data | Data (Variables) - ไม่มี Behavior สำคัญ |
| เพิ่ม Type ใหม่ | ง่าย (เพิ่ม Class ใหม่ implements Interface) | ยาก (ต้องแก้ Function ทุกตัวที่จัดการ) |
| เพิ่ม Behavior ใหม่ | ยาก (ต้องแก้ทุก Class) | ง่าย (เพิ่ม Function ใหม่จัดการ Struct เดิม) |
สรุป
เลือกแนวทางตามความต้องการเปลี่ยนแปลง: เปลี่ยน Data บ่อย → 用 Objects, เปลี่ยน Operation บ่อย → 用 Data Structures
นี่คือหัวใจของ Expression Problem ใน Software Design