인터페이스는 객체와 공동 작업자 중 하나 사이에서 상호 작용을 조롱하고 싶을 때 유용합니다.그러나 내부 상태가있는 객체의 인터페이스에는 값이 적습니다.
예를 들어, 어떤 도메인 객체를 추출하기 위해 저장소와 대화하는 서비스가 있다고 가정 해 봅니다.
저장소에서 인터페이스를 추출 할 때 명확한 설계 값이 있습니다. 저장소의 구체적인 구현은 NHibernate 또는 ActiveRecord와 강하게 연결될 수 있습니다. 내 서비스를 인터페이스에 연결함으로써 구현 세부 사항을 명확하게 구분할 수 있습니다. 그것은 너무 일 어서 내 서비스를위한 초고속 독립형 유닛 테스트를 작성할 수있게되었습니다. 이제는 모의 IRepository를 넘겨 줄 수 있습니다.
리포지토리에서 돌아 왔고 내 서비스가 작동하는 도메인 개체를 고려할 때 값이 적습니다. 내 서비스 테스트를 작성할 때 실제 도메인 객체를 사용하고 상태를 확인하려고합니다. 예 : service.AddSomething() 호출 후 뭔가가 도메인 객체에 추가되었는지 확인하려고합니다. 도메인 객체의 상태를 간단히 검사하여이를 테스트 할 수 있습니다. 격리 된 상태에서 도메인 객체를 테스트 할 때 객체에 대한 작업을 수행하고 내부 상태를 퀴즈로 처리하기 때문에 인터페이스가 필요하지 않습니다. 예 : 잠든다면 내 양들이 풀을 먹는 것이 맞습니까?
첫 번째 경우 상호 작용 기반 테스트에 관심이 있습니다. 테스트중인 객체와 공동 작업자 사이에 전달되는 호출을 모의 객체로 가로 채기를 원하므로 인터페이스가 도움이됩니다. 두 번째 경우에는 상태 기반 테스트에 관심이 있습니다. 인터페이스는 여기서 도움이되지 않습니다. 상태 또는 상호 작용을 테스트하고 있는지 여부를 의식하여 인터페이스 또는 인터페이스 결정에 영향을 미치는지 확인하십시오.
(Resharper가 설치되어 있다면) 나중에 인터페이스를 추출하는 것이 매우 저렴하다는 것을 기억하십시오. 인터페이스를 삭제하고 결국 더 간단한 클래스 계층 구조로 돌아가려면 값이 싸다. 결국 인터페이스가 필요 없다고 결정하면된다. 내 충고는 인터페이스없이 시작하고 상호 작용을 조롱하고 싶을 때 필요할 때 추출하는 것입니다.
그림에 IoC를 가져 오면 더 많은 인터페이스를 추출하는 경향이 있습니다. 그러나 IoC 컨테이너에 몇 개의 클래스를 추가했는지에 대한 뚜껑을 유지하려고합니다. 일반적으로 이러한 제한된 주로 상태 비 저장 서비스 객체를 유지하려고합니다.
이제 모두들 ... 컴퓨터를 전환하고 서로의 코드를 읽으십시오! –