· Phạm Thành Nam · Ngôn ngữ Rust · 3 phút đọc

30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust

Day 19: Rust có phải là ngôn ngữ OOP không? Tái hiện các đặc tính Đóng gói (Encapsulation) và Kế thừa (Inheritance) qua con mắt của Struct và Traits.

Day 19: Rust có phải là ngôn ngữ OOP không? Tái hiện các đặc tính Đóng gói (Encapsulation) và Kế thừa (Inheritance) qua con mắt của Struct và Traits.

Sự ảo tưởng của Khái niệm Lập trình OOP

Gần suốt từ thế kỉ 20, sách vở dạy bạn OOP (Lập trình hướng đối tượng) định nghĩa xoay quanh 3 trụ cột: Tính Đóng gói, Tính Kế thừa, Tính Đa hình. Từ C++ kéo qua Java, trào lưu Thiết kế Gắn Chết Object đã dìm chết biết bao Khối Óc Lập Trình (Ví dụ: Bạn muốn mượn tính năng Ăn Cỏ của Lớp Động Vật, bạn Kế Thừa Nó… Và bạn xách dọng luôn Mọi Chức năng Ảo Ma, Lọc Máu Của Nguyên dòng tộc Nặng Ngàn Cân Lấn Bóp Dữ Liệu App).

Rust chê bai và từ chối cung cấp từ khóa classextend (Kế thừa gộp gia phả). Tuy nhiên, Rust vẫn xào nấu ra 3 Cây Cột Trụ cực kì mượt mà!

Sơ đồ mô phỏng các Object trao đổi thông điệp qua Trait OOP

1. Tính Đóng Gói (Encapsulation / Private Scope)

Việc Giấu Thùng Vàng Giữa Quá Khứ, Bảo Đối Không Quả Nào Đục Vào Đổi Số Tiền Trắng Nhợn Từ Vườn Gà Ác. Trong Rust, nó Chính là Cơ Chế Private Mặc Định Chặn Lòng Hành Tinh:

pub struct KhuBaTang {
    pub thiet_ke: String,      // Khoe Thân (Cho Tụ Chỉnh Đổi)
    ho_so_mat: Vec<i32>,       // Lặng Mút Tuyệt Đối Private by Default
}

impl KhuBaTang {
    pub fn new() -> KhuBaTang {
        KhuBaTang {
            thiet_ke: String::from("Nhà Cổ"),
            ho_so_mat: vec![10_000, 20_000],
        }
    }
    
    // Hàm Gọi Đọc Cửa (Getter). Không đưa Khóa Xuyên Tham Chiếu `&mut`, Lạy Rời Éo Ai Phá Được
    pub fn doc_ma_kho>(&self) -> &Vec<i32> {
        &self.ho_so_mat
    }
}

2. Tính Kế Thừa vs Composition (Khai Sáng Dòng Traits)

Nỗi kinh hoàng nhất C++ Cú Tác: Class Animal -> Class Dog -> Đè Chéo Mặt Class Bizarre Alien -> Lỗi Bug Bọc Tròn (Diamond Problem).

Rust Gạt Sạch: Lấy Hành Động Tính Trait. Bạn Không Kế Thừa Gộp Mặt Thằng Gốc, Mày Đọc Thỏa Bảng Mô Tả Tính Chất VÀ Ký Kín Tên Tuần Lễ Là Được Nhé Tên Kiểu. Lệnh Gọi “A Is B” vĩnh viễn Dập Tan, Thay Vào Là Đạo Lý “A LÀM ĐƯỢC CHỨC NĂNG H B”.

Vạch Bài Cụ Thể (State Pattern OOP): Bài Post Mở Tạo Bản Nháp -> Check Duyệt -> Phân Giải Post Bài. Cấu Phân Rã:

// Hộp Lưu State
pub struct Post {
    state: Option<Box<dyn State>>,
    content: String,
}

// Bảng Khởi Khế Interface Trái Tính Luật Lõi
trait State {
    fn request_review(self: Box<Self>) -> Box<dyn State>;
    fn approve(self: Box<Self>) -> Box<dyn State>;
    // .. 
}
// Chặn 3 Cái Lõi Impl Bám Tính Dữ Cho Draft (Nháp), Pending (Chờ), Published (Xong). 
// KẾT: Tách Đứt Vành Rể Bức Code Thay Vì Nhồi Gùi Vô Class Lộn Xộn Cũ Kĩ!

3. Tính Đa Hình Mảng Đối Loại Kẹt (Trait Objects)

Dùng Trait Gốc Để Lập Môn Các Dòng Lỗ Tương Đồng Ở Đám Bảng GUI (Giao Diện Nút, Lớp Text TextBox):

pub trait Draw { fn draw(&self); }

// Mảng Box Chứa Liên Vòm Trích Mọi Chủng Dòng Button/Form
pub struct Screen {
    pub components: Vec<Box<dyn Draw>>,
}

impl Screen {
    pub fn run(&self) {
        for component in self.components.iter() {
            component.draw();
        }
    }
}

Tẩy Sạch Code Thống Trị Nguy Hiểm, Sức Mạnh Mô-Đun Lên Ngôi Bật Nhất Ở Các Đời Rust Game Engine Bevy Cứu Máy Nạp Frame!


Sẵn sàng cho Ngày 20? Hoả Vận OOP Bịt Kéo Pháo Thành 2 Cục Sáng Đảo Tranh Trác Nếp Cắt Pattern Nâng Cao Ở Trại Kỹ Nghệ Dev Chuyên Trị Tưởng: [Day 20: Hoa Văn Lấp Mảng Pattern Control].

Chuỗi bài viết

30 Ngày Trở Thành Rustacean Tinh Hoa

Phần 19 / 30

30 bài viết
  1. Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
  2. Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
  3. Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
  4. Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
  5. Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
  6. Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
  7. Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
  8. Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
  9. Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
  10. Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
  11. Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
  12. Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
  13. Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
  14. Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
  15. Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
  16. Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
  17. Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
  18. Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
  19. Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
  20. Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
  21. Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
  22. Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
  23. Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
  24. Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
  25. Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
  26. Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
  27. Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
  28. Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
  29. Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
  30. Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa

Bình luận

Quay lại Blog

Bài viết liên quan

Xem tất cả bài viết »