نمط التصميم:تحليل مماثل ولكن الاختلاف المخططات في ملفات نصية

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

سؤال

شكرا مقدما على مساعدتكم.وأنا أتساءل عما إذا كان هناك (تصميم) نمط التي يمكن تطبيقها على هذه المشكلة.

أنا أتطلع إلى تحليل ، عملية استخراج القيم من ملفات نصية مماثلة ، ولكن اختلاف الأشكال.

وبشكل أكثر تحديدا, أنا بناء على تجهيز المحرك الذي يقبل على الانترنت لعبة البوكر ناحية التاريخ الملفات من العديد من المواقع المختلفة و يوزع محددة حقول البيانات (اليد #, التاريخ والوقت, لاعبين).وسوف تحتاج إلى منطق تحليل ملفات مختلفة قليلا عن كل شكل ، لكن معالجة استخراج القيم سوف تكون هي نفسها.

فكرتي الأولى أن تخلق فقط 1 الفئة التي تقبل "مخطط" لكل نوع الملف ويوزع/العمليات وفقا لذلك.أنا متأكد من أن هناك حل أفضل من هذا.

وذلك بفضل!

نقطة مكافأة: أي تنفيذ محددة تلميحات في C#.

هل كانت مفيدة؟

المحلول

هذا يبدو وكأنه مرشح نمط استراتيجية.على سبيل المثال في C# يمكن العثور عليها هنا و واحد آخر هنا.وصف موجز متاح على ويكيبيديا.

أكمل الأوصاف هو متاح في كتاب فاولر و Kerievsky.

بل هو أيضا المتاحة من صندوق القناص الكتاب.

نصائح أخرى

"المورد" النمط هو واحد كنت تبحث عنه...وهو ما يستخدم في ADO.Net.لكل قاعدة بيانات البائعين لديها بيانات منفصلة "مقدم" أن "يعرف" كيفية قراءة البيانات من انها محددة DB البائعين المنتج ، ولكن تقدم في شكل موحد (واجهة) إلى المصب نظم...سوف أكتب صغيرة "مزود" مكون (صنف واحد يكفي) أن "يعرف" تنسيق كل من موقع مختلف البوكر التاريخ مقدمي البيانات ، يعرض البيانات في بالضبط بنفس الطريقة إلى المنبع النظام أن يقرأ عليه...

يبدو أنك في حاجة إلى استراتيجية النمط الذي يسمح لك لتنفيذ الخوارزمية في عدد من الطرق المختلفة:

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