인터페이스 및 비동기 설계


9

다음 IFolderRepository과 같은 메소드로 인터페이스 를 작성했다고 가정하십시오 .

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

그리고 나는 구현 DatabaseFolderRepository하고 말할 수 있습니다 CacheFolderRepositoryDecorator. 이제 '수백 줄 후에'SkyDrive 폴더 기능을 모두 추가하여 추가 할 준비가되었습니다 SkyDriveFolderRepository. 불행하게도 동안 DatabaseFolderRepository구현은 데이터베이스와 얘기 동기 방법을 사용, 스카이 드라이브 하나는 많이 사용 async하고 await. 이 경우 어떻게해야합니까? void 메소드를 표시하는 경우 비동기는 솔루션이 아닙니다 (예외 처리 필요). 반환하려면 인터페이스를 변경해야합니까 Task<T>? 물론 위의 예제에서 작동하지만 인터페이스 구현 클래스는 2 개에 불과합니다. 아니면 대부분의 인터페이스에 Task반환 유형이 있어야합니까 (규칙이 필요하지 않음)?


귀하의 질문 (죄송합니다)과 관련이 없지만 IFolder인터페이스 가있는 경우 Folder모든 방법에서 구체적인 구현 ( )에 의존하는 이유는 무엇입니까?
Konrad Morawski

1
발신자는 무엇을 기대합니까? 오류 코드, 예외, 콜백 또는 무엇을 기반으로 구현하는 API입니까? 변경할 수 있습니까?
david.pfx

@KonradMorawski 그것은 오타였습니다-죄송합니다. 예외를 기반으로하며 변경할 수 없습니다.
fex

답변:


10

비동기 사례 에 대한이 MSDN 기사를 잘 읽어보십시오.

당신은 물었다 :

불행하게도 동안 DatabaseFolderRepository구현은 데이터베이스와 얘기 동기 방법을 사용, 스카이 드라이브 하나는 많이 사용 async하고 await.

여기 Async All the Way에서 내가 링크 한 MSDN 기사 의 하위 섹션 이 현재 상황과 관련이있는 곳입니다.

특히 Task.Wait 또는 Task.Result를 호출하여 비동기 코드를 차단하는 것은 일반적으로 좋지 않습니다. 이는 애플리케이션의 일부만 변환하고 동기식 API로 랩핑하여 나머지 애플리케이션이 변경 사항과 격리되도록 프로그래머가 "토우를 발가락으로"비동기식 프로그래밍에 적용하는 프로그래머에게 특히 일반적인 문제입니다. 불행히도 교착 상태에 문제가 있습니다.

비동기식이어야하는 인터페이스가 하나 이상 있으므로 YAGNI가 반대입니다. 당신은 있는 당신의 인터페이스가 일치되도록 변경을 할 거 필요. 예, 더 많은 노력을 기울일 것입니다. 그러나 이점은 교착 상태의 위험이 적습니다. 덜 복잡한 디버깅; 더 예측 가능한 차단 (실제로 발생해야하는 경우).

나는 당신의 질문의 핵심을 해결했다고 생각하면서 당신이 물었던 다른 질문들 중 몇 가지를 건너 뜁니다. 핵심을 다루고 나머지 질문은 사라집니다. 이 기사는 상당히 관련이 있으며 추가 함정을 지적하고 제기 한 다른 요점을 다루고 있습니다.

비동기식 프로그래밍은 전체 개념을 수용하고 그 개념을 따라야하는 것들 중 하나입니다. 단편적으로 "발가락을 담그는 것"을 시도하는 것은 훨씬 더 복잡하고 곧바로 들어가는 것으로 끝납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.