2010-10-14 19 views
14

Tôi vừa đọc xong một bài viết trên MSDN by John Evdemon. Ông bash các giao diện CRUD và gọi nó là một anti-pattern.Tại sao CRUD hoạt động quá tệ trong thiết kế SOA?

Mặc dù tôi đồng ý rằng BẤT K AN trạng thái bất thường là khó khăn và hiện tại và MoveNext là ý tưởng tồi Tôi không đồng ý rằng CRUD như trong Tạo bản cập nhật đọc và xóa là xấu. Nếu tôi có dịch vụ xe hơi và tôi muốn cho phép khách hàng có thể thực hiện những điều cơ bản, như trong Tạo xe ô tô, lấy chi tiết xe ô tô, cập nhật chi tiết xe ô tô hoặc xóa xe thì họ có ý định làm những điều đó như thế nào không có hoạt động CRUD.

Hoặc tôi thiếu gì ở đây?

+1

Tôi đoán tôi sẽ phải đọc bài viết để nhận được câu trả lời: vì khi nào thao tác con trỏ (moveNext) được coi là thao tác CRUD? – mikemanne

Trả lời

16

Các giao diện CRUD nên tránh trong kịch bản hệ thống phân phối/SOA vì họ rất tán gẫu. Nhưng không có nghĩa là phải. Khi bạn có một số hành động của khách hàng yêu cầu nhiều hơn một cuộc gọi đến dịch vụ của bạn thì bạn biết rằng bạn nên từ bỏ phương pháp CRUD và tạo hoạt động dịch vụ mới sẽ thu thập các cuộc gọi đó thành một cuộc gọi duy nhất. Khi thiết kế hệ thống phân phối, bạn nên luôn luôn giảm số lượng cuộc gọi đến mức tối thiểu vì cuộc gọi mạng rất tốn thời gian.

Edit:

Bạn có thể suy nghĩ về giao diện CRUD như về truy cập dữ liệu tiếp xúc trong một dịch vụ. Đôi khi bạn thực sự muốn điều này. Nhưng trong kiến ​​trúc hệ thống phân tán và SOA, bạn thường phơi bày chức năng nghiệp vụ đã kết thúc truy cập dữ liệu và cung cấp nhiều hoạt động phức tạp hơn (điều chỉnh nhiều hoạt động truy cập dữ liệu).

Ví dụ:

CRUD giao diện logic x kinh doanh. Giả sử bạn đang làm việc với Invoices. Mỗi hóa đơn bao gồm InvoiceHeader và một hoặc nhiều InvoiceLine. Nếu bạn sử dụng giao diện CRUD cho hóa đơn, trước tiên bạn sẽ gọi hoạt động CreateInvoiceHeader để tạo InvoiceHeader và sau đó một số hoạt động AddInvoiceLine để thêm tất cả InvoiceLines - đó là cách tiếp cận CRUD mức thấp. Nhưng nếu bạn thực hiện logic nghiệp vụ ở phía dịch vụ, bạn sẽ gọi đơn CreateInvoice và chuyển một biểu đồ đối tượng phức tạp (tiêu đề với tất cả các dòng) đến dịch vụ để tạo và thêm những gì cần thiết. Phương thức Create cũng có thể thực hiện các hoạt động kinh doanh khác như bắt đầu một số quy trình làm việc, vv Đó là cách tiếp cận hệ thống phân tán và SOA phổ biến.

+0

Điều đó làm tôi bối rối một chút. Làm cách nào để chúng tôi cho phép khách hàng tạo các thực thể mới hoặc cập nhật chi tiết của họ nếu chúng tôi không tiếp cận các hoạt động CRUD. Ví dụ Chỉ cần một phương thức Tạo đơn giản chấp nhận xe hơi. Nếu có vấn đề thì chúng tôi sẽ gửi lại lỗi. Nếu bạn không nhận được gì thì nó đã thành công. Trong tâm trí của tôi nó không thể nhận được ít trò chuyện. Như tôi đã nói tôi có thể thiếu một thứ gì đó lớn ở đây. – uriDium

+0

@uriDium: Tôi đã thêm một số ví dụ. –

+0

Ồ đúng. Cảm ơn ví dụ. Vì vậy, CRUD trong gần như một "hình thức thực sự", nơi tất cả mọi thứ được phân hủy để cơ bản Tạo Đọc Cập nhật hoặc Xóa là một ý tưởng tồi vì nó lực lượng dịch vụ chatty. Nếu bạn có thể bọc tất cả chúng lên trong một phương thức dịch vụ đơn lẻ như PlaceOrder (invoiceHeader, List ) sẽ tốt hơn nhiều vì nó cắt giảm cuộc trò chuyện và mang lại nhiều ý nghĩa kinh doanh hơn. Nhưng rõ ràng là vẫn còn một trường hợp mà chúng ta có thể chỉ cần tạo một đối tượng duy nhất. Tôi có nhận được ý tưởng đó không? – uriDium

5

RESTfull web services gần đây đã trở nên phổ biến đang chứng minh sai bài đăng của ông John Evdemon.

+1

Tôi không nghĩ như vậy, ông nói "Các nhà phát triển nên tham khảo các tiêu chuẩn công nghiệp hiện có trước khi phát triển các lược đồ của riêng họ". Vâng HTTP với hoạt động CRUD của nó là tiêu chuẩn mà bạn sử dụng với các dịch vụ web RESTfull. IMHO là câu chuyện ở đây, nó không có ý nghĩa để xác định các hoạt động CRUD của riêng bạn gây ra cho hoạt động CRUD có đủ giải pháp đã được phát minh. – Stephan

5

Tôi nghĩ rằng anh ta có mục đích thiết kế giao diện tồi tệ nhất có thể ở đây và nó không thực sự là một giao diện CRUD.

<WebMethod()> _ 
Public Function MoveNext() As Boolean 
End Function 

<WebMethod()> _ 
Public Function Current() As Object 
End Function 

Hai phương pháp này rõ ràng không phải là quốc tịch, nhưng cũng không cần thiết cho giao diện CRUD thực sự. Tôi nghĩ nó chỉ là một ví dụ rất kém và nó không thực sự liên quan đến các hoạt động của CRUD.

Cập nhật:

Tìm thấy một câu hỏi tương tự với một rất tốt answer :)

0

Câu trả lời được chấp nhận không chính xác. Và mặc dù thực tế rằng John sử dụng CRUD như một ví dụ chống mẫu bằng cách sử dụng CRUD cho không phải là xấu cho SOA.Đây là vấn đề với SOA như John mô tả: nó khuyến khích sự phức tạp gia tăng ở cấp độ dịch vụ, điều này cuối cùng dẫn đến sự hỗ trợ ít hơn cho nhiều trường hợp sử dụng. Một trong những lý do chính chúng tôi xây dựng API là cung cấp quyền truy cập vào nhiều ứng dụng, đây là nơi ROI chính đang xây dựng các API.

Ví dụ: giả sử chúng tôi có API blog. Giả sử chúng tôi cung cấp cho người dùng khả năng viết bài đăng, thêm hình ảnh và đưa nhận xét vào tất cả trên một màn hình của ứng dụng bên ngoài của chúng tôi. Trong tầm nhìn của John của SOA ông có lẽ sẽ khuyên chúng ta xây dựng API của chúng tôi sử dụng một cuộc gọi để làm tất cả những điều này vì thế sẽ ít tán gẫu và blah blah blah ... vậy:

{ 
    "post_title": "New Post", 
    "post_content": "Some Stuff....", 
    "comments": [{ 
    "comment": "This is right on!", 
    "userId": 101 
    }, { 
    "comment": "I agree.", 
    "userId": 105 
    }], 
    "images": [{ 
    "imgURL": "http://some.img.com/1" 
    }, { 
    "imgURL": "http://some.img.com/2" 
    }] 
} 

Bây giờ có rất rõ ràng ba đối tượng dữ liệu khác nhau cần được lưu trữ riêng ở đây: bài đăng, nhận xét và hình ảnh. Từ quan điểm của kho dữ liệu, bài đăng chuyển đến bảng POSTS các chú thích tới bảng COMMENTS và các hình ảnh tới bảng IMAGES. Vì vậy, nếu chúng tôi xây dựng dịch vụ của chúng tôi theo các đối tượng thuê SOA như John mô tả chúng, chúng tôi thực hiện cuộc gọi của chúng tôi với đối tượng của chúng tôi và dịch vụ cố gắng tạo bài đăng, ví dụ như mục đích, hoạt động tốt các bình luận hoạt động tốt nhưng khi chúng tôi nhận được các hình ảnh dịch vụ nhận ra rằng một trong các URL hình ảnh bị lỗi là không thành công. Vì vậy, dịch vụ của chúng tôi trả về một thất bại? Mặc dù 3 phần khác hiện đã được lưu trữ thành công trong kho dữ liệu của chúng tôi? Chúng ta có quay trở lại và hoàn tác tất cả các phần thực thi thành công không? Điều gì xảy ra nếu cửa hàng dữ liệu đã thực hiện các thay đổi và chúng tôi không thể khôi phục lại? Một số điều này với thực tế là nếu chúng ta làm cho nó "trò chuyện nhiều hơn" và gửi chúng riêng lẻ, bây giờ chúng ta có thể sử dụng lại các dịch vụ đó trong các ứng dụng khác mà không cần phải viết lại bất kỳ phần nào của dịch vụ.

Phần xấu của dịch vụ tổng hợp là bạn đang được bán trên ý tưởng rằng dịch vụ sẽ không bao giờ thất bại ... điều đó thật lố bịch. Sẽ luôn luôn có một trường hợp cạnh mà một cái gì đó sẽ thất bại và bằng cách hợp nhất tất cả mọi thứ vào một dịch vụ bạn đã tăng sự phức tạp của bạn và thực sự tăng khả năng của bạn thất bại.

Tôi sẽ so sánh phiên bản SOA này với những thiếu sót mà chúng tôi đã nhận ra trong việc xây dựng các Đối tượng của Thiên Chúa trong Lập trình hướng đối tượng. https://en.wikipedia.org/wiki/God_object

Chúng tôi biết rõ hơn điều này, vậy tại sao chúng tôi lại khôi phục? Dịch vụ hợp nhất hoặc Thiên Chúa là một ý tưởng tồi tệ giống như Thiên Chúa. Tôi nói xây dựng các dịch vụ của bạn để làm một việc và làm tốt cho nhiều trường hợp sử dụng nhất có thể và dịch vụ của bạn sẽ tốt.

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