Groovy - DSLS

Groovy cho phép người ta bỏ qua các dấu ngoặc đơn xung quanh các đối số của một lệnh gọi phương thức cho các câu lệnh cấp cao nhất. Đây được gọi là tính năng "chuỗi lệnh". Tiện ích mở rộng này hoạt động bằng cách cho phép một chuỗi các lệnh gọi phương thức không có dấu ngoặc đơn như vậy, không yêu cầu dấu ngoặc đơn xung quanh các đối số hoặc dấu chấm giữa các lệnh gọi chuỗi.

Nếu một cuộc gọi được thực hiện như a b c d, điều này thực sự sẽ tương đương với a(b).c(d).

Ngôn ngữ cụ thể của DSL hoặc Tên miền nhằm đơn giản hóa mã được viết bằng Groovy theo cách dễ hiểu đối với người dùng phổ thông. Ví dụ sau đây cho thấy chính xác ý nghĩa của việc có một ngôn ngữ cụ thể cho miền.

def lst = [1,2,3,4] 
print lst

Đoạn mã trên hiển thị danh sách các số được in ra bảng điều khiển bằng cách sử dụng câu lệnh println. Trong một ngôn ngữ cụ thể của miền, các lệnh sẽ như sau:

Given the numbers 1,2,3,4
 
Display all the numbers

Vì vậy, ví dụ trên cho thấy sự chuyển đổi của ngôn ngữ lập trình để đáp ứng nhu cầu của một ngôn ngữ miền cụ thể.

Hãy xem một ví dụ đơn giản về cách chúng ta có thể triển khai DSL trong Groovy -

class EmailDsl {  
   String toText 
   String fromText 
   String body 
	
   /** 
   * This method accepts a closure which is essentially the DSL. Delegate the 
   * closure methods to 
   * the DSL class so the calls can be processed 
   */ 
   
   def static make(closure) { 
      EmailDsl emailDsl = new EmailDsl() 
      // any method called in closure will be delegated to the EmailDsl class 
      closure.delegate = emailDsl
      closure() 
   }
   
   /** 
   * Store the parameter as a variable and use it later to output a memo 
   */ 
	
   def to(String toText) { 
      this.toText = toText 
   }
   
   def from(String fromText) { 
      this.fromText = fromText 
   }
   
   def body(String bodyText) { 
      this.body = bodyText 
   } 
}

EmailDsl.make { 
   to "Nirav Assar" 
   from "Barack Obama" 
   body "How are things? We are doing well. Take care" 
}

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau:

How are things? We are doing well. Take care

Cần lưu ý những điều sau về việc triển khai mã trên:

  • Một phương thức tĩnh được sử dụng để chấp nhận một bao đóng. Đây chủ yếu là một cách không phức tạp để triển khai DSL.

  • Trong ví dụ email, lớp EmailDsl có một phương thức make. Nó tạo ra một thể hiện và ủy quyền tất cả các lệnh gọi trong bao đóng cho thể hiện. Đây là cơ chế mà phần "tới" và "từ" kết thúc thực thi các phương thức bên trong lớp EmailDsl.

  • Khi phương thức to () được gọi, chúng tôi lưu trữ văn bản trong phiên bản để định dạng sau này.

  • Bây giờ chúng ta có thể gọi phương thức EmailDSL bằng một ngôn ngữ dễ hiểu, dễ hiểu cho người dùng cuối.