Ưu điểm của mẫu không có logic (chẳng hạn như ria mép) là gì?


101

Gần đây, tôi gặp phải bộ ria mép được cho là mẫu khônglogic .

Tuy nhiên, không có lời giải thích tại sao nó được thiết kế theo cách Logic-less. Nói cách khác, ưu điểm của mẫu không logic là gì?

Câu trả lời:


107

Nói cách khác, nó ngăn bạn bắn vào chân mình. Trong những ngày JSP cũ, rất phổ biến khi có các tệp JSP được rắc mã Java, điều này khiến việc tái cấu trúc khó hơn nhiều, vì bạn có mã của mình bị phân tán.

Nếu bạn ngăn chặn logic trong các mẫu theo thiết kế (giống như ria mép), bạn sẽ có nghĩa vụ đặt logic ở nơi khác, vì vậy các mẫu của bạn sẽ không gọn gàng.

Một lợi thế khác là bạn buộc phải suy nghĩ về việc tách biệt các mối quan tâm: bộ điều khiển hoặc mã logic của bạn sẽ phải thực hiện việc xoa bóp dữ liệu trước khi gửi dữ liệu đến giao diện người dùng. Nếu sau đó bạn chuyển mẫu của mình cho một mẫu khác (giả sử bạn bắt đầu sử dụng một công cụ tạo khuôn mẫu khác), quá trình chuyển đổi sẽ dễ dàng vì bạn chỉ phải triển khai chi tiết giao diện người dùng (vì không có logic nào trên mẫu, hãy nhớ).


30
Vì vậy, tại sao lại là một điều tốt khi mã bộ điều khiển CÓ thể xoa bóp dữ liệu ở dạng chính xác cần thiết để trình bày dữ liệu theo một cách cụ thể? Tại sao việc thay đổi bản trình bày thường yêu cầu thay đổi mã bộ điều khiển là một điều tốt? Đây dường như là một điều tồi tệ đối với tôi. Tôi nghĩ một mục tiêu của ngôn ngữ mẫu là tách logic bộ điều khiển khỏi logic trình bày. Một mẫu ngu ngốc không thể đưa ra bất kỳ quyết định nào buộc logic trình bày trở lại mã bộ điều khiển. Trong các tổ chức mà một người khác làm việc về thuyết trình, họ không thể tự mình làm việc của mình.
jfriend00 19/09

8
Bạn không nên chuẩn bị dữ liệu cho chế độ xem trong bộ điều khiển của mình. Bộ điều khiển là để kiểm soát luồng ứng dụng. Thay vào đó, những gì bạn nên làm là tạo một lớp trình bày để chuyển đổi mô hình của bạn thành một mô hình chế độ xem mà sau đó chế độ xem sẽ sử dụng. Mô hình chế độ xem là một mô hình cho giao diện người dùng tách biệt với mô hình là một phần của logic nghiệp vụ. Tôi khuyên bạn nên xem bài nói chuyện "Kiến trúc và thiết kế sạch" của Robert "Uncle Bob" Martin: youtu.be/asLUTiJJqdE
ragol

1
Nó buộc một số logic trình bày vào bộ điều khiển, nhưng điều này giúp kết hợp các lớp trình bày khác nhau. Nếu bạn muốn dữ liệu tương tự được trình bày dưới dạng JSON, HTML hoặc XML, bạn không nên thay đổi dữ liệu 100% trong mẫu HTML. Điều đó sẽ khiến JSON và XML có logic hiển thị xoắn của riêng chúng. Bạn đang tập trung 80% logic hiển thị trong bộ điều khiển và nhúng 20% ​​còn lại vào lambdas và bộ lọc.
chugadie,

65

Tôi có cảm giác rằng tôi gần như đơn độc theo quan điểm của tôi, nhưng tôi chắc chắn ở trong trại đối diện. Tôi không tin rằng sự pha trộn logic nghiệp vụ có thể có trong các mẫu của bạn là đủ lý do để không sử dụng toàn bộ sức mạnh của ngôn ngữ lập trình của bạn.

Đối số thông thường cho các mẫu không logic là nếu bạn có toàn quyền truy cập vào ngôn ngữ lập trình của mình, bạn có thể kết hợp logic mà không có chỗ trong một mẫu. Tôi thấy điều này giống với lý luận rằng bạn nên dùng thìa để cắt thịt vì bạn có thể tự cắt mình nếu bạn dùng dao. Điều này rất đúng, nhưng bạn sẽ có năng suất cao hơn nhiều nếu sử dụng cái sau, mặc dù cẩn thận.

Ví dụ: hãy xem xét đoạn mã mẫu sau sử dụng ria mép :

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

Tôi có thể hiểu điều này, nhưng tôi thấy cách sau (sử dụng dấu gạch dưới ) đơn giản và trực tiếp hơn nhiều:

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

Nói như vậy, tôi hiểu rằng các mẫu không logic có những lợi thế (ví dụ: chúng có thể được sử dụng với nhiều ngôn ngữ lập trình mà không cần thay đổi). Tôi nghĩ rằng những lợi thế khác là rất quan trọng. Tôi không nghĩ bản chất ít logic của chúng là một trong số chúng.


135
Tôi ngạc nhiên khi bạn cảm thấy rằng mẫu gạch dưới đơn giản hơn .. nó trông khó đọc hơn đối với tôi. Chỉ là một ý kiến ​​:-)
Ben Clayton

9
@ ben-clayton Tôi đồng ý rằng cú pháp đầu tiên đẹp hơn và có lẽ dễ đọc hơn. Tuy nhiên, sự phức tạp mà tôi đang lái xe khi tôi nói "đơn giản".
brad

1
Đôi khi việc sử dụng câu lệnh bậc ba là thích hợp trong mẫu bất kể bạn có logic nào. Hoặc nếu tôi muốn xuất số lượng mục trong một mảng thì sao? Tôi không biết làm thế nào tôi có thể sử dụng ria mép, nó dường như thiếu những thứ như thế.
Paul Shapiro

5
@PaulShapiro Bạn sẽ tạo ra số lượng các mục trong mảng bên ngoài mẫu và lưu trữ nó trong một biến riêng biệt.
Seun Osewa

4
@brad, mẫu gạch dưới đã giới thiệu một lỗ hổng XSS: nameitemscó thể chứa JavaScript.
Matthew

28

Bộ ria mép là logic-ít?

Đây không phải là:

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

Khá giống với cái này?

if x
  "foo"
else
  "bar"
end

điều đó chẳng phải khá giống với (đọc: gần như là một định nghĩa của) logic trình bày sao?


17
Có, nếu bạn chỉ đang đánh giá tính xác thực của một đối tượng, nhưng cố gắng làm bất cứ điều gì phức tạp hơn là không thể ( if x > 0 && x < 10) ... Vì vậy, mặc dù có thể sử dụng Mustache có hoặc không có logic, tùy thuộc vào bạn. Rốt cuộc, nó chỉ là một công cụ.
Tom Ashworth

5
Bạn đang nhìn điều này một cách sai lầm. Chỉ vì bạn có thể làm một số điều bằng một ngôn ngữ không đúng với mô hình chung của nó không có nghĩa là ngôn ngữ đó không thuộc mô hình đó. Bạn có thể viết mã mệnh lệnh bằng Java hoặc Haskell, nhưng bạn sẽ không nói rằng Java không phải là ngôn ngữ OO cũng như Haskell không phải là ngôn ngữ chức năng. Nhìn vào những gì ngôn ngữ cho phép bạn làm dễ dàng và những gì nó dẫn bạn đến để xem nó là loại ngôn ngữ nào.
cjs

@ CurtJ.Sampson, sự tương tự của bạn sẽ có ý nghĩa nếu Java tự bán mình là "ít chức năng" hoặc nếu Haskell tự bán mình là "ít hướng đối tượng". Câu trả lời này chứng tỏ rằng "logic-less" tốt nhất là một từ nhầm lẫn.
Corey

1
Tôi nghĩ bạn đồng ý với tôi rằng khi chúng ta gọi một ngôn ngữ là "chức năng", chúng ta có nghĩa là "có khuynh hướng hoạt động." Điểm bất đồng dường như là tôi định nghĩa "X-less" là "có xu hướng tránh xa X" trong khi bạn định nghĩa nó là "hoàn toàn không thể làm X."
cjs

13

Mẫu không logic là mẫu chứa các lỗ để bạn lấp đầy chứ không phải cách bạn lấp chúng. Logic được đặt ở nơi khác và được ánh xạ trực tiếp tới mẫu. Sự tách biệt các mối quan tâm này là lý tưởng vì khi đó mẫu có thể dễ dàng được xây dựng với các logic khác nhau, hoặc thậm chí với một ngôn ngữ lập trình khác.

Từ hướng dẫn sử dụng ria mép :

Chúng tôi gọi nó là "logic-less" vì không có câu lệnh if, mệnh đề else hoặc vòng lặp for. Thay vào đó chỉ có các thẻ. Một số thẻ được thay thế bằng một giá trị, một số không có gì và những thẻ khác là một chuỗi giá trị. Tài liệu này giải thích các loại thẻ Mustache khác nhau.


6
Mô tả hơi phức tạp, vì các phần hoạt động giống như các điều kiện và vòng lặp, chỉ là những điều kiện rất hạn chế. Khả năng tham chiếu đến các bảng được gọi trong hàm băm cũng cho phép bạn chuyển đổi các phần thành một ngôn ngữ lập trình thô sơ. Tuy nhiên, ít nhất thì nó cũng khiến bạn khó đi theo con đường đó, hơn là khuyến khích nó.
Tom Anderson

1
Chắc chắn, nhưng một hệ thống mẫu không có khối cho các điều kiện và sự lặp lại sẽ tương đối vô dụng. Bản thân mẫu không chỉ định khối dùng để làm gì hoặc xử lý như thế nào.
Jeremy

12

Mặt trái của vấn đề này là trong một nỗ lực tuyệt vọng để giữ logic nghiệp vụ ra khỏi bản trình bày, cuối cùng bạn đã đưa rất nhiều logic trình bày vào mô hình. Một ví dụ phổ biến có thể là bạn muốn đặt các lớp "lẻ" và "chẵn" trên các hàng xen kẽ trong bảng, điều này có thể được thực hiện bằng một toán tử mô-đun đơn giản trong mẫu dạng xem. Nhưng nếu mẫu chế độ xem của bạn không cho phép bạn làm điều đó, thì trong dữ liệu mô hình của bạn, bạn không chỉ phải lưu trữ hàng nào là hàng lẻ hoặc hàng chẵn, mà tùy thuộc vào mức độ giới hạn của công cụ mẫu của bạn, bạn thậm chí có thể phải làm ô nhiễm mô hình của mình với tên của các lớp CSS thực tế. Chế độ xem phải tách biệt với Mô hình, toàn bộ. Nhưng Mô hình cũng nên là Chế độ xem bất khả tri, và đó là điều mà nhiều công cụ tạo mẫu "không logic" này khiến bạn quên. Logic có ở cả hai nơi,thực sự để quyết định chính xác nơi nó đi. Đó là mối quan tâm về bản trình bày, hay mối quan tâm về kinh doanh / dữ liệu? Trong một nỗ lực để có tầm nhìn nguyên sơ 100%, ô nhiễm chỉ đổ bộ vào một nơi khác ít nhìn thấy hơn nhưng cũng không phù hợp.

Ngày càng có nhiều sự dịch chuyển trở lại theo hướng khác, và hy vọng mọi thứ sẽ tập trung ở đâu đó ở khu vực trung bình hợp lý hơn.


6
Gotta không đồng ý với bạn ở đó. Logic trình bày cho các mẫu ít logic không đi trong mô hình, nó đi trong khung nhìn, nơi nó thuộc về. Chế độ xem lấy dữ liệu mô hình thô và xoa bóp khi cần thiết (bằng cách chú thích các hàng chẵn / lẻ, v.v.) để chuẩn bị cho trình bày.
acjay

1
Tại sao các lượt xem không thể nhiều hơn các mẫu và bao gồm mã để tạo dữ liệu cho một mẫu?
LeeGee

1
acjohnson55 - Tôi đồng ý với bạn về nơi nó sẽ đến (xem), nhưng các mẫu không logic ngăn cản rất nhiều điều đó. @LeeGee - Tôi nghĩ rằng có một phản ứng dữ dội chống lại quá nhiều logic trong các lượt xem, nhưng mọi thứ đã đi quá xa theo hướng khác để ngăn chặn ngay cả logic của bản trình bày cụ thể trong các lượt xem.
mattmc3

4
Tôi biết mình đến muộn, nhưng CSS thứ n-item (lẻ) nên được sử dụng cho các màu hàng xen kẽ.
DanRedux

1
Thre không có gì sai khi có một đối tượng trình bày trung gian được tạo bởi chế độ xem từ các mô hình và bộ sưu tập hoặc bất kỳ dữ liệu nào khác. Theo cách này, các dạng xem tạo ra dữ liệu bản trình bày được hợp nhất với một mẫu để hiển thị dạng xem.
wprl

11

Nó làm cho các mẫu của bạn sạch hơn và nó buộc bạn phải giữ logic ở một nơi mà nó có thể được kiểm tra đơn vị đúng cách.


2
Bạn có thể giải thích nó với chi tiết hơn?
Morgan Cheng

29
Dành ba tháng để làm việc trên một hệ thống sử dụng ngôn ngữ tạo khuôn mẫu logic, như JSP, với các lập trình viên không sốt sắng trong việc phân tách logic và trình bày. Bạn sẽ thấy bạn xây dựng một hệ thống về cơ bản có lập trình trong trang - số học cho bố cục bảng, điều kiện để hiển thị thông tin giá cả, v.v. Ngôn ngữ Templating là ngôn ngữ lập trình cực kỳ kém, vì vậy điều này tạo nên một cơn ác mộng về phát triển và bảo trì. Một cái gì đó như ria mép không cho phép bạn rơi vào tình huống đó ngay từ đầu.
Tom Anderson

Nếu logic ở dạng một hàm, nó có thể được sử dụng bởi một hệ thống tạo khuôn mẫu vi mô hỗ trợ logic nhúng kiểm tra đơn vị. Ý tưởng tồi tệ nhất đối với tôi dường như là "trợ giúp" thanh điều khiển (xem spin.atomicobject.com/2011/07/14/… "Cách sử dụng nâng cao") - những điều này dường như không thể kiểm tra đơn vị do nằm trong tập lệnh / thẻ loại / văn bản chứ không phải là đồng bằng kịch bản cũ (/ loại / javascript) thẻ
Dexygen

8

Cuộc trò chuyện này giống như khi các nhà sư thời trung cổ tranh luận về việc có bao nhiêu thiên thần có thể lắp vào cuối một chiếc ghim. Nói cách khác, nó bắt đầu cảm thấy tôn giáo, vô ích và tập trung không chính xác.

Mini-rant xảy ra sau đó (vui lòng bỏ qua):

Nếu bạn không muốn tiếp tục đọc .. Câu trả lời ngắn gọn của tôi cho chủ đề trên là: Tôi không đồng ý với các mẫu không logic. Tôi nghĩ về nó như một hình thức lập trình của chủ nghĩa cực đoan. :-) :-)

Bây giờ lời rant của tôi tiếp tục trong xoay: :-)

Tôi nghĩ rằng khi bạn đưa nhiều ý tưởng đến mức cực đoan, kết quả sẽ trở nên lố bịch. Và đôi khi (tức là chủ đề này), vấn đề là chúng ta đưa ra ý tưởng "sai lầm" đến cùng cực.

Loại bỏ tất cả logic khỏi chế độ xem là "lố bịch" và là ý tưởng sai lầm.

Lùi lại một chút.

Câu hỏi chúng ta cần tự hỏi là tại sao lại loại bỏ logic? Khái niệm, rõ ràng là tách biệt các mối quan tâm . Giữ cho chế độ xem càng tách biệt với logic nghiệp vụ càng tốt. Tại sao làm điều này? Nó cho phép chúng tôi hoán đổi các chế độ xem (cho các nền tảng khác nhau: di động, trình duyệt, máy tính để bàn, v.v.) và nó cho phép chúng tôi dễ dàng hoán đổi luồng điều khiển, trình tự trang, thay đổi xác thực, thay đổi mô hình, truy cập bảo mật, v.v. Ngoài ra, khi logic bị xóa khỏi các chế độ xem (đặc biệt là các chế độ xem web), nó làm cho các chế độ xem dễ đọc hơn và do đó dễ bảo trì hơn. Tôi hiểu điều đó và đồng ý với điều đó.

Tuy nhiên, trọng tâm chính nên được tập trung vào việc tách rời các mối quan tâm. Không phải 100% chế độ xem ít logic. Logic trong các khung nhìn nên liên quan đến cách hiển thị "mô hình". Theo như tôi liên quan, logic trong các quan điểm là hoàn toàn ổn. Bạn có thể có view-logic không phải là business-logic.

Đúng vậy, trước đây khi chúng ta viết các trang JSP, PHP hoặc ASP với rất ít hoặc không có sự tách biệt giữa logic mã và logic xem, việc duy trì các ứng dụng web này là một cơn ác mộng tuyệt đối. Hãy tin tôi Tôi biết, tôi đã tạo ra và sau đó duy trì một số trong số những điều quái dị này. Chính trong giai đoạn bảo trì đó, tôi thực sự hiểu (về mặt nội hàm) lỗi trong cách làm của tôi và các đồng nghiệp. :-) :-)

Vì vậy, quyết định từ trên cao (các chuyên gia trong ngành) đã trở thành, bạn phải cấu trúc các ứng dụng web của mình bằng cách sử dụng thứ gì đó giống như bộ điều khiển chế độ xem trước (được gửi đến người xử lý hoặc hành động [chọn khung làm việc web của bạn]) và chế độ xem của bạn không được chứa mã . Các khung nhìn đã trở thành các mẫu ngu ngốc.

Vì vậy, nhìn chung tôi đồng ý với quan điểm trên, không phải vì các chi tiết cụ thể của các mục của sắc lệnh, mà là động lực đằng sau sắc lệnh - đó là mong muốn tách biệt mối quan tâm giữa quan điểm và logic kinh doanh.

Trong một dự án mà tôi đã tham gia, chúng tôi đã cố gắng tuân theo ý tưởng chế độ xem không logic đến mức cực kỳ lố bịch. Chúng tôi đã có một công cụ mẫu tự phát triển cho phép chúng tôi hiển thị các đối tượng mô hình trong html. Đó là một hệ thống dựa trên mã thông báo đơn giản. Nó thật khủng khiếp vì một lý do rất đơn giản. Đôi khi trong một khung nhìn, chúng tôi phải quyết định xem tôi có nên hiển thị đoạn mã HTML nhỏ này hay không .. Quyết định thường dựa trên một số giá trị trong mô hình. Khi bạn hoàn toàn không có logic trong khung nhìn, làm thế nào để bạn làm điều đó? Vâng, bạn không thể. Tôi đã có một số tranh luận chính với kiến ​​trúc sư của chúng tôi về điều này. Những người sử dụng HTML front-end viết quan điểm của chúng tôi đã hoàn toàn bị cản trở khi họ đối mặt với điều này và rất căng thẳng vì họ không thể đạt được các mục tiêu đơn giản khác của mình. Vì vậy, tôi đã giới thiệu khái niệm về câu lệnh IF đơn giản trong công cụ tạo mẫu của chúng tôi. Tôi không thể mô tả cho bạn sự nhẹ nhõm và bình tĩnh xảy ra sau đó. Vấn đề đã được giải quyết với một khái niệm IF-Statement đơn giản trong các mẫu của chúng tôi! Đột nhiên công cụ tạo khuôn mẫu của chúng tôi trở nên tốt.

Vậy làm thế nào mà chúng ta lại rơi vào tình huống căng thẳng ngớ ngẩn này? Chúng tôi tập trung vào mục tiêu sai. Chúng tôi đã tuân theo quy tắc, bạn không được có bất kỳ logic nào trong quan điểm của mình. Điều đó không đúng. Tôi nghĩ "quy tắc ngón tay cái" nên là, giảm thiểu số lượng logic đó trong quan điểm của bạn. Bởi vì nếu bạn không làm vậy, bạn có thể vô tình cho phép logic nghiệp vụ len lỏi vào chế độ xem - điều này vi phạm sự phân tách các mối quan tâm.

Tôi hiểu rằng khi bạn tuyên bố rằng "Bạn không được có logic trong các khung nhìn", bạn sẽ dễ dàng biết được khi nào bạn là một lập trình viên "giỏi". (Nếu đó là thước đo lòng tốt của bạn). Bây giờ, hãy thử triển khai một ứng dụng web có độ phức tạp thậm chí trung bình với quy tắc trên. Nó không dễ dàng thực hiện.

Đối với tôi, quy tắc logic trong các quan điểm không quá rõ ràng và thành thật mà nói, đó là nơi tôi muốn.

Khi tôi thấy nhiều logic trong các khung nhìn, tôi phát hiện ra mùi mã và cố gắng loại bỏ hầu hết logic khỏi các khung nhìn - tôi cố gắng đảm bảo logic nghiệp vụ tồn tại ở những nơi khác - tôi cố gắng tách các mối quan tâm ra. Nhưng khi tôi bắt đầu trò chuyện với những người nói rằng chúng ta phải loại bỏ tất cả logic khỏi chế độ xem, đối với tôi, đó chỉ là một đống sự cuồng tín như tôi biết bạn có thể rơi vào những tình huống như tôi đã mô tả ở trên.

Tôi đã hoàn thành lời nói của mình. :-)

Chúc mừng,

David


câu trả lời tuyệt vời, đó là tất cả về các phương pháp lập trình tốt .. và nhân tiện, việc sử dụng lại các mẫu không có logic trong máy chủ và máy khách không phải là KHÔ vì bạn sẽ phải lặp lại logic trong cả hai ..
mateusmaso

5

Đối số tốt nhất mà tôi đưa ra cho các mẫu không logic là bạn có thể sử dụng các mẫu giống hệt nhau trên cả máy khách và máy chủ. Tuy nhiên, bạn không thực sự cần vô logic, chỉ cần một cái có "ngôn ngữ" của riêng nó. Tôi đồng ý với những người phàn nàn rằng ria mép đang hạn chế một cách vô nghĩa. Cảm ơn, nhưng tôi là một cậu bé lớn và tôi có thể giữ sạch các mẫu của mình mà không cần sự giúp đỡ của bạn.

Một tùy chọn khác là chỉ cần tìm một cú pháp tạo mẫu sử dụng ngôn ngữ được hỗ trợ trên cả máy khách và máy chủ, cụ thể là javascript trên máy chủ bằng cách sử dụng node.js hoặc bạn có thể sử dụng trình thông dịch js và json thông qua một cái gì đó như therubyracer.

Sau đó, bạn có thể sử dụng một cái gì đó như haml.js, nó rõ ràng hơn nhiều so với bất kỳ ví dụ nào được cung cấp cho đến nay và hoạt động rất tốt.


Tôi hoàn toàn đồng ý. Sau khi một số đọc, tôi đã đi đến kết luận rằng khả năng mẫu trong JS trên cả client và server bên thỏa mãn nhu cầu của tôi tốt hơn so với một loạt các ngôn ngữ khuôn mẫu cụ thể
christofr

4

Trong một câu: Logic-less có nghĩa là bản thân công cụ mẫu ít phức tạp hơn và do đó có dấu chân nhỏ hơn và có ít cách để nó hoạt động không mong muốn.


3

Mặc dù câu hỏi đã cũ và đã được trả lời, tôi muốn thêm 2 ¢ của mình (nghe có vẻ giống như một lời khen ngợi, nhưng không phải vậy, đó là về những hạn chế và khi chúng trở nên không thể chấp nhận được).

Mục tiêu của mẫu là hiển thị một cái gì đó, không phải để thực hiện logic nghiệp vụ. Bây giờ có một ranh giới mỏng giữa việc không thể làm những gì bạn cần làm trong một mẫu và có "logic kinh doanh" trong chúng. Mặc dù tôi thực sự tích cực đối với Mustache và cố gắng sử dụng nó, nhưng cuối cùng tôi vẫn không thể làm những gì tôi cần trong những trường hợp khá đơn giản.

Việc "xoa bóp" dữ liệu (để sử dụng các từ trong câu trả lời được chấp nhận) có thể trở thành một vấn đề thực sự - ngay cả những đường dẫn đơn giản cũng không được hỗ trợ (điều mà Handlebars.js đề cập). Nếu tôi có dữ liệu chế độ xem và tôi cần phải điều chỉnh mỗi khi tôi muốn hiển thị thứ gì đó vì công cụ mẫu của tôi quá hạn chế, thì điều này cuối cùng không hữu ích. Và nó đánh bại một phần tính độc lập của nền tảng mà ria mép tự nhận; Tôi phải lặp lại logic xoa bóp khắp nơi.

Điều đó nói rằng, sau một số thất vọng và sau khi thử các công cụ mẫu khác, chúng tôi đã kết thúc việc tạo của riêng mình (... nhưng một ... khác ...), sử dụng cú pháp lấy cảm hứng từ các mẫu .NET Razor. Nó được phân tích cú pháp và biên dịch trên máy chủ và tạo ra một hàm JS đơn giản, khép kín (thực sự là mô-đun RequestJS) có thể được gọi để "thực thi" mẫu, kết quả là trả về một chuỗi. Mẫu được đưa ra bởi brad sẽ trông như thế này khi sử dụng công cụ của chúng tôi (cá nhân tôi thấy nó vượt trội hơn nhiều so với cả Mustache và Underscore):

@name:
<ul>
@for (items) {
  <li>@.</li>
}
</ul>

Một hạn chế không có logic khác xảy ra với chúng tôi khi gọi thành phần bằng Mustache. Trong khi các phần tử được hỗ trợ bởi Mustache, không có khả năng tùy chỉnh dữ liệu được chuyển vào trước. Vì vậy, thay vì có thể tạo một mẫu mô-đun và sử dụng lại các khối nhỏ, tôi sẽ kết thúc việc tạo các mẫu với mã lặp lại trong chúng.

Chúng tôi đã giải quyết điều đó bằng cách triển khai một ngôn ngữ truy vấn lấy cảm hứng từ XPath, mà chúng tôi gọi là JPath. Về cơ bản, thay vì sử dụng / để truyền đến trẻ em, chúng tôi sử dụng dấu chấm và không chỉ chuỗi, số và các ký tự boolean được hỗ trợ mà còn hỗ trợ các đối tượng và mảng (giống như JSON). Ngôn ngữ này không có tác dụng phụ (điều bắt buộc để tạo khuôn mẫu) nhưng cho phép "xoa bóp" dữ liệu khi cần thiết bằng cách tạo các đối tượng theo nghĩa đen mới.

Giả sử chúng tôi muốn hiển thị một bảng "lưới dữ liệu" với các tiêu đề có thể tùy chỉnh và liên kết đến các hành động trên các hàng và sau đó thêm động các hàng bằng jQuery. Do đó, các hàng cần phải ở một phần nếu tôi không muốn sao chép mã. Và đó là nơi mà rắc rối bắt đầu nếu một số thông tin bổ sung như cột nào sẽ được hiển thị là một phần của mô hình chế độ xem và chỉ giống nhau đối với các hành động đó trên mỗi hàng. Dưới đây là một số mã làm việc thực tế bằng cách sử dụng mẫu và công cụ truy vấn của chúng tôi:

Mẫu bảng:

<table>
    <thead>
        <tr>
            @for (columns) {
                <th>@title</th>
            }
            @if (actions) {
                <th>Actions</th>
            }
        </tr>
    </thead>
    <tbody>
        @for (rows) {
            @partial Row({ row: ., actions: $.actions, columns: $.columns })
        }
    </tbody>
</table>

Mẫu hàng:

<tr id="@(row.id)">
    @for (var $col in columns) {
        <td>@row.*[name()=$col.property]</td>
    }
    @if (actions) {     
        <td>
        @for (actions) {
            <button class="btn @(id)" value="@(id)">@(name)...</button>
        }
        </td>
    }
</tr>

Lời mời từ mã JS:

var html = table({
    columns: [
        { title: "Username", property: "username" },
        { title: "E-Mail", property: "email" }
    ],
    actions: [
        { id: "delete", name: "Delete" }
    ],
    rows: GetAjaxRows()
})

Nó không có bất kỳ logic nghiệp vụ nào trong đó, nhưng nó có thể tái sử dụng và định cấu hình, và nó cũng không có tác dụng phụ.


13
Tôi thực sự không thấy điểm của câu trả lời này, nó không trả lời câu hỏi nào cả. Bạn nói rằng có những hạn chế mà không thực sự mô tả chúng là gì hoặc chúng xảy ra như thế nào. Cuối cùng, bạn bắt đầu một cuộc thảo luận về hệ thống của riêng bạn mà không có ai khác, trong thực tế, nó có thể rất tệ và có thể kết thúc vào một ngày nào đó trên thedailywtf nhưng chúng tôi không bao giờ biết được. Mở mã nguồn nó, liên kết đến nó và để chúng tôi quyết định!
mattmanser

1
@mattmanser, tôi viết về những hạn chế dẫn đến việc không sử dụng Mustache (và Handlebars): thiếu hỗ trợ cho đường dẫn, vị từ, biến, chuyển đổi dữ liệu để gọi các phần tử. Đó là tất cả những điều quan trọng đối với chúng tôi. Chúng tôi có thể sẽ tạo mã nguồn mở vào một ngày nào đó, nhưng vì đây là giải pháp phía máy chủ (hoặc thời gian biên dịch nếu bạn muốn) biên dịch các mẫu thành mã JS nên nó sẽ không có lượng đối tượng lớn như Mustache. Nếu bạn muốn liên hệ, vui lòng liên hệ với tôi - Tôi cũng là tác giả của mã bsn GoldParser trên Google (nơi bạn có thể dễ dàng tìm thấy email của tôi trong tệp readme).
Lucero

Tôi thích ý tưởng về động cơ giống như dao cạo của bạn ... nó có phải là mã nguồn mở không?
Cracker

@Cracker, không, chưa (chưa) - "vấn đề" với nó là hiện tại các mẫu được biên dịch thành mã JS trên máy chủ chạy ASP.NET MVC và do đó đối tượng mục tiêu không lớn như các công cụ tạo khuôn mẫu khác . Ngoài ra, nó là một phần của thư viện lớn hơn mà trước tiên chúng ta phải tách ra để mở tìm nguồn cung ứng.
Lucero

1
@Esailija Nó cho phép chỉ định động các tên thuộc tính được lấy từ rowđối tượng, thay vì sử dụng tên tĩnh. Ví dụ: nếu $col.property == 'Something'thì điều này sẽ mang lại nội dung của row.Something.
Lucero

2

Dưới đây là 3 cách hiển thị danh sách, với số lượng ký tự. Tất cả trừ cái đầu tiên và ngắn nhất đều bằng ngôn ngữ tạo mẫu ít logic ..

CoffeeScript (với Reactive Coffee builder DSL) - 37 ký tự

"#{name}"
ul items.map (i) ->
  li i

Knockout - 100 ký tự

<span data-bind="value: name"/>
<ul data-bind="foreach: items">
   <li data-bind="value: i"/>
</ul>

Ghi đông / ria mép - 66 ký tự

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

Dấu gạch dưới - 87 ký tự

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

Lời hứa của các mẫu không logic là, tôi cho rằng những người có bộ kỹ năng rộng hơn sẽ có thể quản lý các mẫu ít logic hơn mà không cần tự bắn vào chân mình. Tuy nhiên, những gì bạn thấy trong các ví dụ trên là khi bạn thêm ngôn ngữ logic tối giản vào đánh dấu dựa trên chuỗi, kết quả sẽ phức tạp hơn, không phải ít hơn. Ngoài ra, bạn trông giống như bạn đang làm PHP cũ.

Rõ ràng là tôi không phản đối việc giữ "logic nghiệp vụ" (tính toán mở rộng) ra khỏi các khuôn mẫu. Nhưng tôi nghĩ rằng bằng cách cung cấp cho họ một ngôn ngữ giả cho logic hiển thị thay vì ngôn ngữ hạng nhất, cái giá phải trả. Không chỉ nhiều hơn để nhập, mà một số người cần phải đọc nó với sự kết hợp ghê gớm của việc chuyển đổi ngữ cảnh.

Tóm lại, tôi không nhìn thấy logic của các mẫu không logic, vì vậy tôi muốn nói rằng lợi thế của chúng là không đối với tôi, nhưng tôi tôn trọng rằng nhiều người trong cộng đồng nhìn nhận nó theo cách khác :)


@brad, bạn nghĩ gì về sự so sánh này?
Dean Radcliffe,

2

Những ưu điểm chính của việc sử dụng các mẫu không logic là:

  • Thực thi nghiêm ngặt việc phân tách chế độ xem mô hình , hãy xem bài báo này để biết chi tiết (rất khuyến khích)
  • Rất dễ hiểu và dễ sử dụng , vì không cần logic lập trình (và kiến ​​thức!) Và cú pháp là tối thiểu
  • (cụ thể là Mustache) có tính di động cao và độc lập với ngôn ngữ, có thể được sử dụng mà không cần sửa đổi trong hầu hết các môi trường lập trình

câu trả lời ngắn gọn tuyệt vời!
MrWatson

1

Tôi đồng ý với Brad: văn underscorephong dễ hiểu hơn. Nhưng tôi phải thừa nhận rằng đường cú pháp có thể không làm hài lòng tất cả mọi người. Nếu _.eachhơi khó hiểu, bạn có thể sử dụng forvòng lặp truyền thống .

  <% for(var i = 0; i < items.length; i++) { %>
    <%= items[i] %>
  <% } %>

Sẽ luôn tốt nếu bạn có thể dự phòng cho các cấu trúc tiêu chuẩn như forhoặc if. Chỉ sử dụng <% if() %>hoặc <% for() %>trong khi Mustachesử dụng phần nào thuyết tân học cho if-then-else(và khó hiểu nếu bạn không đọc tài liệu):

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

Công cụ mẫu rất tuyệt khi bạn có thể đạt được các mẫu lồng nhau một cách dễ dàng ( underscorephong cách):

<script id="items-tmpl" type="text/template">
    <ul>
        <% for(var i = 0; i < obj.items.length; i++) { %>
            <%= innerTmpl(obj.items[i]) %>
        <% } %>
    </ul>
</script>

<script id="item-tmpl" type="text/template">
    <li>
        <%= name %>
    </li>
</script>

var tmplFn = function(outerTmpl, innerTmpl) {
    return function(obj) {
        return outerTmpl({obj: obj, innerTmpl: innerTmpl});
    };
};

var tmpl = tmplFn($('#items-tmpl').html(), $('#item-tmpl').html());
var context = { items: [{name:'A',{name:'B'}}] };
tmpl(context);

Về cơ bản, bạn chuyển tmpl bên trong của mình như một thuộc tính của ngữ cảnh. Và gọi nó cho phù hợp. Ngọt :)

Nhân tiện, nếu thứ duy nhất bạn quan tâm là công cụ mẫu, hãy sử dụng triển khai mẫu độc lập. Nó chỉ có 900 ký tự khi được thu nhỏ (4 dòng dài):

https://gist.github.com/marlun78/2701678

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.