Trang chủ > Uncategorized > Bao đóng trong lập trình hướng đối tượng

Bao đóng trong lập trình hướng đối tượng

Bao đóng là che đi phần hiện thực của module, và chỉ cung cấp cho bên ngoài các chức năng của module. Mục đích là làm cho việc thay đổi trong hiện thực của một module (supplier) không ảnh hưởng tới các module đã sử dụng nó (gọi là client).

Tuy nhiên, bao đóng thường bị hiểu sai thành che dấu thông tin một cách vật lý, ngăn cản client truy cập vào phần “bên trong” của supplier. Chính vì vậy mới có quan niệm cứ tạo private field, rồi sau đó tạo thêm các public getter/setter và thế là tính bao đóng vẫn được đảm bảo.

Bertrand Meyer trong Object-oriented software construction đã đưa ra một định nghĩa khác, nhằm tránh sự hiểu lầm trên. Bao đóng nghĩa là tính đúng đắn của các client chỉ có thể chứng minh dựa trên tính đúng đắn của các thuộc tính public của supplier. Nói cách khác, không thể viết được client chỉ có thể vận hành đúng đắn dựa vào các thuộc tính private của supplier.

Ví dụ, xét trường hợp một supplier cung cấp một cơ chế tìm kiếm trong bảng. Client của nó, chẳng hạn như một module trong chương trình bảng tính, sử dụng supplier trên để tìm kiếm các phần tử trong bảng. Bao đóng ở đây có nghĩa rằng, ngay cả khi người xây dựng client biết cụ thể supplier dùng tìm kiếm nhị phân hay bảng băm, họ cũng không thể viết ra một client chỉ chạy đúng với một trong hai phương pháp tìm kiếm, và sai với phương pháp còn lại.

Martin Fowler còn đưa thêm thuật ngữ published để tránh sự nhập nhằng này. Các thuộc tính public là các thuộc tính mà ngôn ngữ lập trình cho phép truy cập từ bên ngoài. Các thuộc tính published là các thuộc tính public mà người phát triển sẽ công bố cho cộng đồng. Chính các thuộc tính published sẽ cho thấy module có thỏa tính bao đóng hay không. Và Eclipse là một ví dụ đáng kể cho chính sách này.

Tóm lại, các cơ chế public, private của các ngôn ngữ lập trình chỉ là công cụ để việc bao đóng được thực hiện một cách gọn gàng và an toàn. Còn việc một module có thỏa mãn tính chất này không còn phụ thuộc vào thiết kế của nó.

Để khẳng định điều này, xin được minh họa một tính năng của Java, cho phép lấy giá trị của một private field của một object bên ngoài.

import java.lang.reflect.Field;

class Foo { 
    private int bar = 100; 
}

public class EncapsulationExample { 
    public static void main(String[] args) throws Exception { 
        Foo foo = new Foo(); 
        Class c = foo.getClass(); 
        Field f = c.getDeclaredField("bar"); 
        f.setAccessible(true); 
        Object o = f.get(foo); 
        System.out.println(o.toString()); // 100 
    } 
}
  1. Chưa có phản hồi.
  1. No trackbacks yet.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: