Question

merci d'avance pour votre aide. Je me demande s’il existe un modèle (de conception) qui peut être appliqué à ce problème.

Je cherche à analyser, traiter et extraire des valeurs de fichiers texte avec des formats similaires, mais différents.

Plus précisément, je construis un moteur de traitement qui accepte les fichiers d’historique de main de poker en ligne provenant d’une multitude de sites Web et analyse des champs de données spécifiques (Main #, DateTime, Joueurs). Il me faudra la logique pour analyser les fichiers légèrement différents pour chaque format, mais le traitement des valeurs extraites sera le même.

Ma première idée serait de créer une seule classe qui accepte un "schéma". pour chaque type de fichier et analyse / traite en conséquence. Je suis sûr qu'il existe une meilleure solution à ce problème.

Merci!

Point bonus: Toute indication d'implémentation spécifique en C #.

Était-ce utile?

La solution

Cela ressemble à un candidat pour le modèle de stratégie. Un exemple en C # peut être trouvé ici et un autre ici . Une brève description est disponible sur Wikipedia .

Des descriptions plus complètes sont disponibles dans le livre de Fowler et Kerievsky .

Il est également disponible dans le livre GoF.

Autres conseils

Le "fournisseur" " le motif correspond à celui que vous recherchez ... c’est ce qui est utilisé dans ADO.Net. Chaque fournisseur de base de données dispose de données distinctes "Fournisseur". que " sait " comment lire les données de son produit spécifique des fournisseurs de bases de données, tout en les transmettant dans un format standard (interface) aux systèmes en aval ... Vous écrirez un petit "Fournisseur" composant (une seule classe suffira) que " sait " le format de chacun des fournisseurs de données d'historique de poker de votre site Web et les expose exactement de la même manière au système en amont qui les lit ...

On dirait que vous avez besoin du modèle de stratégie, qui vous permet d'implémenter un algorithme de différentes façons:

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

Créez d’abord votre "Historique des mains de poker en ligne". modèle . Ce modèle représentera les données et pourra traiter ces données indépendamment de la source. Créez ensuite des fournisseurs pour chacun des différents formats source devant pouvoir convertir les informations du fichier dans le modèle.

EDIT: par exemple

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

Vous pouvez également envisager d'utiliser le Modèle de commande pour lequel vous auriez une action pour atteindre le temps imparti. du type de fichier que vous devez traiter. De cette façon, vous pouvez avoir la flexibilité pour tous les formats et adhérer aux paramètres cohérents requis par votre processus.

Un autre avantage est que vous pouvez créer de nouvelles actions pour chaque nouveau format de fichier sans refactoriser le code des autres formats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top