🗺️ MOC - OOP cho người đi làm

30 dot notes tách từ ebook của Nguyễn Thế Huy. Sách đi từ nền tảng (OOP là gì, 4 trụ cột) → nguyên tắc thiết kế → SOLID → 11 Design Pattern thực chiến. Đọc tuần tự lần đầu, sau đó dùng từng note như tài liệu tra cứu độc lập.

Tư tưởng xuyên suốt của cả cuốn sách: Code tốt = code dễ thay đổi. Mọi trụ cột, nguyên tắc và pattern trong sách đều phục vụ 2 mục tiêu: Code Reuse (tái sử dụng) và Extensibility và Flexibility (dễ mở rộng khi nghiệp vụ đổi). Chìa khoá để đạt được: phụ thuộc vào trừu tượng, không phụ thuộc chi tiếtProgram to Interface - Tập trung vào trừu tượng.


🧭 Lộ trình học đề xuất (học theo thứ tự 5 level)

Level 0 - Nền tảng: OOP là gì & 4 trụ cột (đọc trước tiên)

Nắm bản chất OOP và 4 đặc trưng không thể thiếu. Không chắc level này thì SOLID và Design Pattern chỉ là học vẹt.

  1. OOP là gì - mô hình gói dữ liệu + hành vi vào object. Bắt đầu từ đây!
  2. Encapsulation - Đóng gói - chiếc khiên: giấu chi tiết, chỉ chìa ra thứ cần thiết
  3. Abstraction - Trừu tượng - mô hình hoá đối tượng giới hạn trong một ngữ cảnh
  4. Inheritance - Kế thừa - xây class mới dựa trên class cũ (quan hệ “LÀ MỘT”)
  5. Polymorphism - Đa hình - cùng lời gọi, class thực quyết định hành vi

Level 1 - Bốn nguyên tắc thiết kế nền tảng ⭐

“Kim chỉ nam” để đánh giá một thiết kế tốt hay tồi - nền của mọi SOLID và pattern phía sau.

  1. Code Reuse - mục tiêu 1: đừng copy-paste, hãy tái sử dụng
  2. Extensibility và Flexibility - mục tiêu 2: “thay đổi là thứ cố định duy nhất”
  3. Đóng gói (Nguyên tắc thiết kế) - cô lập phần hay thay đổi (khác trụ cột Encapsulation)
  4. Program to Interface - Tập trung vào trừu tượng - phụ thuộc vào interface, không phải implementation ⭐⭐
  5. Composition over Inheritance - ưu tiên quan hệ “CÓ MỘT” hơn “LÀ MỘT” ⭐⭐

Level 2 - SOLID: 5 nguyên tắc + IoC/DI 🔥 (phần cốt lõi)

Uncle Bob’s 5 nguyên tắc giúp thiết kế dễ hiểu, linh hoạt, dễ bảo trì. Đọc SOLID trước để có bức tranh tổng, rồi đào từng chữ.

  1. SOLID - bản đồ 5 chữ cái, đọc đầu tiên trong level này
  2. Single Responsibility Principle - S: một class, một lý do để thay đổi
  3. Open Closed Principle - O: mở để mở rộng, đóng để sửa đổi
  4. Liskov Substitution Principle - L: class con thay được class cha, không phá vỡ app
  5. Interface Segregation Principle - I: client chỉ phụ thuộc thứ nó CẦN
  6. Dependency Inversion Principle - D: cả hai cấp phụ thuộc vào trừu tượng
  7. Inversion of Control - đảo quyền điều khiển: framework/container gọi code của bạn
  8. Dependency Injection - cách hiện thực IoC: bài toán “bóng đèn - đui đèn”

Level 3 - Design Pattern: nhập môn (đọc trước khi vào từng pattern)

  1. Design Pattern là gì - giải pháp điển hình cho vấn đề lặp lại; GoF & 3 nhóm pattern

Level 4 - 11 Design Pattern thực chiến (kho vũ khí)

Đọc lướt để biết chúng tồn tại, quay lại khi gặp đúng tình huống. Mỗi note có dấu hiệu nhận biết + ví dụ code.

🏭 Nhóm khởi tạo (Creational) - “kéo” việc new ra một chỗ riêng: 20. Factory Pattern - tạo nhiều loại object mà không cần biết chính xác loại nào 21. Builder Pattern - dựng object phức tạp TỪNG BƯỚC 22. Singleton Pattern - đảm bảo chỉ MỘT instance toàn cục

🧱 Nhóm cấu trúc (Structural) - ghép/bọc object: 23. Adapter Pattern - cầu nối 2 interface không tương thích 24. Decorator Pattern - bọc object để thêm hành vi mà không sửa code gốc

🎭 Nhóm hành vi (Behavioral) - cách các object giao tiếp: 25. Chain of Responsibility Pattern - truyền request qua chuỗi handler 26. Command Pattern - biến request thành object độc lập 27. Observer Pattern - cơ chế đăng ký / thông báo sự kiện (pub-sub) 28. State Pattern - đổi hành vi khi trạng thái bên trong đổi 29. Strategy Pattern - nhóm thuật toán hoán đổi được tại runtime 30. Template Method Pattern - khung xử lý ở class cha, chi tiết ở class con


🚀 Lối vào nhanh theo vấn đề (tra cứu khi gặp chuyện)

Bạn đang gặp gì?Đọc note
Code lặp lại nhiều nơi, sửa 1 chỗ sót chỗ khácCode ReuseComposition over Inheritance
Một thay đổi nhỏ làm hỏng nhiều chỗ khácĐóng gói (Nguyên tắc thiết kế)
Mỗi lần thêm tính năng phải sửa class cũOpen Closed PrincipleStrategy Pattern
Class phình to, làm quá nhiều việcSingle Responsibility Principle
Kế thừa xong class con “vỡ trận” khi thay class chaLiskov Substitution Principle
Interface quá lớn, class buộc implement hàm không dùngInterface Segregation Principle
Code cấp cao dính chặt vào class cụ thể, khó testDependency Inversion PrincipleDependency Injection
Cần khởi tạo nhiều loại object tuỳ điều kiệnFactory Pattern
Object có quá nhiều tham số khởi tạoBuilder Pattern
Cần đúng 1 instance dùng chung toàn appSingleton Pattern
Tích hợp thư viện/API có interface lạAdapter Pattern
Muốn thêm chức năng mà không sửa code cũDecorator Pattern
Một request qua nhiều bước kiểm tra/xử lýChain of Responsibility Pattern
Nhiều thuật toán tương tự, muốn hoán đổi runtimeStrategy Pattern
Object cần “phát thông báo” cho nhiều nơiObserver Pattern
Object hành xử khác nhau theo trạng tháiState Pattern
Nhiều quy trình chung khung, khác vài bướcTemplate Method Pattern

🧠 5 câu thần chú rút gọn cả cuốn sách

  1. “Code tốt = code dễ thay đổi” - Extensibility và Flexibility
  2. “Phụ thuộc vào trừu tượng, không phụ thuộc chi tiết” - Program to Interface - Tập trung vào trừu tượng
  3. “Ưu tiên CÓ MỘT (composition) hơn LÀ MỘT (inheritance)” - Composition over Inheritance
  4. “Một class, một lý do để thay đổi” - Single Responsibility Principle
  5. “Design Pattern là ngôn ngữ chung, không phải code copy-paste” - Design Pattern là gì

🗺️ OOP cho người đi làm - Reading Map

Sơ đồ cấu trúc & thứ tự đọc ebook của Nguyễn Thế Huy. Nguyên tắc: đọc tuần tự lần đầu (phần sau xây trên phần trước), sau đó dùng từng phần như tài liệu tra cứu.

Tổng quan: thứ tự đọc 5 phần

flowchart TD
    Start(["📖 Bắt đầu"]) --> P1

    subgraph P1["1️⃣ NỀN TẢNG - OOP là gì & 4 trụ cột"]
        direction TB
        A0["OOP là gì<br/>(gói dữ liệu + hành vi vào object)"]
        A1["Encapsulation - Đóng gói<br/>(giấu chi tiết, chìa ra thứ cần)"]
        A2["Abstraction - Trừu tượng<br/>(mô hình hoá trong 1 ngữ cảnh)"]
        A3["Inheritance - Kế thừa<br/>(quan hệ LÀ MỘT)"]
        A4["Polymorphism - Đa hình<br/>(class thực quyết định hành vi)"]
        A0 --> A1 --> A2 --> A3 --> A4
    end

    P1 --> P2

    subgraph P2["2️⃣ NGUYÊN TẮC THIẾT KẾ NỀN TẢNG ⭐"]
        direction TB
        B1["Code Reuse<br/>(đừng copy-paste)"]
        B2["Extensibility & Flexibility<br/>(sẵn sàng cho thay đổi)"]
        B3["Đóng gói - nguyên tắc<br/>(cô lập phần hay thay đổi)"]
        B4["Program to Interface<br/>(phụ thuộc trừu tượng)"]
        B5["Composition over Inheritance<br/>(ưu tiên CÓ MỘT)"]
        B1 --> B2 --> B3 --> B4 --> B5
    end

    P2 --> P3

    subgraph P3["3️⃣ SOLID + IoC/DI 🔥 (cốt lõi)"]
        direction TB
        C0["SOLID - bản đồ 5 chữ cái"]
        C1["S: Single Responsibility<br/>O: Open/Closed"]
        C2["L: Liskov Substitution<br/>I: Interface Segregation"]
        C3["D: Dependency Inversion<br/>→ IoC → Dependency Injection"]
        C0 --> C1 --> C2 --> C3
    end

    P3 --> P4

    subgraph P4["4️⃣ DESIGN PATTERN - nhập môn"]
        direction TB
        D1["Design Pattern là gì<br/>(GoF • 3 nhóm • ngôn ngữ chung)"]
    end

    P4 --> P5

    subgraph P5["5️⃣ 11 DESIGN PATTERN THỰC CHIẾN (kho vũ khí)"]
        direction TB
        E1["🏭 Khởi tạo:<br/>Factory • Builder • Singleton"]
        E2["🧱 Cấu trúc:<br/>Adapter • Decorator"]
        E3["🎭 Hành vi:<br/>Chain of Responsibility • Command<br/>Observer • State • Strategy • Template Method"]
        E1 --> E2 --> E3
    end

    P5 --> Done(["✅ Dùng từng pattern làm tài liệu tra cứu"])

    style P2 fill:#fff3cd,stroke:#e0a800,stroke-width:3px
    style P3 fill:#f8d7da,stroke:#c82333,stroke-width:2px
    style Start fill:#d4edda,stroke:#28a745
    style Done fill:#d4edda,stroke:#28a745

Hai mục tiêu chi phối tất cả

flowchart LR
    T1["♻️ Code Reuse<br/>(tái sử dụng, đừng copy-paste)"] --> X["Mọi trụ cột,<br/>nguyên tắc & pattern"]
    T2["🔧 Extensibility & Flexibility<br/>(code dễ thay đổi khi nghiệp vụ đổi)"] --> X
    X --> R1["Vì sao có 4 nguyên tắc thiết kế"]
    X --> R2["Vì sao có SOLID"]
    X --> R3["Vì sao có 11 Design Pattern"]
    K["🔑 Chìa khoá chung:<br/>phụ thuộc vào TRỪU TƯỢNG,<br/>không phụ thuộc CHI TIẾT"] --> X

Chọn Design Pattern nào? (tra nhanh theo vấn đề)

flowchart TD
    Q(["🤔 Cần một Design Pattern?"]) --> G{"Vấn đề thuộc nhóm nào?"}

    G -- "Tạo / khởi tạo object" --> C1{"Tình huống?"}
    C1 -- "Nhiều loại tuỳ điều kiện" --> F1["Factory Pattern"]
    C1 -- "Object nhiều tham số, dựng từng bước" --> F2["Builder Pattern"]
    C1 -- "Cần đúng 1 instance dùng chung" --> F3["Singleton Pattern"]

    G -- "Ghép / bọc object" --> C2{"Tình huống?"}
    C2 -- "2 interface không tương thích" --> F4["Adapter Pattern"]
    C2 -- "Thêm chức năng, không sửa code gốc" --> F5["Decorator Pattern"]

    G -- "Cách object giao tiếp / hành xử" --> C3{"Tình huống?"}
    C3 -- "Request qua chuỗi bước xử lý" --> F6["Chain of Responsibility"]
    C3 -- "Đóng gói request thành object" --> F7["Command Pattern"]
    C3 -- "Phát thông báo cho nhiều nơi" --> F8["Observer Pattern"]
    C3 -- "Hành vi đổi theo trạng thái" --> F9["State Pattern"]
    C3 -- "Nhiều thuật toán hoán đổi runtime" --> F10["Strategy Pattern"]
    C3 -- "Chung khung, khác vài bước" --> F11["Template Method"]

    style Q fill:#f8d7da,stroke:#c82333
    style F1 fill:#d4edda,stroke:#28a745
    style F2 fill:#d4edda,stroke:#28a745
    style F3 fill:#d4edda,stroke:#28a745
    style F4 fill:#d4edda,stroke:#28a745
    style F5 fill:#d4edda,stroke:#28a745
    style F6 fill:#d4edda,stroke:#28a745
    style F7 fill:#d4edda,stroke:#28a745
    style F8 fill:#d4edda,stroke:#28a745
    style F9 fill:#d4edda,stroke:#28a745
    style F10 fill:#d4edda,stroke:#28a745
    style F11 fill:#d4edda,stroke:#28a745