2008-10-22 6 views
2

저는 대개 확장 메서드를 사용하지 않습니다. 확장 메서드를 작성해야한다고 생각할 때 때때로 메서드를 오버로드하려고합니다. 내 질문은 다른 확장 메서드를 호출하는 확장 메서드에 대한 생각은 무엇입니까? 나쁜 연습? 그것은 잘못된 생각이지만, 나는 왜 그 이유를 정의 할 수 없습니다.C# 확장자

예를 들어, 두 번째 CaselessIs 방법은 첫 번째 호출

public static bool CaselessIs(this string s, string compareTo) 
{ 
    return string.Compare(s, compareTo, true) == 0; 
} 

public static bool CaselessIs(this string s, IEnumerable<string> compareTo) 
{ 
    foreach(string comparison in compareTo) 
    { 
     if (s.CaselessIs(comparison)) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

이 이렇게하지 것이 더 적합 할 것인가? 단점은 DRY를 위반한다는 것입니다.

public static bool CaselessIs(this string s, string compareTo) 
{ 
    return string.Compare(s, compareTo, true) == 0; 
} 

public static bool CaselessIs(this string s, IEnumerable<string> compareTo) 
{ 
    foreach(string comparison in compareTo) 
    { 
     if (string.Compare(s, comparison, true) == 0) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+0

"CaselessIs"는 매우 직관적 인 함수 이름이 아닙니다. "CompareCaseless"로 바꾸는 것이 좋습니다. –

+0

또한이 질문의 제목을 조금 더 구체적으로 바꾸고 싶을 수 있습니다. –

답변

9

내가 여기에 DRY 컨트롤을 말해야 할 것입니다. 개인적으로, 다른 확장 메서드를 호출하는 확장 메서드에 문제가없는 것을 볼 수 있습니다. 특히 다른 확장이 동일한 어셈블리 내에 포함되어있는 경우에는 특히 그렇습니다. 나는, 내가 그렇게 이적으로, 두 개의 정적 메소드 체인 문제가 표시되지 않습니다

StaticType.ExtensionMethod(extended, foo); 

:

extended.ExtensionMethod(foo); 

에 모든 -에 - 모두, 메소드 호출은 단지에서 컴파일러에 의해 번역 두 가지 확장 방법을 연결하는 데 문제가 보이지 않습니다. -

3

나는 개인적으로 내가 생각하는 두 번째 시나리오가 더 잘못된 느낌, 그것으로 문제가 표시되지 않습니다 ....

1

내가 그것을 아무 문제가 없다, 나 자신이 더 잘 느낄 수 있다면, 그래도, 당신은 확실히 대신 정적 버전을 사용할 수 있습니다 개인적으로

public static bool CaselessIs(this string s, IEnumerable<string> compareTo) 
{ 
    foreach(string comparison in compareTo) 
    { 
     if (Extensions.CaselessIs(s, comparison)) 
     { 
     return true; 
     } 
    } 

    return false; 
} 

을,이 예에서, 내가 전화 한 것 CaselessMatches, 그리고 단수 전화 복수했다 ...하지만 그것은 단지 nitpicky, 그렇 겠지.

2

완벽하게 맞습니다. 왜 그것이 틀린가?

확장 메서드를 정의 할 때 실제로 새로운 언어의 컴파일러 확장 인 3.0 프레임 워크를 목표로 삼고 있으므로 다른 확장을 사용하여 작업하는 것이 잘못되었습니다.

의견을 검토해도 "다른"확장 프로그램이 다른 라이브러리에 있었더라도 다른 프로그램의 확장 기능을 "사용"하지 않는 한 모든 버전에 아무런 문제가 없습니다. 확장 기능은 코드 간의 기본 로직을 더 잘 이해하고 클래스에 일반적인 작업을 추가하는 데 도움이되는 구문 기능입니다 ... 실제로는 메소드에 대한 마스크 된 호출이므로 사용자가 사용하는 것과 똑같은 제한을 적용해야합니다 메소드 호출.

1

아무 문제가 없습니다. someClass.ToMySpecialString()을 생성한다고 가정 해 보겠습니다. someClass.ToString()에 이미 여러 오버로드가있는 경우 오버로드 할 수 없습니까?