Pergunta

Agradecemos antecipadamente a sua ajuda. Eu estou querendo saber se existe um padrão (design) que pode ser aplicado a este problema.

Eu estou olhando para analisar, processar e extrair valores de arquivos de texto com semelhante, mas diferentes formatos.

Mais especificamente, eu estou construindo um mecanismo de processamento que aceita arquivos de Poker Online História Mão de uma multiplicidade de diferentes sites e analisa os campos de dados específico (mão #, DATETIME Jogadores). Vou precisar a lógica para analisar os arquivos a ser ligeiramente diferente para cada formato, mas o processamento dos valores extraídos será o mesmo.

Meu primeiro pensamento seria a criação de apenas 1 classe que aceita um "esquema" para cada tipo de arquivo e analisa / processa em conformidade. Estou certo de que há uma solução melhor para isso.

Obrigado!

Bonus Point: Alguma dica específico de execução em C #.

Foi útil?

Solução

Isso soa como um candidato para o padrão Strategy. Um exemplo em C # pode ser encontrada aqui e outra aqui . Uma breve descrição está disponível em Wikipedia .

A Descrição completa está disponível em livro de Fowler e Kerievsky .

Ele também está disponível a partir do livro GoF.

Outras dicas

O padrão de "Fornecedor" é o que você está procurando ... é o que é usado em ADO.Net. Cada fornecedor de banco de dados tem uma data "Provider" separado que "sabe" como ler os dados a partir dele é específico DB fornecedores de produtos, mas entrega-lo em um formato padrão (interface) para sistemas a jusante ... Você vai escrever um pequeno "Provedor" componente (a única classe será suficiente) que "sabe" o formato para cada um dos diferentes provedores de dados história website de poker, e expõe que os dados em exatamente da mesma forma para o sistema a montante que lê-lo ...

Parece que você precisa o padrão Strategy, que permite implementar um algoritmo em um número de maneiras diferentes:

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

Primeiro, crie o seu "Poker Online História Hand" modelo . Este modelo irá representar os dados e será capaz de processar esses dados de forma independente da fonte. Em seguida, criar provedores para cada um dos diferentes formatos de origem que deve ser capaz de converter as informações do arquivo para o modelo.

EDIT:. Por exemplo

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

Você também pode considerar usando o Comando Padrão onde você teria uma ação para o tempo de alcance do tipo de arquivo que você precisa para processo. Desta forma, você pode ter a flexibilidade para todos os formatos e siga os parâmetros consistentes de que o seu processo vai exigir.

Outra vantagem é que você pode criar novas ações para cada novo formato de arquivo sem refatoração do código para os outros formatos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top