2020.07.08

Tính đóng gói (Encapsulation) trong lập trình hướng đối tượng

Encapsulation1

Lời Mở Đầu.

Nhắc tới lập trình hướng đối tượng (OOP) ngay lập tức chúng ta sẽ nghĩ tới 4 tính chất đặc trưng đó là: Tính đóng gói (Encapsulation), Tính kế thừa (Inheritance), Tính đa hình (Polymorphism) và Tính trừu tượng (Abstraction). Nhưng chúng ta hầu như chẳng mấy khi quan tâm định nghĩa chính xác nó là gì. Gần đây mình có tham một buổi seminar về OOP trong đó có tính đóng gói. Mình nhận thấy rằng trước giờ mình chưa từng quan tâm đến định nghĩa tính đóng gói là gì. Do đó mình đã tìm hiểu và đúc kết lại tính đóng gói thành một khái niệm dễ hiểu như sau:

 


1. Khái niệm.

Tính đóng gói (Encapsulation) được hiểu đơn giản các dữ liệu (data) và các hàm/phương thức (functions/methods) có liên quan đến nhau được “đóng gói” thành các lớp (class) để tiện cho việc quản lý và sử dụng.


2. Ý nghĩa

a. Đóng gói để tiện lợi cho việc quản lý và sử dụng. Tức là mỗi “gói” được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng “gói” đó.

b. Đóng gói còn để che giấu một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không thể nhìn thấy (Data Hiding). Việc cho phép môi trường bên ngoài tác động lên các dữ liệu, hàm, phương thức của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn, bảo mật của đối tượng. Người lập trình có thể dựa vào cơ chế này để ngăn ngừa việc gán giá trị không hợp lệ vào thành phần dữ liệu của mỗi đối tượng.

 

 

3. Ví dụ minh hoạ 01.

Khi bị bệnh chúng ta tới bệnh viện để khám. Sau khi khám bác sĩ nói chúng ta bị cảm cúm, và kê cho chúng ta một đơn thuốc, trong đơn thuốc có danh sách các loại thuốc, liều lượng của mỗi loại và thời gian uống thuốc. Đọc đơn thuốc chúng ta chỉ biết là có những loại thuốc đó và liều lượng của mỗi loại thuốc như thế nào uống vào thời điểm nào. Nếu uống đúng loại thuốc, đúng liều lượng đúng thời gian thì chúng ta sẽ hết cảm cúm, còn cụ thể bên trong mỗi loại thuốc đó chứa những hoạt chất gì, tại sao chúng ta phải uống liều lượng như vậy, tại sao phải uống đúng giờ được chỉ định, chúng ta cũng hoàn toàn không biết.

 

Đứng trên cương vị lập trình viên ta có thể hiểu:

Có một class tên là DieuTriCamCum{}. Trong class này có dữ liệu (Data)  là các loại thuốc, các hàm/phương thức (function/method) là liều lượng của mỗi loại thuốc và thời gian uống thuốc.

 

 

4. Ví dụ minh hoạ 02.

Một ví dụ đơn giản nữa về tính đóng gói như sau: Trước tiên các bạn hãy xem qua đoạn code TODOS APP viết bằng PHP sau →

Encapsulation2

Encapsulation3

Encapsulation 1

 

Tính đóng gói thể hiện ở đoạn code trên là việc kết hợp các dữ liệu và các phương thức xử lý về quản lý công việc trong TODOS APP được “gói” vào một class có tên là: UserTasks.

 

Việc che dấu dữ liệu (Data Hiding) được thể hiện ở việc class UserTasks che giấu đi các hàm get_task_by_id(), get_task_by_name(), các properties $task_id, $table (ở dạng private hoặc protected) để đảm bảo rằng các dữ liệu đó sẽ được truy cập đúng mục đích,  đúng cách thông qua các hàm/phương thức publicclass UserTasks cung cấp.

 


Trong ví dụ trên:

Class HasExtends được kế thừa từ UserTasks vậy nên function hasExt() có thể truy xuất được những properties/function ở dạng publicprotected,  không truy xuất được các properties/function ở dạng private.

 

 Class NoExtends không được kế thừa nên function noExt() chỉ truy xuất được các properties/function ở dạng public, không thể truy xuất được các properties/function ở dạng private/ protected

 

Các properties/function ở dạng private thì chỉ trong class UserTasks mới gọi được. Từ ngoài không thể gọi vào. →  Đó chính là Data Hiding.

 

5. Tổng kết.

Vậy là mình đã chia sẻ xong với mọi người về tính đóng gói (Encapsulation) trong OOP.  Thông qua những kiến thức trong bài viết về tính đóng gói (Encapsulation), hy vọng các bạn có thể hiểu thêm về tính đóng gói (Encapsulation), để các bạn có thể vận dụng tính đóng gói một cách chính xác triệt để và hiệu quả trong công việc của các bạn.

 

6. Tham khảo.

https://en.wikipedia.org/wiki/Object-oriented_programming

https://stackify.com/oop-concept-for-beginners-what-is-encapsulation/

https://press.rebus.community/programmingfundamentals/chapter/encapsulation/