字串陣列解析小品集 (3) 萃取抽象法

這篇討論萃取一個抽象型別完成字串陣列解析為強型別物件的方式,本篇採用介面。

這一篇採用萃取抽象的方式來建立一個公開的轉換行為,這個行為由一個共通的 Interface 來公開;程式碼和上一篇很類似,只是不採用建構子方式。這個方式就有點像一些基本型別,如 System.Int32 實作 IComparable<T> 那種感覺,型別藉由  IComparable<T> 介面公開自己的預設比較行為。

首先,我們萃取出一個抽象行為,為此建立一個介面,就叫它 IParser 吧。

    public interface IParser
    {
        void Parse(string[] items);
    }

接著修改兩個基本資料型別,讓他們都實作 IParser
 

public class DataForTextFile1 : IParser
    {
        public DataForTextFile1()
        { }

        public int Index { get; set; }

        public string English { get; set; }

        public string Chinese { get; set; }

        public void Parse(string[] items)
        {
            if (items == null)
            { throw new ArgumentNullException(); }
            if (items.Count() < 3)
            { throw new ArgumentException(); }

            Index = int.Parse(items[0]);
            English = items[1];
            Chinese = items[2];
        }
    }

    public class DataForTextFile2 : IParser
    {
        public DataForTextFile2()
        { }
      
        public int Index { get; set; }

        public string Person { get; set; }

        public DayOfWeek WeekDay { get; set; }

        public string Activity { get; set; }

        public void Parse(string[] items)
        {
            if (items == null)
            { throw new ArgumentNullException(); }
            if (items.Count() < 4)
            { throw new ArgumentException(); }

            Index = int.Parse(items[0]);
            Person = items[1];
            WeekDay = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), items[2]);
            Activity = items[3];
        }
    }

實作內容其實和前一篇使用建構子差不多,只是在建構子部分我保留了如果傳入 null 就當作沒這回事的行為,這邊的實作則是傳入 null 就發出 ArgumentNullException。

最後 Console 程式當然不可免,和前一篇有一點不太一樣。

   class Program
    {
        static void Main(string[] args)
        {
            ProcessTextFile1();
            Console.WriteLine();
            Console.WriteLine("**********************************");
            Console.WriteLine();
            ProcessTextFile2();
            Console.ReadLine();
        }

        static void ProcessTextFile1()
        {
            var lines = File.ReadAllLines("TextFile1.txt");
            List<DataForTextFile1> list = new List<DataForTextFile1>();
            foreach (var line in lines)
            {
                string[] items = line.Split(',');
                if (items != null)
                {
                    var obj = new DataForTextFile1();
                    Parse(obj, items);
                    list.Add(obj);
                }
            }

            // 顯示結果
            foreach (var item in list)
            {
                Console.WriteLine(item.Index.ToString());
                Console.WriteLine(item.English);
                Console.WriteLine(item.Chinese);
                Console.WriteLine("---------------------");
            }
        }

        

        static void ProcessTextFile2()
        {
            var lines = File.ReadAllLines("TextFile2.txt");
            List<DataForTextFile2> list = new List<DataForTextFile2>();
            foreach (var line in lines)
            {
                string[] items = line.Split(',');
                if (items != null)
                {
                    var obj = new DataForTextFile2();
                    Parse(obj,items);
                    list.Add(obj);
                }
            }

            // 顯示結果
            foreach (var item in list)
            {
                Console.WriteLine(item.Index.ToString());
                Console.WriteLine(item.Person);
                Console.WriteLine(item.WeekDay);
                Console.WriteLine(item.Activity);
                Console.WriteLine("---------------------");
            }
        }

        static void Parse(IParser value, string[] items)
        {
            value.Parse(items);
        }
    }