문제

귀하의 도움에 미리 감사드립니다.이 문제에 적용할 수 있는 (디자인) 패턴이 있는지 궁금합니다.

유사하지만 형식이 다른 텍스트 파일에서 값을 구문 분석하고 처리하고 추출하려고 합니다.

보다 구체적으로, 저는 다양한 웹사이트에서 온라인 포커 핸드 기록 파일을 받아들이고 특정 데이터 필드(핸드 번호, 날짜 시간, 플레이어)를 구문 분석하는 처리 엔진을 구축하고 있습니다.각 형식마다 약간씩 다르게 파일을 구문 분석하는 논리가 필요하지만 추출된 값의 처리는 동일합니다.

내 첫 번째 생각은 각 파일 유형에 대한 "스키마"를 허용하고 그에 따라 구문 분석/처리하는 클래스를 하나만 만드는 것입니다.나는 이것에 대한 더 나은 해결책이 있다고 확신합니다.

감사해요!

보너스 포인트:C#의 특정 구현 힌트.

도움이 되었습니까?

해결책

이것은 전략 패턴의 후보처럼 들립니다. C#의 예를 찾을 수 있습니다 여기 그리고 또 하나 여기. 간단한 설명이 가능합니다 위키 백과.

더 완전한 설명은 책에서 제공됩니다 파울러 그리고 Kerievsky.

GOF 책에서도 제공됩니다.

다른 팁

"제공자"패턴은 당신이 찾고있는 패턴입니다 ... ado.net에서 사용되는 것입니다. 각 데이터베이스 공급 업체는 특정 DB 공급 업체 제품에서 데이터를 읽는 방법을 "알고 있지만 표준 형식 (인터페이스)으로 다운 스트림 시스템으로 전달하는 별도의 데이터"제공자 "가 있습니다. 소규모"제공자 "를 작성합니다. 다른 웹 사이트 포커 이력 데이터 제공 업체의 형식을 "알고"하는 구성 요소 (단일 클래스는 충분합니다). 해당 데이터를 해당 데이터를이를 읽는 업스트림 시스템에 정확히 동일한 방식으로 노출시킵니다.

전략 패턴이 필요한 것처럼 들리므로 여러 가지 방법으로 알고리즘을 구현할 수 있습니다.

http://en.wikipedia.org/wiki/strategy_pattern

먼저, "온라인 포커 핸드 기록"을 만드세요. 모델.이 모델은 데이터를 나타내며 소스와 독립적으로 이 데이터를 처리할 수 있습니다.그런 다음 생성 공급자 파일 정보를 모델로 변환할 수 있어야 하는 다양한 소스 형식 각각에 대해.

편집하다:예를 들어

public interface IDataProvider
{
    IOnlinePokerInfo ParseFileInformation(FileInfo input);
}

public interface IOnlinePokerInfo
{
    int Hand { get; set; }
    DateTime DateInfo { get; set; }
    List<IPlayer> Players { get; set; }
    void ProcessInformation();
}

public interface IPlayer
{
    string Name { get; set; }
}

public class MyOnlinePokerInfo : IOnlinePokerInfo
{
    private int hand;
    private DateTime date;
    private List<IPlayer> players;

    public int Hand { get { return hand; } set { hand = value; } }
    public DateTime DateInfo { get { return date; } set { date = value; } }
    public List<IPlayer> Players { get { return players; } set { players = value; } }

    public MyOnlinePokerInfo(int hand, DateTime date)
    {
        this.hand = hand;
        this.date = date;
        players = new List<IPlayer>();
    }

    public MyOnlinePokerInfo(int hand, DateTime date, List<IPlayer> players)
        : this(hand, date)
    {
        this.players = players;
    }

    public void AddPlayer(IPlayer player)
    {
        players.Add(player);
    }

    public void ProcessInformation()
    {
        Console.WriteLine(ToString());
    }

    public override string ToString()
    {
        StringBuilder info = new StringBuilder("Hand #: " + hand + " Date: " + date.ToLongDateString());
        info.Append("\nPlayers:");
        foreach (var s in players)
        {
            info.Append("\n"); 
            info.Append(s.Name);
        }
        return info.ToString();
    }
}

public class MySampleProvider1 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(1, DateTime.Now);
        IPlayer p = new MyPlayer("me");
        info.AddPlayer(p);
        return info;
    }
}

public class MySampleProvider2 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(2, DateTime.Now);
        IPlayer p = new MyPlayer("you");
        info.AddPlayer(p);
        return info;
    }
}

public class MyPlayer : IPlayer
{
    private string name;
    public string Name { get { return name; } set { name = value; } }

    public MyPlayer(string name)
    {
        this.name = name;
    }
}

public class OnlinePokerInfoManager
{
    static void Main(string[] args)
    {
        List<IOnlinePokerInfo> infos = new List<IOnlinePokerInfo>();

        MySampleProvider1 prov1 = new MySampleProvider1();
        infos.Add(prov1.ParseFileInformation(new FileInfo(@"c:\file1.txt")));

        MySampleProvider2 prov2 = new MySampleProvider2();
        infos.Add(prov2.ParseFileInformation(new FileInfo(@"c:\file2.log")));

        foreach (var m in infos)
        {
            m.ProcessInformation();
        }
    }
}

당신은 또한 사용을 고려할 수 있습니다 명령 패턴 처리해야 할 파일 유형의 도달 시간에 대한 작업이있는 경우 처리해야합니다. 이렇게하면 모든 형식에 대한 유연성을 가질 수 있으며 프로세스에 필요한 일관된 매개 변수를 준수 할 수 있습니다.

또 다른 이점은 다른 형식의 코드를 리팩토링하지 않고 각 새 파일 형식에 대한 새 조치를 만들 수 있다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top