8

よろしくお願いします。この問題に適用できる(設計)パターンがあるかどうか疑問に思っています。

類似しているが異なる形式のテキスト ファイルから値を解析、処理、および抽出しようとしています。

より具体的には、多数の異なる Web サイトからオンライン ポーカー ハンド履歴ファイルを受け取り、特定のデータ フィールド (ハンド #、DateTime、プレーヤー) を解析する処理エンジンを構築しています。ファイルを解析するロジックがフォーマットごとに若干異なるようにする必要がありますが、抽出された値の処理は同じです。

私の最初の考えは、ファイルの種類ごとに「スキーマ」を受け入れ、それに応じて解析/処理するクラスを1つだけ作成することです。これにはもっと良い解決策があると確信しています。

ありがとう!

ボーナス ポイント: C# での特定の実装のヒント。

4

5 に答える 5

6

これは、戦略パターンの候補のように思えます。C# の例はここにあり、別の例はここにあります。ウィキペディアに簡単な説明があります。

より完全な説明は、FowlerKerievskyによる書籍で入手できます。

GoF ブックからも入手できます。

于 2008-12-02T16:01:08.863 に答える
2

「プロバイダ」パターンはあなたが探しているものです...それはADO.Netで使用されているものです。各データベースベンダーには、特定のDBベンダー製品からデータを読み取る方法を「知っている」個別のデータ「プロバイダー」がありますが、標準形式(インターフェース)でダウンストリームシステムに配信します...小さな「プロバイダー」を記述しますコンポーネント (単一のクラスで十分です) は、さまざまな Web サイトのポーカー履歴データ プロバイダーのそれぞれの形式を「認識」し、それを読み取る上流システムにまったく同じ方法でそのデータを公開します...

于 2008-12-02T15:56:31.807 に答える
1

まず、「オンライン ポーカー ハンド履歴」モデルを作成します。このモデルはデータを表し、このデータをソースから独立して処理できます。次に、ファイルの情報をモデルに変換できる必要があるさまざまなソース形式ごとにプロバイダーを作成します。

編集:例えば

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();
        }
    }
}
于 2008-12-02T15:59:42.923 に答える
1

さまざまな方法でアルゴリズムを実装できる Strategy パターンが必要なようです。

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

于 2008-12-02T16:02:54.803 に答える
1

処理する必要があるファイル タイプの到達時間のアクションがあるコマンド パターンの使用を検討することもできます。このようにして、すべてのフォーマットに柔軟に対応し、プロセスに必要な一貫したパラメーターを順守することができます。

もう 1 つの利点は、他の形式のコードをリファクタリングすることなく、新しいファイル形式ごとに新しいアクションを作成できることです。

于 2008-12-04T01:39:09.057 に答える