2009-06-25 2 views
2

저는 여러 제품 릴리스에서 사용될 라이브러리를 설계하는 중입니다.이 작업의 일부는 .NET 1.1에없는 기능을 보완하는 것입니다. 우리가 필요하기 때문입니다. 그것을 사용하십시오. 아마도 이것의 가장 좋은 예는 String.IsNullOrEmpty 메서드입니다.이 메서드는 우리가 상당히 많이 의존합니다..NET 1.1에서 봉인 된 클래스를 확장하기위한 깨끗하고 직관적 인 접근 방법은 무엇입니까?

.NET의 String 클래스는 봉인되어 있습니다. 어댑터 또는 Decorator 패턴을 사용하여 원래 문자열을 래핑하여 클래스의 기능을 확장하는 방법에 대해 생각해 보았습니다. 그러나이 작업이 내가하려는 작업에 대해 매우 직관적 인 방법이라고 확신하지는 못합니다. 비슷한 질문에 대해서도 another post on StackOverflow을 보았습니다.하지만 방금 언급 한 문제가 다시 제기됩니다.

나는 확실히 내가 찾는 기능을 만들 어댑터를 사용할 수 있지만 나는 모든 문자열이 일을 상상할 수 없다 : 나는 반드시이 방법을 싫어하지 않는

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty(); 
if (isEmpty) 
{ 
    // Do something 
} 

만 보인다 마치 다른 솔루션이 더 좋은 메모리 관리를하게됩니다. 또한, "StringUtility"라이브러리를 만드는 것이 좋지 않습니다. 그 접근 방식은 제가 따르고 자하는 객체 지향 디자인에서 더 멀어지기 때문입니다.

모든 입력 사항이 유용 할 것입니다. 내가 미쳐서 이러한 접근법 중 하나를 사용해야한다면 알려주세요. 몇 가지가 있기 때문에 솔루션보다 모범 사례를 더 많이 찾고 있습니다.

+0

난 그냥 어댑터 패턴을 추천 작은 샘플을 쓰기 만하고 싶어 ... 당신이 이미 :( –

+0

을 언급 한 것 나는 봉인 된 클래스들, 특히 직렬화 할 수없는 봉인 된 클래스들을 싫어한다. 1.1 이후 SqlDataAdapter를 확장하여 제한된 직렬화를 허용하고 싶었 기 때문에 매개 변수에 대한 자세한 내용을 추한 컴퓨터 생성 코드 더미 대신 좋은 구성 파일에 넣을 수 있었다. . – quillbreaker

답변

3

개인적으로 정적 IsNullOrEmpty 메서드가있는 "StringUtility"라이브러리를 선호합니다. 본질적으로 당신은 extension methods을 호출하기위한 멋진 구문없이 만들 것입니다.

2

정의에 따르면 명확한 접근법은 없습니다. 나는 어댑터 방식이 .NET 1.1에서 할 수있는 최선의 방법이라고 생각한다. 물론 이것은 외부 세계를 다룰 때 앞뒤로 갈 것을 요구합니다.

0

저는 매튜와 깨끗한 접근 방식에 동의합니다. 데코레이터 패턴은 계승 (또는 적어도 다형성)에 의존하고 있기 때문에 적합하지 않습니다. 동일한 인터페이스 (봉인되었으므로)가있는 클래스를 만들 수 없으므로 Decorating System.String을 사용할 수 없습니다.

기본적으로 하나의 인터페이스를 다른 인터페이스에 적용하는 데 어댑터가 사용됩니다. 그건 당신이 여기서하고 싶은 것이 아닙니다. 본질적으로, 당신이 염두에두고있는 것은 래퍼 (Wrapper)이지만, 매튜 (Matthew)가 지적했듯이, 당신은 앞뒤로 많이 바꾸어야 할 것입니다.

아마도 새로운 유형의 이름을 "텍스트"로 지정하고 문자열과의 암시 적 변환을 구현하여 작성할 필요가있는 캐스트의 양을 최소화 할 수 있습니다. 해당 경로를 선택하는 경우 문자열 자체와 동일한 동작이므로 형식을 불변 유형으로 디자인해야합니다.

0

당신은 일을 더 "자연"하기 위해 암시 적 연산자를 사용할 수 있습니다

public class SuperString 
{ 
    public SuperString(string s) { S = s; } 

    public static implicit operator SuperString(string s) 
    { 
     return new SuperString(s); 
    } 

    public string S { get; private set; } 

    public bool IsNot() { return String.IsNullOrEmpty(S); } 
} 

[TestMethod] 
public void Test_SuperString() 
{ 
    SuperString ss = "wee"; 
    SuperString xx = ""; 
    if (xx.IsNot()) ss = "moo"; 
    System.Console.WriteLine(ss.S); 
}