Domanda

grazie in anticipo per il vostro aiuto. Mi chiedo se esiste un modello (di progettazione) che può essere applicato a questo problema.

Sto cercando di analizzare, elaborare ed estrarre valori da file di testo con formati simili, ma diversi.

Più specificamente, sto costruendo un motore di elaborazione che accetta i file della cronologia delle mani di poker online da una moltitudine di siti Web diversi e analizza campi di dati specifici (N. lancetta, DateTime, Giocatori). Avrò bisogno che la logica per analizzare i file sia leggermente diversa per ciascun formato, ma l'elaborazione dei valori estratti sarà la stessa.

Il mio primo pensiero sarebbe quello di creare solo 1 classe che accetta uno "schema" per ogni tipo di file e analisi / processi di conseguenza. Sono sicuro che esiste una soluzione migliore a questo.

Grazie!

Punto bonus: Eventuali suggerimenti di implementazione specifici in C #.

È stato utile?

Soluzione

Sembra un candidato per il modello di strategia. Un esempio in C # è disponibile qui e un altro qui . Una breve descrizione è disponibile su Wikipedia .

Descrizioni più complete sono disponibili nel libro di Fowler e Kerievsky .

È disponibile anche dal libro GoF.

Altri suggerimenti

Il " Provider " pattern è quello che stai cercando ... è ciò che viene utilizzato in ADO.Net. Ogni fornitore di database ha un dato separato "Provider" che "conosce" come leggere i dati dal suo specifico prodotto di fornitori di DB, ma consegnarli in un formato standard (interfaccia) ai sistemi a valle ... Scriverai un piccolo "fornitore" componente (sarà sufficiente una sola classe) che "conosce" il formato per ciascuno dei diversi provider di dati sulla cronologia del poker del tuo sito Web ed espone i dati esattamente allo stesso modo al sistema upstream che li legge ...

Sembra che tu abbia bisogno del modello di strategia, che ti consente di implementare un algoritmo in diversi modi:

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

Per prima cosa, crea la tua " Storia della mano di poker online " modello . Questo modello rappresenterà i dati e sarà in grado di elaborare questi dati indipendentemente dalla fonte. Quindi crea provider per ciascuno dei diversi formati di origine che devono essere in grado di convertire le informazioni del file nel modello.

EDIT: ad esempio

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

Puoi anche prendere in considerazione l'uso del Pattern di comando in cui avresti un'azione per raggiungere il tempo del tipo di file che devi elaborare. In questo modo puoi avere la flessibilità per tutti i formati e aderire ai parametri coerenti che il tuo processo richiederà.

Un altro vantaggio è che puoi creare nuove azioni per ogni nuovo formato di file senza refactoring del codice per gli altri formati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top