Tính đóng gói trong OOP là một khái niệm cơ bản, quan trọng, nhưng nhiều lập trình viên lại bỏ qua. Bài viết này sẽ trình bày một số thông tin mà bạn cần biết về Tính đóng gói trong OOP.
Contents
Tính đóng gói trong OOP là gì?
Tính đóng gói (Encapsulation) là một trong bốn tính chất cơ bản của Lập trình hướng đối tượng (Object-oriented programming – viết tắt là OOP). Các tính chất còn lại bao gồm: Tính đa hình (Polymorphism), Tính kế thừa (Inheritance) và Tính trừu tượng (Abstraction).
Hiểu một cách đơn giản, “đóng gói” là việc đưa tất cả thông tin, dữ liệu quan trọng vào bên trong một đối tượng (object). Sau đó, khi một đối tượng được khởi tạo từ lớp (class), thì dữ liệu và phương thức (method) đã được đóng gói trong đối tượng đó. Khi sử dụng, ta chỉ cần gọi tên phương thức chứ không cần truy cập đến dữ liệu bên trong.
Mục đích của Tính đóng gói trong OOP
Trong tư duy lập trình, việc lấy thông tin từ bên trong đối tượng để phục vụ cho một hành động bên ngoài không được được xem là cách viết mã hay. Do đó, Tính đóng gói được dùng để che giấu dữ liệu bên trong của một đối tượng. Bên cạnh đó, nó chặn quyền truy cập trực tiếp đến các phần tử bên trong của đối tượng.
Lập trình viên có thể tận dụng Tính đóng gói khi muốn bảo vệ dữ liệu bên trong của đối tượng. Dữ liệu đó hoàn toàn không thể bị sửa đổi một cách bất ngờ bởi những mã lệnh bên ngoài từ những phần khác của chương trình.
Vì sao nên tận dụng Tính đóng gói?
Nhìn chung, Tính đóng gói có một số ưu điểm như sau:
- Tính linh hoạt: Mã được đóng gói sẽ linh hoạt, dễ sửa đổi hơn là những đoạn mã độc lập.
- Khả năng tái sử dụng: Mã đã đóng gói có thể được tái sử dụng trong một ứng dụng hoặc nhiều ứng dụng. Từ một đối tượng, người dùng có thể chuyển sang dùng một đối tượng khác mà không phải đổi mã. Bởi vì cả hai đối tượng đều có giao diện như nhau.
- Khả năng bảo trì: Mã được đóng gói trong những phần riêng biệt, như là lớp, phương thức, giao diện,… Do đó, việc thay đổi, cập nhật một phần của ứng dụng không ảnh hưởng đến những phần còn lại. Điều này giúp giảm công sức và tiết kiệm thời gian cho các nhà phát triển.
- Khả năng kiểm thử: Đối với một lớp được đóng gói, Tester sẽ diễn viết những bài kiểm thử hơn. Các biến thành viên sẽ tập trung ở một nơi chứ không nằm rải rác. Do đó, kiểm thử viên cũng tiết kiệm được thời gian và công sức hơn.
- Che giấu dữ liệu: Khi sử dụng phương thức, người dùng chỉ cần biết nó tạo ra kết quả gì. Họ không cần quan tâm đến những chi tiết bên trong của đối tượng để sử dụng nó.
Minh họa về Tính đóng gói trong OOP
Sau đây là một ví dụ về Tính đóng gói trong OOP được viết theo ngôn ngữ lập trình Python.
Đoạn mã trên sẽ có Output như sau:
Selling Price: 900Selling Price: 900Selling Price: 1000
Theo cách viết trên, ta chỉ cần gọi hàm setMaxPrice để thiết lập mức giá tối đa. Công việc này sẽ không hề ảnh hưởng đến nội dung bên trong hàm.
Một số thuật ngữ liên quan
Private, public, protected và default là những thuật ngữ gắn liền với Tính đóng gói. Chúng được gọi chung là Access modifier (bổ từ truy cập). Chúng dùng để giới hạn hoặc quy định phạm vi truy cập của một phương thức trong lớp. Cụ thể:
- Private (riêng tư): phương thức có khai báo private chỉ có thể được truy cập trong chính lớp được khai báo đó.
- Public (công cộng): phương thức có khai báo public có thể được truy cập ở bất cứ lớp nào khác.
- Protected (được bảo vệ): phương thức có khai báo protected chỉ có thể được truy cập thông qua Tính kế thừa.
- Default (Mặc định): là khi phương thức không được khái báo rõ ràng. Thông thường thì nếu không được khai báo, phương thức sẽ được hiểu là public theo mặc định.
Thực tế, nhiều người vẫn thường xuyên nhầm lẫn giữa việc che giấu dữ liệu và Tính đóng gói, dù đây là hai khái niệm hoàn toàn khác nhau. Hy vọng qua bài viết này, các bạn có thể hiểu rõ hơn về Tính đóng gói trong OOP.
Tham khảo: Medium.com