Mẫu Mô-đun ban đầu được định nghĩa là một cách để cung cấp cả đóng gói riêng và công khai cho các lớp trong công nghệ phần mềm thông thường.
Khi làm việc với mẫu Mô-đun, chúng tôi có thể thấy hữu ích khi xác định một mẫu đơn giản mà chúng tôi sử dụng để bắt đầu với mẫu này. Đây là một trong đó bao gồm các biến khoảng cách tên, công khai và riêng tư.
Trong JavaScript, mẫu Mô-đun được sử dụng để mô phỏng thêm khái niệm các lớp theo cách chúng ta có thể bao gồm cả các phương thức công khai / riêng và các biến trong một đối tượng, do đó che chắn các phần cụ thể khỏi phạm vi toàn cầu. Điều này dẫn đến kết quả là giảm khả năng tên hàm của chúng ta xung đột với các hàm khác được xác định trong các tập lệnh bổ sung trên trang.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
Ưu điểm
Tại sao mô-đun Mô-đun là một lựa chọn tốt? Đối với người mới bắt đầu, các nhà phát triển đến từ nền tảng hướng đối tượng sẽ sạch sẽ hơn rất nhiều so với ý tưởng đóng gói thực sự, ít nhất là từ phối cảnh JavaScript.
Thứ hai, nó hỗ trợ dữ liệu riêng tư - vì vậy, trong mẫu Mô-đun, các phần công khai của mã của chúng tôi có thể chạm vào các phần riêng tư, tuy nhiên thế giới bên ngoài không thể chạm vào các phần riêng tư của lớp.
Nhược điểm
Nhược điểm của mẫu Mô-đun là khi chúng tôi truy cập cả thành viên công cộng và tư nhân khác nhau, khi chúng tôi muốn thay đổi mức độ hiển thị, chúng tôi thực sự phải thay đổi từng địa điểm mà thành viên đã sử dụng.
Chúng tôi cũng không thể truy cập các thành viên tư nhân trong các phương thức được thêm vào đối tượng sau đó . Điều đó nói rằng, trong nhiều trường hợp, mô-đun Mô-đun vẫn khá hữu ích và khi được sử dụng đúng cách, chắc chắn có khả năng cải thiện cấu trúc ứng dụng của chúng tôi.
Mô hình mô-đun tiết lộ
Bây giờ chúng ta đã quen thuộc hơn với mô hình mô-đun, chúng ta hãy xem xét một phiên bản cải tiến hơn một chút - mô hình Mô-đun tiết lộ của Christian Heilmann.
Mẫu Mô-đun tiết lộ xuất hiện khi Heilmann thất vọng với việc anh ta phải lặp lại tên của đối tượng chính khi chúng tôi muốn gọi một phương thức công khai từ một phương thức khác hoặc truy cập các biến công khai. Anh ta cũng không thích yêu cầu của mô hình Mô-đun vì phải chuyển đổi để phản đối ký hiệu theo nghĩa đen cho những điều anh ta muốn công khai.
Kết quả của những nỗ lực của anh ấy là một mô hình cập nhật, trong đó chúng tôi chỉ cần xác định tất cả các hàm và biến của chúng tôi trong phạm vi riêng tư và trả về một đối tượng ẩn danh có con trỏ tới chức năng riêng tư mà chúng tôi muốn tiết lộ là công khai.
Một ví dụ về cách sử dụng mẫu Mô-đun tiết lộ có thể được tìm thấy bên dưới
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Ưu điểm
Mẫu này cho phép cú pháp của các tập lệnh của chúng tôi phù hợp hơn. Nó cũng làm cho nó rõ ràng hơn ở phần cuối của mô-đun mà các chức năng và biến của chúng ta có thể được truy cập công khai, giúp giảm bớt khả năng đọc.
Nhược điểm
Một nhược điểm của mẫu này là nếu một chức năng riêng đề cập đến một chức năng công cộng, thì chức năng công cộng đó không thể bị ghi đè nếu cần một bản vá. Điều này là do chức năng riêng tư sẽ tiếp tục đề cập đến việc triển khai riêng tư và mẫu không áp dụng cho các thành viên công cộng, chỉ áp dụng cho các chức năng.
Các thành viên đối tượng công cộng tham chiếu đến các biến riêng tư cũng phải tuân theo các ghi chú quy tắc không vá ở trên.