Frage

Vielen Dank im Voraus für Ihre Hilfe. Ich frage mich, ob es ein (Design) Muster, das auf dieses Problem angewandt werden kann.

Ich bin auf der Suche zu analysieren, zu verarbeiten und extrahieren Werte von Textdateien mit ähnlichem, aber unterschiedlichen Formaten.

Genauer gesagt, ich bin der Aufbau eine Verarbeitungsmaschine, die Online Poker Hand History-Dateien aus einer Vielzahl von verschiedenen Websites akzeptiert und bestimmte Datenfelder analysiert aus (Hand #, Datum- und Spieler). Ich werde die Logik benötigen, um die Dateien zu analysieren für jedes Format etwas unterschiedlich sein, aber die Verarbeitung der extrahierten Werte wird die gleiche sein.

Mein erster Gedanke wäre, nur 1 Klasse zu erstellen, die ein „Schema“ für jeden Dateityp akzeptiert und parst / Prozesse entsprechend. Ich bin sicher, dass es eine bessere Lösung ist.

Danke!

Bonuspunkt: Jede spezifische Implementierung Hinweise in C #.

War es hilfreich?

Lösung

Das klingt wie ein Kandidat für das Strategie-Muster. Ein Beispiel in C # hier und ein anderer hier . Eine kurze Beschreibung ist auf Wikipedia zur Verfügung.

Ausführlichere Beschreibungen ist in Buch verfügbar von Fowler und Kerievsky .

Es ist auch von dem GoF Buch zur Verfügung.

Andere Tipps

Das „Provider“ Muster ist derjenige, den Sie suchen ... es ist das, was in ADO.Net verwendet wird. Jeder Datenbankhersteller hat einen separaten Daten „Provider“, dass „weiß“, wie die Daten zu lesen aus es spezifische DB Produkt-Anbieter, sondern liefert sie in einem Standardformat (Schnittstelle) an nachgelagerte Systeme ... Sie werden ein kleines „Provider“ schreiben Komponente (eine einzige Klasse genügt), dass das Format für jede Ihrer anderen Website Pokergeschichte Datenanbieter „weiß“, und setzt diese Daten in genau der gleichen Art und Weise an das Upstream-System, das es liest ...

Klingt wie Sie die Strategie-Muster benötigen, die Ihnen einen Algorithmus in einer Reihe von verschiedenen Möglichkeiten zur Implementierung erlaubt:

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

Erstellen Sie zunächst Ihr "Online Poker Hand History" Modell . Dieses Modell wird die Daten darstellt und diese Daten in der Lage von der Quelle unabhängig zu verarbeiten. Erstellen Sie dann Anbieter für jede der unterschiedlichen Quellformate, die die Umwandlung der Information-Datei in das Modell in der Lage sein muss.

EDIT:. Z

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();
        }
    }
}

Sie könnten auch erwägen die Command-Muster , wo Sie würde eine Aktion für Erreichungszeit haben von Dateityp müssen Sie verarbeiten. Auf diese Weise können Sie die Flexibilität für all Formate und auf die konsistenten Parameter einhalten, die Ihr Prozess benötigen.

Ein weiterer Vorteil ist, dass Sie ohne Refactoring den Code für die anderen Formate neue Aktionen für jedes neues Dateiformat erstellen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top