2011-11-10 3 views
1

나는 대답에이 댓글을 통해 SO 검색과 온되었다대리인을 테스트하여 테스트 할 수있게 할 때 인터페이스를 추출해야하는 이유는 무엇입니까?

을 우리가 DI는 대리인 그것을 테스트 할 수 있도록 할 수있는 인터페이스를 추출하는 의식을 통해 이동 이유는 무엇입니까?

이것은 내가 연초에 생각한 것입니다. 인터페이스 구현 대신 순수한 기능 (함수 포인터라고 생각합니다.)을 주입하는 데 본질적으로 문제가 있습니까?

+0

기능 포인터는 언어에 따라 다르기 때문에 귀하의 질문에 답해 드리겠습니다. 그래서 어떤 언어? –

+0

가독성을 높이기 위해 C# 4.0 – Ben

답변

2

인터페이스를 설명하는 '의식'이라는 단어는 정적 인 타이핑을 금지하는 Ruby-ist의 의견과 같이 의심스럽게 들립니다. 좋은 리펙토링 및 템플릿 툴을 사용하면 어쨌든 대부분의 의식이 눈에 띄지 않게됩니다.

대리인을 전달하는 것이 일반적이지만 인터페이스가있는 IoC는 일반적으로 구현, 사용, 이해 및 유지 관리가 더 쉽습니다.

public class MyClass 
{ 
    public MyClass(IAmEasyToUnderstand easy) 
    { 
    if (easy == null) throw new ArgumentNullException("easy"); 
    } 

    public MyClass(Func<bool, int, int, Point> IAmNot, Func<bool> Clear, Action aboutAnything) 
    { 
    //multiple null checks. 
    } 
} 

public interface IAmEasyToUnderstand 
{ 
    bool DoPointStuff(int a, int b, Point point); 
    bool CanHazExecute(); 
    Action RunRun(); 
} 

지금 다른에 의해 소비를위한 인터페이스를 반환하는 클래스 고려하십시오 :

전형적인 생성자 고려 후자의 소비 예보고에서

public MyClass 
{ 
    //IFace 
    public IAmEasyToUnderstand FindEasy(); 

    //Not Iface 
    Func<bool, int, int, Point> ReturnPointStuffDoer(); 
    Func<bool> ReturnCanHazExecuteCallback(); 
    Action WowThisIsAnnoying(); 
} 


var easy = myclassInstance.FindEasy(); 
var consumer = new EasyConsumer(easy); 

.... 

var consumer = new EasyConsumer(
       myClassInstance.ReturnPointStuffDoer(), 
       myClassInstance.ReturnCanHazExecuteCallback(), 
       myClassInstance.WowThisIsAnnoying()); 

을, 명백한 정리는 다음과 같습니다

var consumer = new EasyConsumer(myclassInstance); 

즉, 클래스 유형을 다음으로 대체해야합니다. 조롱을위한 인터페이스.

+0

+1을 사용하고 있습니다. – Steven