2009-07-27 33 views
6

Tôi đã thực hiện Cộng đồng Wiki này vì một số người có thể nghĩ rằng nó đang mở để tranh luận và những người khác có thể nghĩ đó là câu hỏi họ thực sự có ý nghĩa (nói cách khác, đó là vấn đề ý kiến ​​cho dù đó là vấn đề của ý kiến).WF, WCF và dịch vụ khai báo (hoặc: Microsoft có ý nghĩa gì bởi "tuyên bố"?)

Có một số general question on SO about declarative programming, có một số câu trả lời tuyệt vời.

Nhưng tôi bị một chút ném bởi this blog post từ một nhà truyền giáo của Microsoft.

Một ưu điểm của declarative lập trình là bạn có thể chỉ ra những gì bạn muốn làm, nhưng không phải là cách để làm điều đó.

Cho đến nay, rất tốt - điều đó hoàn toàn đồng ý với câu trả lời được chấp nhận về câu hỏi SO, trên thực tế.

Nhưng sau đó kiểm tra phần về "thực hiện dịch vụ",

Bạn có thể chỉ cần nhìn vào một vài chục dòng XAML mã và có thể để xác định như thế nào Dịch vụ WCF được cấu hình và làm thế nào quy trình công việc tương ứng được xác định.

Đã xem xét một số ví dụ, hãy để tôi trả lời ngắn gọn bằng cách nói "Không, tôi không thể". Nhưng thay vì gạt bỏ những thứ này một cách khéo léo, hãy look at the docs.

Mất một lúc nhưng cuối cùng là reality has caught up with satire ... nhưng đó không phải là vấn đề - tất nhiên họ không nghiêm túc đề xuất làm điều này để phơi bày điều gì đó tầm thường như bổ sung. Tôi cũng không phàn nàn về sự rống rợn vô lý, và ý tưởng kỳ lạ là bất cứ ai cũng có thể viết cái gì đó như thế bằng tay - nó trông giống như đầu ra của một trình biên dịch hơn là một ngôn ngữ có thể đọc được.

Câu đố cho tôi là điều này được xác nhận là "khai báo". Và cốt lõi của nó là một tuyên bố phân công.

There's more here:

dịch vụ khai báo được định nghĩa khai báo trong XAML và cung cấp một lớp trừu tượng. Về cơ bản, bạn tạo một mô hình của dịch vụ bằng cách xác định những gì bạn muốn dịch vụ để làm thay vì cách thực hiện . Toàn bộ dịch vụ có thể được xác định theo cách khai báo, bao gồm việc thực hiện các hoạt động .

Vì vậy, nếu chúng ta nói declarative hoặc khai báo ba lần, mà làm cho nó khai báo. Gotcha. Và nếu chúng ta nói cụm từ ma thuật "những gì bạn muốn làm hơn là làm thế nào" thì chúng ta có thể bỏ qua để nhận thấy rằng trong câu tiếp theo, chúng ta sẽ chỉ định "thực hiện các hoạt động", và vì vậy chúng tôi sẽ nói chính xác cách thực hiện.

Ví dụ trong trang đó là:

<wma:Sequence> 
    <wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' /> 
    <wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" /> 
</wma:Sequence> 

Đó là để nói, toàn bộ điều (trong đó có một tấn rác tôi đã cắt ra từ ví dụ WF) là chính xác tương đương với:

void Add(int op1, int op2, out int result1) 
{ 
    Console.WriteLine("Add(" + op1 + ", " + op2 + ") called"); 
    result1 = op1 + op2; 
} 

Vì vậy - một khối câu lệnh sẽ được thực hiện theo thứ tự chúng xuất hiện và có các tác dụng phụ. Có tất nhiên các yếu tố hoạt động dòng công việc cho vòng lặp (và bạn có thể viết các hoạt động của riêng bạn nếu WF không có tuyên bố bắt buộc yêu thích của bạn). Rõ ràng, "viết lại mã của bạn ở định dạng không đọc được" cũng giống như "thêm một lớp trừu tượng".

Để nhắc lại, nó không phải là sự tức giận không thể đọc được Tôi đang phàn nàn về - đó là thực tế là rõ ràng là Turing-hoàn thành lập trình bắt buộc xảy ra trong việc thực hiện dịch vụ, vậy điểm là gì? Trước khi bạn biết nó, chúng ta sẽ bước qua các luồng công việc của chúng ta trong trình gỡ lỗi, cố gắng tìm ra câu lệnh gán nào đã đột biến giá trị nào, hoặc tại sao vòng lặp tiếp tục đi vòng mãi mãi.

(Sự trớ trêu là trong phiên bản C#, vì chúng tôi chưa chỉ định cách ghép các đoạn chuỗi, do đó cho phép trình biên dịch tạo ít cuộc gọi hơn đến phương thức Concat.)

Vì vậy, viết một cái gì đó trong XML làm cho nó khai báo (cũng như ít có thể đọc được)?

Trả lời

3

Tuy nhiên, một sự thừa nhận khác rằng việc sử dụng XML trong các khả năng khác với định dạng trao đổi sẽ mất nhiều thời gian.

Dịch vụ "định nghĩa" trong WCF đã được khai báo từ ngày đầu tiên. Tuy nhiên, tách các định nghĩa giao diện khỏi các định nghĩa dịch vụ (bằng cách này tôi có nghĩa là ServiceContractAttribute et al) là, IMO, điều tốt. Tuy nhiên, bằng cách sử dụng XML như một ngôn ngữ lập trình thực sự sucks.

Cá nhân tôi cảm thấy khá có thể giải thích các cuộc tấn công khủng bố thuần túy khi xem các tài liệu XML này.

0

Có một phần của Windows Workflow Foundation không được thảo luận nhiều (bên ngoài Microsoft), có thể làm rõ điều này cho bạn.

Nếu bạn tạo dự án Luồng công việc và nhìn vào hộp công cụ, bạn sẽ thấy một số lượng lớn "hộp và đường" mà bạn có thể kéo lên bề mặt thiết kế. Bạn có thể có ấn tượng rằng bạn có ý định tạo luồng công việc của mình từ bộ công cụ này. Đó không phải là tình huống.

Bạn dự kiến ​​sẽ tác giả các hoạt động tùy chỉnh cụ thể cho miền sự cố của mình. Đây có nghĩa là để được kết nối bởi các hoạt động khác nhau trong hộp. Đây có thể là các hoạt động khá cao - những thứ như "đánh giá chính sách bảo hiểm" hoặc "ghi lại thời gian ở bệnh nhân".

Luồng công việc khai báo (hoặc dịch vụ) sẽ khai báo cách đặt cùng các hoạt động cụ thể cho vấn đề mà bạn có sẵn cho bạn.

+0

"tuyên bố cách đặt cùng nhau" - nhưng chỉ theo nghĩa là phần thân phương thức trong C# "khai báo" cách triển khai phương thức. Và lưu ý sự xuất hiện của từ "làm thế nào", đó là những gì lập trình khai báo có nghĩa vụ phải tránh. Đường ranh giới giữa khai báo và mệnh lệnh là gì, vì các hoạt động dòng công việc được thực hiện bởi một dịch vụ thường là các bước bắt buộc (tuy nhiên chunky) và do đó phải hoạt động theo trình tự bắt buộc, và được bắt buộc bởi các hoạt động WF out-of-the-box ? –

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