"tại sao lại có chuyện Private mà chẳng Public hết cho khoẻ":
Tôi đã nói trước là vấn đề này chỉ quan trọng đối với tôi. Đúng không?
Trên quan điểm đối tượng, một module có thể tạm coi như một cơ sở làm việc. Mỗi cơ sở có một đội ngũ làm việc tiếp xúc với người ngoài và một đội ngũ chỉ chuyên làm việc bên trong, không tiếp xúc với ai cả. Ví dụ như trong một nhà náy, phòng tiếp thị và kho xuất nhập tiếp xúc với bên ngoài, trong khi phân xuởng hoàn toàn biệt lập không tiếp xúc. Người mua hàng chỉ cần biết nơi lấy hàng và trả tiền thôi chứ phân xưởng làm việc thế nào là chuyện của nhà máy. Nơi bán hàng như thế gọi là cái giao diện của nhà máy với bên ngoài, và nó là public. Phân xưởng như thế gọi là vấn đề nội bộ của nhà máy, và nó là private.
Một module cũng đưa ra giao diện của nó là những hàm, thủ tục, và những biến, khai báo public. Những cái nó không muốn đưa ra giaio diện thì nó dùng tiền tố private; ngụ ý: những gì trong code này là chuyện riêng của tôi; tôi chỉ bảo đảm những gì qua giao diện tôi đưa ra, còn những cái tôi không dưa ra, bạn lạm dụng bị sai ráng chịu.
Ví dụ trong moduleX tôi có hàm TongTri(sheet, range). Khi đặt trong giao diện public, moduleX bảo đảm rằng nếu code của moduleY nào đó gọi hàm này thì sẽ được tổng của các trị trong range-sheet. Bên trong moduleX, tôi thấy rằng hàm TongTri cần một cách thức để lấy trị trong range. Tôi viết hàm DocTriCuaRange để đọc từng trị của range. Sau đó tôi đặt DocTriCuaRange là private vì tôi không muốn đưa nó vào cái giao kèo giao diện. Tại sao vậy?
Một ngày đẹp trời nào đó, tôi khám phá ra rằng DocTriCuaRange là thừa, tôi có thể dùng hàm WorksheetFunction.SUM để thực hiện. Thế là tôi xoá DocTriCuaRange. Vì DocTriCuaRange không nằm trong giao diện cho nên tôi tự tiện làm mà không phải báo cáo, điều chỉnh ở đâu cả. Nếu DocTriCuaRange là public, tôi phải dò xem nó được gọi ở những nơi nào và chỉnh sửa chỗ đó.
Ví dụ trên là ví dụ đơn giản; các bạn thấy việc chỉnh sửa code giao diện thực ra không khó lắm. Trên thực tế, có những trường hợp rất phức tạp mà sửa giao diện rất ư là rườm rà, và dẫn tới một đống test để chắc ăn là không bị tình trạng "kéo chăn kín đầu thì hở chân". Nếu bạn có biết qua về biến toàn cục và biến nội bộ thì đã có kinh nghiệm sơ về vấn đề này.
Đối với VBA, thường thì tôi viết các code giao diện trước cho nên chúng là public. Sau đó tôi viết các hàm, thủ tục hổ trợ, hơạc cắt code trong các hàm giao diện ra cho gọn. Đám sau này là pricvate hết.
Cũng có người viết theo kiểu cho public hết. Sau khi code chạy rồi thì chuyển tất cả những cái không phải là giao diện sang private.
Lưu ý: những code worksheetChange, vv được code là private bởi vì chúng không phải là giao diện của worksheet, các hiện tượng gọi chúng mới là giao diện của worksheet.
@jack nt: trong C, có 2 cách để tạo private
1. dùng #define để đặt lại tên cho function. Cách này rất ít người đồng ý
2. C module 'publics' các thành phần giao diện của mình qua headers (.h). Muốn private thì đặt khai báo prototype bên ngoài headers. Không có prototype, code của module khác sẽ không 'thấy' được các function này.