OOP Cơ Bản – Tính đóng gói (Encapsution)

Có thể nói đây là một trong 4 tính chất quan trọng nhất của tư tưởng lập trình Hướng Đối Tượng.

Một cách ngắn gọn, tính đóng gói thể hiện tính che dấu dữ liệu của một lớp, không cho phép bên ngoài tác động mà tự bản thân lớp đó sẽ xử lý và đưa ra loại dữ liệu mà nó muốn bên ngoài biết. Điều này về cơ bản giúp cho cách thức lập trình OOP khác với lập trình hàm, khi mà các dữ liệu có thể được can thiệp trực tiếp như việc gọi đến biến hay hàm.

Với các ngôn ngữ có hỗ trợ OOP, việc che dấu thường được thể hiện dựa vào phạm vi truy cập đến các thành viên trong lớp. Có ngôn ngữ có nhiều hay ít loại phạm vi, nhưng thường sẽ có tối thiểu các phạm vi: private, protected, public

Đồng thời, ta có thể chia thành 3 mức che dấu dữ liệu: mức thuộc tính, mức phương thức, mức lớp. Nội dung sau đây sẽ đi sâu vào thể hiện các mức truy cập đó qua các bài toán cụ thể

1. Che dấu mức thuộc tính.

  1. Mô tả bài toán: Cần xây dựng một lớp Hóa Đơn sao cho số hóa đơn tự sinh từ thứ tự của hóa đơn và ngày hóa đơn. Mỗi hóa đơn mới được tạo ra thì đồng thời số thứ tự sẽ tự tăng lên.
  2. Phân tích: ta thấy rằng bên ngoài chỉ cần cung cấp đầu vào là ngày hóa đơn, còn việc xây dựng số hóa đơn nằm bên trong lớp đó, đồng thời bên ngoài không được tác đến việc tự động thay đổi số thứ tự của hóa đơn.
  3. Mã nguồn: (C#)
  4. Kết quả:

Ở đây ta đã che dấu việc gán dữ liệu (set) HoaDonID và SoHD khỏi bên ngoài

2. Che dấu mức phương thức.

  1. Mô tả bài toán: Cần tạo ra nghiệp vụ cho người dùng thêm được học sinh vào danh sách để quản lý sao cho mỗi danh sách không có quá 25 học sinh và các học sinh đó không được trùng mã.
  2. Phân tích: Ta cần xây dựng lớp học sinh để mô tả học sinh, lớp nghiệp vụ sẽ chứa danh sách các học sinh cùng các thao tác như kiểm tra trùng mã, kiểm tra giới hạn số lượng và thêm học sinh. Nhưng việc kiểm tra trùng mã và số lượng thì bên ngoài không cần biết, mà đã được phân tách và sử dụng trong lúc thêm rồi.
  3. Mã nguồn: (C#)

d. Kết quả:


Ta thấy rằng học sinh “Pham Thi C bị trùng mã nên không được cho vào danh sách.
Đồng thời ta đã che dấu đi việc kiểm tra tồn tại và số lượng khỏi bên ngoài, bên ngoài chỉ việc quan tâm đến việc thêm học sinh vào chứ không cần quan tâm đến hành vi xử lý của việc thêm này là gì.

3. Che dấu mức lớp.

  1. Mô tả bài toán: Hãy thiết kế lớp Học sinh sao cho có thể chia riêng phần dữ liệu ánh xạ của nó với CSDL và phần dữ liệu bổ xung với các bảng tham chiếu khi cần.
  2. Phân tích: Nếu ta sử dụng thuần túy việc khai báo liệt kê các thuộc tính của lớp, ta sẽ gặp khó khăn khi mô tả các thuộc tính chính cũng như thuộc tính phụ trợ của lớp, ngoài ra việc xử lý đặc thù riêng 2 loại dữ liệu này cũng sẽ phải viết mã xử lý trong cùng một lớp chính, khiến lẫn lộn khi quản lý mã và khó khăn trong việc che dấu dữ liệu.
  3. Mã nguồn: (C#)
  4. Kết quả: ta sử dụng lớp khai báo trong lớp để tạo ra phân vùng riêng quản lý các thuộc tính chính và phụ trợ, sau đó có thể xử lý riêng biệt với private set của MainData và ExtendData theo cách khác nhau mà không bị nhập nhằng trong cùng một lớp.

Kết luận:

  • Tính đóng gói có thể giúp ta che dấu dữ liệu ở nhiều mức độ khác nhau, tùy thuộc vào bài toán ta đang định xử lý
  • Thực hiện đóng gói tốt đối tượng giúp cho ta triển khai bài toán một cách linh hoạt và đúng đắn, dễ bảo trì mã cũng như giảm bớt rủi ro khi tương tác dữ liệu và khoanh vùng lỗi.

Khánh Nguyễn