ข้ามไปยังเนื้อหา

การอ่านไดอะแกรม UML

ทุก pattern ในคอร์สนี้มี UML class diagram อยู่ในส่วน Structure ของตัวเอง UML — Unified Modeling Language — เป็นโน้ตเทชันมาตรฐานสำหรับร่างรูปทรงเชิงสถิตของ code เชิง object: มี type อะไรอยู่บ้าง แต่ละ type ถืออะไรไว้ และเชื่อมโยงกันอย่างไร ไดอะแกรมบอกในแวบเดียวสิ่งที่ย่อหน้าหนึ่งต้องใช้หลายประโยคในการอธิบาย บทเรียนนี้ครอบคลุมเฉพาะส่วนย่อยของ UML ที่คุณต้องใช้จริง ๆ ในการอ่านไดอะแกรมที่นี่ และจับคู่แต่ละชิ้นเข้ากับ syntax ของ Mermaid ที่ render ไดอะแกรมออกมา

class คือกล่องหนึ่ง ที่อาจแบ่งออกเป็นสามแถว: ชื่อ field ของตัวเอง และ operation ของตัวเอง เครื่องหมาย + นำหน้าบ่งบอก member ที่เป็นสาธารณะ ส่วน - บ่งบอกตัวที่เป็นส่วนตัว interface — สัญญาที่ไม่มี implementation — ถูกวาดเป็นกล่องที่มี stereotype <<interface>> อยู่เหนือชื่อของตัวเอง

classDiagram
  class Account {
    -balance: number
    +deposit(amount)
    +withdraw(amount)
  }
  class Repository {
    <<interface>>
    +save(account)
    +findById(id)
  }
class ที่มี member ส่วนตัวและสาธารณะ และ interface หนึ่ง

ลูกศรสองแบบอธิบายความสัมพันธ์แบบ “เป็นชนิดหนึ่งของ” และดูคล้ายกัน ดังนั้นการแยกแยะจึงสำคัญ สามเหลี่ยมกลวงบนเส้นทึบ หมายถึง inheritance — class หนึ่ง extend อีก class หนึ่ง สามเหลี่ยมกลวงบนเส้นประ หมายถึง implementation — class หนึ่งทำตามสัญญาของ interface ใน Mermaid <|-- คือ inheritance (สามเหลี่ยมชี้ไปที่ parent) และ ..|> คือ implementation (เส้นประชี้ไปที่ interface)

classDiagram
  class Shape {
    <<interface>>
    +area() number
  }
  class Polygon
  class Circle
  Shape <|-- Polygon : Polygon extends Shape
  Circle ..|> Shape : Circle implements Shape
สามเหลี่ยมเส้นทึบ = inheritance สามเหลี่ยมเส้นประ = implementation

ลูกศรที่เหลืออธิบายความสัมพันธ์แบบ “has-a” เรียงตามว่า object ทั้งสองถูกผูกเข้าด้วยกันแน่นแค่ไหน:

  • Association — เส้นธรรมดา (Mermaid -->) object หนึ่งเพียงใช้หรืออ้างถึงอีกตัว โดยไม่บ่งบอกถึงความเป็นเจ้าของ Order อ้างถึง Customer
  • Aggregation — สี่เหลี่ยมข้าวหลามตัดกลวง (Mermaid o--) ที่ปลายฝั่งเจ้าของ ความสัมพันธ์แบบทั้งหมด-ส่วนย่อยที่ส่วนย่อยสามารถอยู่ได้นานกว่าทั้งหมด: Team aggregate Player หลายตัว แต่ผู้เล่นดำรงอยู่อย่างเป็นอิสระจากทีม
  • Composition — สี่เหลี่ยมข้าวหลามตัดทึบ (Mermaid *--) ที่ปลายฝั่งเจ้าของ ความสัมพันธ์แบบทั้งหมด-ส่วนย่อยที่แข็งแกร่งกว่า ที่อายุของส่วนย่อยถูกผูกเข้ากับทั้งหมด: House ประกอบขึ้นจาก Room หลายตัวที่ถูกทำลายไปพร้อมกับบ้าน
classDiagram
  class Order
  class Customer
  class Team
  class Player
  class House
  class Room
  Order --> Customer : association (uses)
  Team o-- Player : aggregation (shared part)
  House *-- Room : composition (owned part)
association, aggregation และ composition จากหลวมที่สุดไปแน่นที่สุด

จงจำการจับคู่นี้ไว้ในใจ แล้วทุกไดอะแกรมในคอร์สก็จะอ่านออก:

  • <|-- — inheritance (extend class หนึ่ง)
  • ..|> — implementation (ทำตามสัญญาของ interface)
  • --> — association (ใช้หรืออ้างถึง)
  • o-- — aggregation (เป็นเจ้าของส่วนย่อยที่อยู่ได้อย่างเป็นอิสระ)
  • *-- — composition (เป็นเจ้าของส่วนย่อยที่ควบคุมอายุของตัวเอง)
interface ถูกทำเครื่องหมายอย่างไรใน class diagram เหล่านี้?
สามเหลี่ยมกลวงบนเส้นทึบ (Mermaid <|--) แทนอะไร?
ความสัมพันธ์ใดที่ผูกอายุของส่วนย่อยเข้ากับทั้งหมด?
ใน Mermaid ลูกศรใดบ่งบอก association ธรรมดาที่ object หนึ่งเพียงใช้อีกตัว?