2008-09-03 34 views
19

Tôi nghe nhiều hơn và nhiều hơn nữa về ngôn ngữ cụ thể của miền bị ném về và cách chúng thay đổi cách bạn xử lý logic nghiệp vụ và tôi đã thấy Ayende's blog posts và mọi thứ, nhưng tôi chưa bao giờ thực sự hiểu chính xác lý do logic cách xa các phương pháp và tình huống tôi đang sử dụng trong nhà cung cấp của mình.DSL là gì và tôi nên sử dụng nó ở đâu?

Nếu bạn đã có một số nền tảng sử dụng những điều này, bất kỳ cơ hội bạn có thể đặt nó trong điều kiện laymans thực:

  • Chính xác những gì xây dựng DSL phương tiện?
  • Bạn đang sử dụng ngôn ngữ nào?
  • Trường hợp sử dụng DSL có ý nghĩa gì?
  • Lợi ích của việc sử dụng DSL là gì?

Trả lời

17

DSL là tốt trong các tình huống mà bạn cần phải cung cấp cho một số khía cạnh của sự kiểm soát của hệ thống đối với người khác. Tôi đã sử dụng chúng trong Quy tắc Công cụ, nơi bạn tạo một ngôn ngữ đơn giản, dễ dàng hơn cho những người ít kỹ thuật sử dụng để thể hiện bản thân, đặc biệt là trong quy trình công việc.

Nói cách khác, thay vì làm cho chúng học java:

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO(); 
for (int id : documentIDS) { 
Document myDoc = MyDocumentDAO.loadDoc(id); 
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) { 
    ReminderService.sendUnreadReminder(myDoc) 
} 

tôi có thể viết một DSL cho phép tôi nói:

for (document : documents) { 
if (document is unread) { 
document.sendReminder 
} 

Có những tình huống khác, nhưng về cơ bản, bất cứ nơi nào có lẽ bạn muốn sử dụng một ngôn ngữ macro, kịch bản một luồng công việc, hoặc cho phép tùy biến sau thị trường - đây là tất cả các ứng cử viên cho DSL.

+0

Nhưng bạn có thực sự có những người không kỹ thuật làm điều đó không? – BobbyShaftoe

+0

có lẽ tốt hơn để mô tả chúng theo cách khác nhau-kỹ thuật; họ là những người chiến thắng cá nhân, chứ không phải lập trình viên java. –

+1

hy vọng bạn biết rằng DSL của bạn là python. –

6

DSL là viết tắt của miền cụ thể ngôn ngữ ví dụ ngôn ngữ thiết kế đặc biệt để giải quyết các vấn đề trong khu vực nhất định.
Ví dụ: Đánh dấu (ngôn ngữ đánh dấu được sử dụng để chỉnh sửa bài đăng trên SO) có thể được coi là DSL.

Cá nhân tôi tìm một nơi dành cho DSL gần như trong mọi dự án lớn mà tôi đang làm việc. Thông thường, tôi cần một số ngôn ngữ truy vấn giống SQL. Một cách sử dụng phổ biến khác là các hệ thống dựa trên quy tắc, bạn cần một số loại ngôn ngữ để chỉ định các quy tắc \ điều kiện.

DSL có ý nghĩa trong bối cảnh khó mô tả \ giải quyết vấn đề bằng các phương tiện truyền thống.

0

DSL về cơ bản là tạo ngôn ngữ phụ nhỏ của riêng bạn để giải quyết vấn đề miền cụ thể. Điều này được giải quyết bằng cách sử dụng phương pháp chuỗi. Ngôn ngữ mà dấu chấm và dấu ngoặc đơn là tùy chọn giúp làm cho các biểu thức này có vẻ tự nhiên hơn. Nó cũng có thể tương tự như một mẫu xây dựng. DSL không phải là ngôn ngữ, mà là một mẫu mà bạn áp dụng cho API của mình để làm cho các cuộc gọi trở nên tự giải thích hơn.

Một ví dụ là Guice, Guice Users Guide http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 có một số mô tả sâu hơn về cách giao diện bị ràng buộc để triển khai và trong ngữ cảnh nào.

Một ví dụ phổ biến khác là dành cho ngôn ngữ truy vấn. Ví dụ:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted") 

Trong quá trình triển khai, hãy tưởng tượng mỗi phương thức trả về đối tượng Truy vấn mới hoặc chỉ cập nhật nội dung này trong nội bộ. Tại bất kỳ thời điểm nào, bạn có thể chấm dứt chuỗi bằng cách sử dụng các hàng ví dụ() để nhận tất cả các hàng hoặc updateSomeField như tôi đã làm ở trên đây. Cả hai sẽ trả về một đối tượng kết quả.

Tôi cũng khuyên bạn nên xem ví dụ Guice ở trên, vì mỗi cuộc gọi đều trả về một loại mới với các tùy chọn mới trên chúng. Một IDE tốt sẽ cho phép bạn hoàn thành, làm cho nó rõ ràng tùy chọn mà bạn có tại mỗi điểm.

Chỉnh sửa: dường như nhiều người coi DSL là ngôn ngữ mới, đơn giản, có mục đích đơn lẻ với trình phân tích cú pháp của riêng họ. Tôi luôn luôn kết hợp DSL như sử dụng phương pháp chuỗi như một quy ước để thể hiện hoạt động.

1

DSL chỉ là một tên ưa thích và có thể có nghĩa là những thứ khác nhau:

  • Rails (điều Ruby) đôi khi được gọi là DSL vì nó bổ sung thêm các phương pháp đặc biệt (và ghi đè một số những người được xây dựng trong quá) cho nói về ứng dụng web

  • ANT, cú pháp Makefile vv cũng là DSL, nhưng có cú pháp riêng. Đây là những gì tôi sẽ gọi một DSL.

Một khía cạnh quan trọng của sự cường điệu này: Bạn nên suy nghĩ về ứng dụng của mình bằng ngôn ngữ. Bạn muốn nói gì trong ứng dụng của mình? Sau đó, các lớp học và phương pháp này sẽ là các lớp và phương pháp của bạn:

  1. Xác định "ngôn ngữ" (hoặc cú pháp thực như được đề xuất bởi trang này hoặc phân cấp lớp cho ngôn ngữ yêu thích của bạn) có khả năng thể hiện sự cố của bạn.
  2. Giải quyết vấn đề của bạn bằng ngôn ngữ đó.
4

Nếu bạn sử dụng Microsoft Visual Studio, bạn đã sử dụng nhiều DSL - bề mặt thiết kế cho biểu mẫu web, biểu mẫu thắng, vv là DSL. Trình thiết kế lớp là một ví dụ khác.

DSL chỉ là một tập hợp các công cụ (ít nhất theo lý thuyết) giúp phát triển trong một "miền" cụ thể (tức là bố cục hình ảnh) dễ dàng hơn, trực quan hơn và hiệu quả hơn. Theo như việc xây dựng một DSL, một số thứ mà Ayende đã viết có liên quan đến các phân tích cú pháp "văn bản", cho phép các nhà phát triển (hoặc người dùng cuối) nhập "văn bản tự nhiên" vào một ứng dụng, phân tích văn bản và tạo ra một số loại mã hoặc đầu ra dựa trên nó.

Bạn có thể sử dụng bất kỳ ngôn ngữ nào để tạo DSL của riêng bạn. Microsoft Visual Studio có nhiều điểm mở rộng và các mẫu & thực hành "Guidance Automation Toolkit"Visual Studio SDK có thể hỗ trợ bạn trong việc thêm chức năng DSL vào Visual Studio.

2

DSL là trình biên dịch cơ bản cho các ngôn ngữ tùy chỉnh. Một công cụ 'miễn phí và mở' tốt để phát triển chúng có sẵn tại ANTLR. Gần đây, tôi đã nhìn vào DSL này cho một sử dụng state machine language trên một dự án mới. Tôi đồng ý với Tim Howland ở trên, rằng họ có thể là một cách hay để cho phép người khác tùy chỉnh ứng dụng của bạn.

2

FYI, một cuốn sách về DSL là trong đường ống dẫn như là một phần của loạt chữ ký của Martin Fowler.

Nếu nó có cùng tiêu chuẩn như các sách khác trong chuỗi, nó phải là một tài liệu đọc tốt.

Thông tin khác here

Các vấn đề liên quan