Thiết kế giao diện và không đồng bộ


9

Giả sử tôi đã tạo giao diện IFolderRepositoryvới các phương thức như thế:

IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);

và tôi đã thực hiện DatabaseFolderRepositoryvà cho phép nói CacheFolderRepositoryDecorator. Bây giờ 'hàng trăm dòng sau' Tôi muốn thêm chức năng của các thư mục SkyDrive để tôi sẵn sàng thêm SkyDriveFolderRepository. Thật không may trong khi DatabaseFolderRepositorythực hiện đã sử dụng các phương thức đồng bộ để nói chuyện với cơ sở dữ liệu, skydrive người ta sử dụng rất nhiều asyncawait. Làm gì trong trường hợp như vậy? Trong trường hợp các phương thức void đánh dấu, nó không đồng bộ không phải là một giải pháp (cần xử lý ngoại lệ). Tôi có nên thay đổi giao diện để trở lại Task<T>? Chắc chắn nó sẽ hoạt động trong ví dụ trên nhưng chúng chỉ là 2 lớp thực hiện giao diện. Hoặc hầu hết các giao diện của tôi có Taskloại trả về (đối với bạn sẽ không cần quy tắc này)?


Không liên quan đến câu hỏi của bạn (xin lỗi), nhưng nếu bạn có IFoldergiao diện, tại sao bạn lại dựa vào việc triển khai cụ thể ( Folder) trong tất cả các phương thức của mình?
Konrad Morawski

1
Người gọi của bạn mong đợi điều gì? API bạn triển khai dựa trên mã lỗi, ngoại lệ, cuộc gọi lại hay sao? Bạn có thể thay đổi nó?
david.pfx

@KonradMorawski đó là lỗi chính tả - xin lỗi. Nó dựa trên các ngoại lệ và tôi không thể thay đổi nó.
fex

Câu trả lời:


10

Bạn có thể sẽ thấy bài viết MSDN này về các thực hành không đồng bộ là một bài đọc tốt.

Bạn đã hỏi:

Thật không may trong khi DatabaseFolderRepositorythực hiện đã sử dụng các phương thức đồng bộ để nói chuyện với cơ sở dữ liệu, skydrive người ta sử dụng rất nhiều asyncawait.

Đây là nơi phần phụ Async All the Waytrong bài viết MSDN tôi liên kết sẽ phù hợp với tình huống của bạn.

Cụ thể, thường là một ý tưởng tồi để chặn mã async bằng cách gọi Task.Wait hoặc Task.Result. Đây là một vấn đề đặc biệt phổ biến đối với các lập trình viên, những người đã nhúng ngón chân của họ vào lập trình không đồng bộ, chuyển đổi chỉ một phần nhỏ trong ứng dụng của họ và gói nó trong một API đồng bộ để phần còn lại của ứng dụng được tách biệt khỏi các thay đổi. Thật không may, họ gặp vấn đề với bế tắc.

Vì bạn có ít nhất một giao diện cần không đồng bộ, YAGNI bị đảo ngược. Bạn sẽ cần phải thực hiện những thay đổi do đó giao diện của bạn là phù hợp. Vâng, nó sẽ tạo ra nhiều nỗ lực hơn cho bạn. Nhưng lợi ích là ít rủi ro bế tắc; gỡ lỗi ít phức tạp hơn; và chặn nhiều dự đoán hơn (khi nó thực sự cần phải xảy ra).

Tôi đang bỏ qua một số câu hỏi khác mà bạn đã hỏi vì tôi nghĩ rằng tôi đã giải quyết cốt lõi câu hỏi của bạn. Đối phó với cốt lõi và phần còn lại của câu hỏi của bạn rơi ra. Bài viết khá liên quan và giải quyết các điểm khác mà bạn đưa ra cũng như chỉ ra những cạm bẫy bổ sung.

Lập trình không đồng bộ là một trong những nơi mà bạn phải nắm lấy toàn bộ khái niệm và chỉ cần đi với nó. Cố gắng chỉ "nhúng ngón chân vào" trên cơ sở từng phần cuối cùng sẽ phức tạp hơn rất nhiều sau đó chỉ cần nhảy thẳng vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.