Tầm quan trọng của các mẫu thiết kế với Javascript, NodeJs et al


36

Với Javascript dường như là ngôn ngữ lập trình phổ biến của web trong vài năm tới, các khung công tác mới xuất hiện cứ sau năm phút và lập trình hướng sự kiện dẫn đầu cả phía máy chủ và máy khách:

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?.

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.


5
Một số người cho rằng các mẫu thiết kế (đặc biệt là các mẫu của GoF) là dấu hiệu của sự thiếu hụt ngôn ngữ (xem phần thảo luận này ). Vì JavaScript là nguyên mẫu và có bản chất về chức năng, tôi sẽ nói rằng một tập các mẫu khác có thể áp dụng / hữu ích.

rất quan tâm đến các câu trả lời ... +1 cho câu hỏi :)
usoban

2
Cuốn sách Các mẫu JavaScript của Stoyan Stefanov là một tài nguyên tuyệt vời về hàng tấn các mẫu bạn có thể sử dụng trong JS. Nhiều trong số chúng tồn tại đặc biệt cho JS, và không phải cho bất kỳ ngôn ngữ nào khác.
IgorGanapolsky

Javascript có các mẫu riêng của nó. Ngoài cuốn sách được đề cập bởi Igor, còn có các mẫu thiết kế Javascript học tập của Addy Osmani , miễn phí.
dùng16764

Câu trả lời:


23

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.

  1. Sử dụng đóng cửa
  2. Sử dụng các chức năng hạng nhất
  3. 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.jsnày chỉ đơn giản là events.EventEmitter. Trong jQueryđây là $.fn.bind&& $.fn.trigger. Trong backbonenày là Backbone.Events.triggerBackbone.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 onchangesự 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 WebSocketprototcol chúng ta có .oncá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 toJSONtrên bất kỳ đối tượng nào. Khi bạn gọi JSON.stringifynó sẽ gọi nội bộ .toJSONvà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.


Raynos, câu trả lời tốt đẹp. Ví dụ, tôi đã suy nghĩ nhiều hơn từ cấp độ khái niệm. Ví dụ: "một mẫu người quan sát đã giúp đỡ trong tình huống ..."

@Lewis chọn một vài mẫu thiết kế mà bạn thích và tôi sẽ cố gắng đề xuất các lựa chọn thay thế chức năng phù hợp hơn sau này.
Raynos

Cách tiếp cận nỗ lực và câu trả lời là Raynos xuất sắc. Cảm ơn.
Lewis

@Lewis Tôi đã cố gắng xem xét một vài điều nữa nhưng đã bị bối rối vì tất cả chúng đều được điều chỉnh cho các ngôn ngữ OO cổ điển nghiêm ngặt. nếu có các mẫu thiết kế cụ thể khác mà bạn muốn tôi xem xét hãy cho tôi biết.
Raynos

Bạn đã quên mẫu Prototype - còn gọi là javascript ngu ngốc thậm chí không có oop bình thường ;)
c69

10

Lấy câu trả lời này làm ý kiến ​​chủ quan.

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?

Nếu bạn có nghĩa là các mẫu thiết kế truyền thống như Gang of Four , thì hầu hết các kỹ thuật là bất khả tri về ngôn ngữ / nền tảng như "Chương trình cho giao diện, không phải là triển khai" hoặc "Thành phần đối tượng ưu tiên trên kế thừa lớp" và cũng quan trọng không kém đối với các nhà phát triển JavaScript.

Các mẫu cụ thể hơn như sáng tạo, cấu trúc và hành vi có thể hoặc không cần được sử dụng theo cùng một cách hoặc thường xuyên như trong các ngôn ngữ khác vì các tính năng ngôn ngữ có thể ảnh hưởng đến việc sử dụng chúng ở mức độ lớn. Do đó, một số ngôn ngữ (bao gồm JavaScript) có các mẫu thiết kế riêng dựa trên chức năng hoặc đường cú pháp mà chúng cung cấp.

Nói chung, tôi sẽ nói rằng các mẫu thiết kế truyền thống cũng quan trọng như trong các ngôn ngữ khác, nhưng các mẫu cụ thể của JavaScript quan trọng hơn các mẫu truyền thống.

Đặt tên cho ba mẫu thiết kế hàng đầu mà bạn, là 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

Trong số các mẫu thiết kế JavaScript thiết yếu tôi chủ yếu sử dụng:

1. Mẫu xây dựng (Với nguyên mẫu)

Đặc biệt là về phía máy chủ khi viết nội dung node.js, vì nó rất phù hợp để viết các mô-đun mặc dù nó thiếu đóng gói riêng. Ngoài ra, nó phổ biến đối với nhiều nhà phát triển khác nếu bạn duyệt các kho lưu trữ trên GitHub, vì vậy việc làm quen với mẫu này có thể giúp bạn hiểu rõ hơn về các mã khác.

2. Tiết lộ mô hình mô-đun

Cung cấp mô-đun với đóng gói.

3. Mô hình DRY

Đây là kịch bản khá cụ thể, mặc dù mọi nhà phát triển nên sử dụng nó nhiều nhất có thể.


Cảm ơn! Câu trả lời tốt đẹp, và loại phản ứng mà tôi đã hy vọng. Mặc dù câu hỏi có thể được xem là chủ quan, nhưng một câu trả lời tốt như thế này cho thấy rằng có một câu trả lời thích hợp. Sẽ chờ phản hồi nhiều hơn trước khi 'đăng xuất'.

2

Các mẫu thiết kế được dạy trong các lớp thiết kế cho CS. Chúng không cần thiết, nhưng thực sự hữu ích nếu bạn có thể tìm thấy các tình huống tương tự để có một giải pháp đã được suy nghĩ thấu đáo.

Nó cũng cho phép các lập trình viên giao tiếp dễ dàng hơn. Bạn có thể nói chuyện với đồng nghiệp của mình về các mẫu. Nếu bạn nói ở đây tôi có Người quan sát của tôi, thì có thể hiểu khá rõ điều gì đang xảy ra.

Mọi người sẽ tự nhiên đưa ra các giải pháp phù hợp với một mẫu thiết kế, nhưng các mẫu thiết kế giúp xác định thuật ngữ và ý tưởng tiêu chuẩn có thể hữu ích.

Không có gì siêu đáng chú ý về các mẫu, điều thú vị nhất là chúng là những ý tưởng được chuẩn hóa và định nghĩa theo những cách có ích nhiều lần.


1

Bạn là nhà phát triển Javascript có coi Mẫu thiết kế truyền thống là quan trọng hay ít quan trọng

Họ là rất quan trọng.

Điều này là do các khái niệm cho các giải pháp tái sử dụng có thể vượt qua ngôn ngữ. - thay đổi cú pháp - thay đổi triển khai - Notion cho mẫu vẫn tồn tại.

Các nhà phát triển từ bất kỳ ngôn ngữ nào cũng có thể học JS nâng cao bằng cách học các mẫu chứ không phải cú pháp. Những người không biết điều này đang bỏ lỡ.

Vui lòng đặt tên cho ba mẫu thiết kế hàng đầu mà bạn, vì nhà phát triển Javascript thường xuyên sử dụng

Có những mẫu được sử dụng thường xuyên mà một số người sẽ "tranh luận" chống lại. Tuy nhiên, chúng rất tốt để biết vì chúng cực kỳ phổ biến và mạnh mẽ trong JS nâng cao.

1- Không gian tên - bọc mã của bạn trong một đối tượng.

var x = (hàm () {}) ();

2- ObjectConfiguration, mô hình giống như nhà máy. -Pass một đối tượng cho một chức năng, không phải là một loạt các vars.

sản phẩm var = nhà máy ({});

3- Chức năng gọi lại. - Truyền một hàm dưới dạng tham số, được gọi khi tác vụ hoàn thành.

hàm longTask (function () {// gọi cho tôi khi hoàn thành});

Giống như tôi đã nói, một số người có thể lập luận rằng đây không phải là mô hình, nhưng chúng rất phổ biến và rất mạnh mẽ, và nên được đề cập bởi vì chúng thực sự rất hữu ích khi sử dụng các solutons cho các vấn đề phổ biến. Đó là định nghĩa của Mẫu thiết kế.

Câu hỏi tuyệt vời.

Mong rằng sẽ giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.