RSS

Chương 2: Tạo và sử dụng một DSL

06 Jun

Giới thiệu

Mục đích của chương này là bàn đến tất cả những khía cạnh chính của việc định nghĩa 1 domain-specific langugue (DSL) với Microsoft DSL Tools.

To mt DSL Solution trong Visual Studio

New Project ->Nếu có cài Visual Studio SDK, trong phn Extensibility -> Domain-Specific Language Designer.

Các template bao gồm:

  • Minimal Languages: Chỉ đủ thể hiện một loại box và một loại line.
  • Components Models: Các box với các port
  • Classes Diagrams: Tương tự như lược đồ lớp UML (UML class diagram).
  • Task Flows: Tương tự như lược đồ hoạt động UML (UML activity diagram).

Tiếp theo, đặt tên cho ngôn ngữ và namespace của source code cho designer (trình thiết kế) và generation tools (các công cụ phát sinh), ta cũng đặt tên cho phần mở rộng tên file mà sẽ được sử dụng để chứa các model (mô hình)

Gần như tất cả code từ các file khác từ 2 project được phát sinh từ việc định nghĩa DSL. Khi ta muốn thay đổi từ các template DSL sang DSL của ta, thì ta sẽ làm việc trên DSL definition.

Code trong 2 project bao gồm 3 phần chính:

1. Trình thiết kế (Designer) (hay ngôn ngữ mà ta đang định nghĩa) – Trình soạn thảo mà DSL user sẽ vẽ các model

2. Trình phát sinh mã (Code generators) – sẽ nhận lấy các model (mô hình) và text template

3. Trình xuất bản (Serializer) – được thiết kế để lưu các model và trong các file có phần mở rộng mà ta đặt tên lúc đầu và tải chúng lên một lần nữa. Trình Serializer được sử dụng trong trình designer và trong trình code generator, và có thể được sử dụng trong bất cứ ứng dụng tách biệt nào mà tác giả DSL chọn để viết

Tác giả DSL có thể thay đổi các chức năng này bằng cách viết thêm code (C#) ( thường thì ít thôi). Ví dụ, để thêm menu command hay validation constrainst (ràng buộc xác định hợp lệ) vào editor, hay thay đổi cách mà các models được serialize (xuất bản) xuống file( chương 6) hay cách mà text template được thông dịch và mã được phát sinh.

Có gì trong DSL solution?

Hai project được tạo lúc ban đầu bởi DSL creation wizard là Dsl và DslPackage.

Project Dsl cung cấp:

  • Mốt serializer/deserializer (bộ xuất bản/hủy xuất bản) để đọc và ghi các thể hiện DSL của bạn xuống file.
  • Những định nghĩa lớp (class) để xử lý DSL và các lược đồ của nó trong một ứng dụng.
  • Một bộ xử lý chi dẫn(chỉ huy – directive processor) cho phép bạn có thể viết các text template mà sẽ xử lý DSL của bạn.
  • Các thành phần thiết yếu của trình thiết kế mà sẽ biên tập (edit) DSL này trong Visual Studio.

Project DslPackage cung cấp code cho phép DSL được biên tập (edit) trong Visual Studio. (Có thể viết một ứng dụng stand-alone (đứng một mình – riêng rẽ) mà xử lý DSL chỉ sử dụng assembly được tạo bởi project Dsl ). Những file này thì tương tự nhau như trong các gói (pagkage) Visual Studio SDK khác.

  • Tài liệu (document) xử lý code nhận biết được phần mở rộng file của DSL và mở trình thiết kế thích hợp.
  • Các menu lệnh (menu command) kết hợp với trình thiết kế DSL.
  • Các file item template từ đó các thể hiện mới của DSL có thể được tạo ra.

Trong mỗi project, có một thư mục có tên là GeneratedCode. Thư mục này chứa các file text template (phần mở rộng là .tt), mỗi file có một file được phát sinh (generated file) như là phần phụ trợ của nó. Trong solution explorer, click vào dấu [+] để thấy generated file. Hầu hết các file text template có nhiều tham chiếu đến các include file (các file này được chứa trong thư mục cài đặt DSL Tool có tên là “TextTemplate”)

Tất cả các generated file đều được xuất phát từ Dsl\DslDefinition.dsl. Bạn không nên thay đổi chúng (generated file), nhưng bạn có thể tùy biến generated code (mã được phát sinh) bằng cách thêm một phần các định nghĩa lớp trong các file riêng biệt. (chương 10 để biết các “tiện nghi” để tùy biến)

Chạy th mt DSL Solution

Để chạy được solution ta nhấn F5 (sẽ build solution và chạy trong chế độ debugging), việc tương đương với menu lệnh “Debugà Start Debgging”. Chúng ta sẽ xem DSL trong 1 trình thiết kế (trình biên tập đồ họa) chạy chung với Visual Studio. Khi nhấn F5 sẽ xuất hiện 1 thể hiện khác của Visual Studio, được khởi tạo để thể hiện 1 ví dụ của DSL.

Thể hiện mới của Visual Studio sẽ mở một project mẫu tên là Debugging, ta mở file mô hình là có tên là Sample.* (ví dụ Sample.iss)

  • Cửa sổ lớn nhất là màn hình thiêt kế, phần trình bày chính của 1 thể hiện DSL. Ta phải biên tập lại việc định nghĩa DSL (trong thể hiện Visual Studio chính) để có thể thêm các định nghĩa của các thành phần. Khi toàn bộ DSL làm việc và được triển khai, người sử dụng DSL sẽ vẽ các lược đồ của họ ở đây.
  • Bên trái là toolbox. Để thêm một phần tử mới, ta drag từ toolbox và kéo vào diagram (lược đồ); Để tạo 1 mối kết nối mới (connector) mới, ta click vào công cụ liên quan, click trên phần tử source, sau đó là phần tử đích trên lược đồ. Ta phải biên tập DSL definition để mà có thể thay đổi tên của công cụ và add thêm tool.
  • Bên phải là model explorer. Nó hiện thị model dưới dạng cây. Nó hiện thị các phần tử (element) và các mối quan hệ nhúng của chúng. Trong một vài DSL, có nhiều phần tử không xuất hiện trong màn hình thiết kế chính nhưng sẽ luôn xuất hiện trong model explorer.
  • Solution explorer hiện thị project Debugging chứa file mẫu. Ta có thể đổi tên project. Khi nó được triển khai, các bản sao của project này sẽ chạy cùng với mã của ứng dụng mà ta viết cho. Thêm các text template file mà sẽ đọc các thể hiện DSL của người sử dụng và tạo ra code.
  • Bên dưới là properties window dùng để thay đổi các thuộc tính của các phần tử được chọn

Đnh nghĩa mt DSL

Để định nghĩa DSL ta mở file DslDefinition.dsl trong project Dsl, sẽ mở ra trình thiết kế DSL. Trình thiết kế trong giống như trình thiết kế của Minimal language hay bất kỳ DSL cụ thể khác.

Cửa sổ chính gồm 2 swimlane hay cột: bên tay trái, là domain model là các domain class và relationship, bên tay phải là các shape và các connector mà thể hiện chúng lên màn hình. Ta có thể thêm mới các phần tử bằng cách sử dụng các công cụ trong toolbox. Trình thiết kế duy trì mốt sự trình bày dạng cây các phần tử và các mối quan hệ của chúng. Click phải lên domain class, sẽ tìm được lệnh sắp xếp lại cây.

Ta edit tên của domain class, shape, connector, diagram, role name (nhãn trên 2 cánh tay của mỗi relationship), và tên của relationship. Tất cả có thê edit trực tiếp trên diagram, ngoại trừ role name.

Để đổi tên của các công cụ sẽ xuất hiện trong toolbox. Những tên này không hiện thị trong main diagram của việc định nghĩa DSL – thay vào đó nhìn vào DSL explorer; sự định nghĩa các tool có thể được tìm thấy trong node Editor. Tên của chúng có thể được edit trong properties window cùng với các tooltip và tiêu đề mà sẽ hiện thị cho người sử dụng.

Phát sinh Code (mã) cho Designer (trình thiết kế)

Code (mã) cho trình thiết kế của DSL được phát sinh từ file định nghĩa DSL. Để thực hiện, vào solution explorer( trong Visual Studio chính) click vào nút “Transform All Templates”. Tất cả các file mã sẽ được phát sinh.

Thư mục “GeneratedCode” chứa các file text template với phần mở rộng là .tt. Mỗi file có có một file phụ trợ đó là kết quả được phát sinh. Click dấu [+] để xem. Các file được phát sinh bao gồm cả C# và resource file. Đừng thay đổi các file được phát sinh (generated file)

Nhấn F5 để qua experimental Visual Studio (Debugging project). Thêm file mới vào project Debugging (menu lệnh “Add new item”), thêm vào nó các phần tử và mối quan hệ.

Vic thêm vào trong DSL

Để thêm một phần tử *Element, nếu ta thấy nó nên được dẫn xuất từ lớp cơ sở trừu tượng chung. Thêm vào một vài domain class và 1 shape, định nghĩa lại shape map, và thiết đặt thuộc tính Inheritance của base class thành abstract (trong properties window), kết thúc việc định nghĩa DSL.

Để tạo một *Shape, sử dụng một hình học và set thuộc tính “geometry” thành : Circle, Retangle…. Ta cũng có thể thay đỏi các thuộc tính kích thước và màu sắc mặc định của các shape và connector khác. Một tool mới được yêu cầu cho shape mình mới tạo ra có thể được thêm vào trong node Editor trong cửa sổ DSL explorer. Nếu lưu tại thời điểm này sẽ bị lỗi vì chưa định nghĩa icon cho tool mới. Trong solution, vào thư mục Resource trong project Dsl và copy một trong những file hình ở đó và đổi tên  thành *ElementTool.bmp.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: