2016-12-20 4 views
0

내가 작업하고있는 것에 좋은 디자인을 찾으려고합니다. 예를 들어 TextProcessor 문자열 매개 변수를 허용하고 처리 된 문자열을 돌려주는 클래스를 생각해보십시오.적용 가능한 인터페이스 구현 얻기

내 구현에는 서로 다른 많은 수의 TextProcessors이 있으며, 각각 고유 한 정의 된 문자열 집합을 처리 할 수 ​​있습니다.

bool CanProcess(string text); 

string Process(string text); 

이러한 정적로하지만 난 그들을 설정 아니에요 공통 인터페이스를 구현을 위해 표시 할 수 있습니다 실제로 각 프로세서에 두 개의 주목할만한 방법이 있습니다 공전.

이 외에도 TextProcessors에는 TextProcessorFinder 클래스가 있습니다. 이름에서 알 수 있듯이 TextProcessor을 찾고 입력을 처리합니다.

public static class TextProcessorFinder 
{ 
    private static List<ITextProcessor> _processors; 

    static TextProcessorFinder() 
    { 
     _processors = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(t => t.GetInterfaces().Contains(typeof(ITextProcessor)) 
      && t.IsClass && !t.IsAbstract) 
      .Select(t => (ITextProcessor)Activator.CreateInstance(t)) 
      .Where(t => t.IsActive) 
      .ToList(); 
    } 

    public static ITextProcessor GetTextProcessor(string text) 
    { 
     return _processors.Where(p => p.CanProcess(text)) 
      .OrderByDescending(p => p.Priority) 
      .FirstOrDefault(); 
    } 
} 

은 내가이 접근 방식에 대해 미워하는 것은 내가 그들의 CanProcess 함수를 호출하는 모든 알려진 TextProcessor의 인스턴스를 생성해야한다는 것입니다. 나는 CanProcess 기능을 에뮬레이트하는 간단한 Func을 가지는 속성을 만드는 시도

:

[AttributeUsage(AttributeTargets.Class)] 
public class TextProcessorAttribute : Attribute 
{ 
    private Func<string, bool> func; 

    public TextProcessorAttribute(Func<string, bool> func) 
    { 
     this.func = func; 
    } 
} 

public interface ITextProcessor 
{ 
    bool IsActive { get; } 

    int Priority { get; } 

    bool CanProcess(string text); 

    string Process(string text); 
} 

// Hard-coded to true 
[TextProcessor((s) => { return true; })] 
public class SampleTextProcessor : ITextProcessor 
{ 
    // Implement ITextProcessor 
} 

는 슬프게도하지만, Func을 유효한 속성 매개 변수 유형이 아닙니다.

가장 좋은 방법은 무엇입니까?

답변

3

제 생각에는 이러한 인스턴스를 만드는 것이 가장 좋은 방법입니다. 실제로 그렇게하지 않을 이유가 없습니다. 인스턴스가 싸다. 생성자에서 어떤 작업도하지 않는다면 인스턴스를 만드는 것이 저렴하다. 어쨌든해서는 안된다.

+0

나는 이것이 작동하는 것 같아요.하지만 그들은 정말 싸구려 그러나 정적 (인터페이스 구현 제외) 될 수있는 방법에 대한 인스턴스의 무리를 만드는 방법에 대해 뭔가 나를 싫증이 있습니다. –

+0

@ZuiqPazu : 그것은 당신을 싫증나게 할 필요가 없습니다. –

0

CanProcess 메서드를 사용하면 텍스트를 처리 할 수있는 경우 파생 된 각 ITextProcessor에게 요청할 수 있습니다. 제 생각에는 괜찮습니다. 어쩌면 ITextProcessor의 구현에 일종의 특수화가있을 수 있습니다.이 경우 더 구체적인 인터페이스 인 ITextTypeAProcessor, ITextTypeBProcessor 등을 만들 수 있습니다. 그런 다음 GetTextProcessor 메서드에서 인터페이스별로 필터링 할 수 있습니다.

+0

나는 당신이 이것으로 어디로 가고 있는지 보았다. 그러나 지금은 필터링 할 세부 사항이 없습니다. –