2009-03-19 40 views
6

Hiện tại dự án tôi đang làm việc không có mô hình hoàn toàn cố định (do ảnh hưởng bên ngoài) và do đó tôi muốn có sự linh hoạt trong việc viết chúng. Hiện tại chúng được nhân rộng trên ba lớp khác nhau của ứng dụng (db, api và ứng dụng khách) và mỗi lớp có logic tương tự trong đó (ví dụ: xác thực).Sử dụng DSL để tạo mã C#

Tôi đã tự hỏi liệu có cách tiếp cận nào có thể cho phép tôi viết một tệp mô hình (nói bằng ruby) và sau đó chuyển đổi mô hình đó thành các tệp C# cần thiết. Hiện tại có vẻ như tôi chỉ viết rất nhiều mã soạn sẵn có thể thay đổi ở bất kỳ giai đoạn nào, trong khi cách tiếp cận được tạo ra này sẽ cho phép tôi tập trung vào những thứ quan trọng hơn nhiều.

Có ai có đề xuất về điều gì đó như thế này không, tôi có thể thực hiện điều này bằng ngôn ngữ dsl/và bất kỳ ai có kinh nghiệm về điều gì đó như thế này?

Trả lời

5

Điều này có thể dễ dàng thực hiện với ANTLR. Nếu đầu ra tương tự đủ, bạn có thể chỉ cần sử dụng cơ chế tạo khuôn mẫu văn bản - nếu không nó có thể tạo ra một cây cú pháp trừu tượng để bạn duyệt qua.

5

Tôi đã thấy một hệ thống sử dụng các lớp một phần và một phần phương pháp để cho phép tái tạo mã mà không ảnh hưởng đến mã tùy chỉnh. "Công cụ quy tắc" nếu bạn sẽ được tạo ra hoàn toàn từ sơ đồ trạng thái Visio. Đây là cơ bản mans công việc người nghèo nhưng rất dễ dàng để sửa đổi. Sơ đồ Viso được xuất ra XML được đọc bằng cách sử dụng PowerShell và T4 để tạo ra các lớp.

Ví dụ trên là của một DSL bên ngoài. I E. bên ngoài ngôn ngữ lập trình mà ứng dụng chạy. Bạn có thể tạo một DSL nội bộ được triển khai và sử dụng trong ngôn ngữ lập trình.

Điều này và trước đó article on DSLSs từ Mã-Tạp chí khá tốt.

Trong liên kết trên, Neal Ford cho bạn thấy cách tạo DSL nội bộ trong C# bằng giao diện thông thạo.

Một điều mà anh chưa đề cập đến là bạn có thể đặt thuộc tính này [EditorBrowsable (EditorBrowsableState.Never)] trên các phương thức của bạn để chúng không xuất hiện để intellisense. Điều này có nghĩa là bạn có thể ẩn các phương thức không phải DSL (nếu bạn muốn) trên lớp từ người dùng DSL làm cho API thông thạo dễ khám phá hơn nhiều.

Bạn có thể thấy một giao diện thông thạo được viết trực tiếp trong loạt video này bởi Daniel Cazzulino trên viết một container IoC với TDD

Về đối tượng của DSL bên ngoài bạn cũng có tùy chọn Oslo (CTP at the moment) đó là khá mạnh mẽ trong khả năng của nó để cho phép bạn tạo các DSL bên ngoài có thể được thực hiện trực tiếp thay vì cho việc sử dụng tạo mã mà nghĩ đến nó không thực sự là một DSL.

+1

Rất nhiều trình biên dịch toàn diện thực sự là trình tạo mã. Trình biên dịch C++ gốc, tiền mặt, tạo mã C thẳng, và Eiffel và Haskell cũng biên dịch thành C trước khi chuyển sang nhị phân. –

+0

Tất cả các trình biên dịch là các trình tạo mã, chúng chỉ có thể không tạo ra mã thân thiện với con người. Ngay cả các hướng dẫn về mã máy thường chỉ là các chỉ dẫn mức cao hơn được giải thích bởi vi mã nhúng trong một bộ xử lý. –

1

Tôi nghĩ bạn đang đi đúng hướng.

Những gì tôi thường làm trong một tình huống như thế này là thiết kế một ngôn ngữ đơn giản để nắm bắt nhu cầu của tôi và viết một trình phân tích cú pháp LL1 (đệ quy gốc) cho nó.

Nếu ngôn ngữ phải có cú pháp C# không quan trọng, tôi có thể báo giá hoặc chỉ quấn nó vào các dấu ngoặc mà tôi có thể nhận ra và chỉ chuyển nó qua mã đầu ra.

Tôi có thể tạo cấu trúc cây phân tích cú pháp và tạo ra 3 loại mã khác nhau, hoặc tôi chỉ có thể tạo mã khi đang chạy, sử dụng biến chế độ có 3 giá trị hoặc đồng thời viết mã cho 3 tập tin đầu ra khác nhau.

Có nhiều cách để thực hiện. Nếu bạn sợ viết các trình phân tích cú pháp (như một số lập trình viên), có rất nhiều trợ giúp ở nơi khác trên SO.

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