Bạn có phải là nhà phát triển Javascript coi các Mẫu thiết kế truyền thống là quan trọng hoặc ít quan trọng hơn so với các ngôn ngữ / môi trường khác không?.
Các mẫu thiết kế cổ điển không áp dụng cho JavaScript.
Những gì không áp dụng là viết mã mô-đun và chức năng.
Bạn nên sử dụng hỗn hợp các hàm xây dựng và các hàm hạng nhất.
Là một nhà phát triển JavaScript, cá nhân tôi hướng tới việc coi JavaScript là LISP thay vì Java. Vì vậy, hãy cố gắng mô phỏng các đơn nguyên và mã kiểu chức năng cấp cao hơn sau đó cố gắng mô phỏng mã OOP cổ điển.
Vui lòng đặt tên cho ba mẫu thiết kế hàng đầu mà bạn, vì một nhà phát triển Javascript sử dụng thường xuyên và đưa ra một ví dụ về cách họ đã giúp đỡ trong quá trình phát triển Javascript của bạn.
Một lần nữa các mẫu thiết kế không thực sự áp dụng nhiều nhưng dưới đây là ba cấu trúc quan trọng.
- Sử dụng đóng cửa
- Sử dụng các chức năng hạng nhất
- Sử dụng các nhà máy Object có hoặc không có
new
Vui lòng để lại một số loại bối cảnh mà tôi có thể hiển thị các ví dụ về các loại kỹ thuật này so với việc thực hiện cùng loại mã bằng các mẫu thiết kế truyền thống.
Chúng ta hãy xem một số Mẫu thiết kế cổ điển và cách triển khai chúng trong js cũng như các mẫu thay thế phù hợp hơn với chính js:
Mẫu quan sát viên:
Trong node.js
này chỉ đơn giản là events.EventEmitter
. Trong jQuery
đây là $.fn.bind
&& $.fn.trigger
. Trong backbone
này là Backbone.Events.trigger
và Backbone.Events.bind
. Đây là một mô hình rất phổ biến được sử dụng trong mã hàng ngày.
Tôi không bao giờ dừng lại và nghĩ rằng "Này, tôi đang sử dụng một mẫu người quan sát ở đây!". Không, đây chỉ là một cách cấp thấp để truyền thông điệp xung quanh hoặc một cách để thay đổi tầng.
Ví dụ, trong xương sống, tất cả các khung nhìn MVC liên kết với onchange
sự kiện mô hình để thay đổi mô hình xếp tầng tự động mọi thay đổi đối với khung nhìn. Vâng, đây là một mô hình mạnh mẽ, nhưng nó được sử dụng rất phổ biến trong lập trình hướng sự kiện mà không nhận ra rằng đang sử dụng nó ở mọi nơi.
Trong WebSocket
prototcol chúng ta có .on
cái mà chúng ta sử dụng để liên kết với on("message", ...
các sự kiện. Một lần nữa, điều này rất phổ biến nhưng nó là một người quan sát trên một luồng thay vì dựa trên OOP cổ điển của bạn while (byte b = Stream.ReadNextByte())
.
Đây là tất cả các ứng dụng mạnh mẽ của mẫu Observer. Nhưng đây không phải là một mẫu bạn sử dụng. Đây là một phần đơn giản của ngôn ngữ. Đây chỉ là mã.
Mô hình Memento:
Đây chỉ đơn giản là JSON. Nó cho phép bạn tuần tự hóa trạng thái của một đối tượng để bạn có thể hoàn tác một hành động.
function SomeObject() {
var internalState;
this.toJSON = function() {
return internalState;
}
this.set = function(data) {
internalState = data;
}
this.restore = function(json) {
internalState = JSON.parse(json);
}
}
var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);
Trong JavaScript, chúng tôi thực sự hỗ trợ API cho các vật lưu niệm. Chỉ cần định nghĩa một phương thức được gọi toJSON
trên bất kỳ đối tượng nào. Khi bạn gọi JSON.stringify
nó sẽ gọi nội bộ .toJSON
vào đối tượng của bạn để lấy dữ liệu thực mà bạn muốn tuần tự hóa thành JSON.
Điều này cho phép bạn thực hiện các ảnh chụp nhanh mã của bạn.
Một lần nữa tôi không nhận ra đây là một mẫu vật lưu niệm. Điều này chỉ đơn giản là sử dụng công cụ tuần tự hóa là JSON.
Mô hình nhà nước / mô hình chiến lược:
Bạn không cần một mô hình nhà nước. Bạn có chức năng hạng nhất và các loại động. Chỉ cần tiêm chức năng hoặc thay đổi thuộc tính trên bay.