Шаблон дизайна:Анализ похожих, но разных схем в текстовых файлах

StackOverflow https://stackoverflow.com/questions/334388

Вопрос

Заранее спасибо за вашу помощь.Мне интересно, есть ли шаблон (дизайна), который можно применить к этой проблеме.

Я хочу анализировать, обрабатывать и извлекать значения из текстовых файлов похожих, но разных форматов.

В частности, я создаю механизм обработки, который принимает файлы истории рук в онлайн-покере с множества различных веб-сайтов и анализирует определенные поля данных (номер руки, дата и время, игроки).Мне нужно, чтобы логика анализа файлов была немного разной для каждого формата, но обработка извлеченных значений будет одинаковой.

Моей первой мыслью было бы создать всего один класс, который принимает «схему» для каждого типа файлов и соответственно анализирует/обрабатывает.Я уверен, что есть лучшее решение.

Спасибо!

Бонусный балл:Любые конкретные подсказки по реализации на C#.

Это было полезно?

Решение

Это похоже на кандидата на роль паттерна «Стратегия».Пример на C# можно найти здесь и еще один здесь.Краткое описание доступно на Википедия.

Более полное описание доступно в книге автора Фаулер и Кериевский.

Его также можно найти в книге GoF.

Другие советы

Шаблон «Поставщик» — это тот, который вы ищете...это то, что используется в ADO.Net.У каждого поставщика базы данных есть отдельный «Поставщик» данных, который «знает», как читать данные из продукта конкретного поставщика БД, но доставляет их в стандартном формате (интерфейс) последующим системам...Вы напишете небольшой компонент «Поставщик» (достаточно одного класса), который «знает» формат для каждого из различных поставщиков данных истории покера на вашем веб-сайте и предоставляет эти данные точно таким же образом вышестоящей системе, которая их читает. ..

Похоже, вам нужен шаблон «Стратегия», который позволяет реализовать алгоритм несколькими различными способами:

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