Most popular

วันจันทร์ที่ 1 สิงหาคม พ.ศ. 2554

C# Generic Method เพิ่มความยืดหยุ่น แทนการทำ Overload

การเขียน Code แบบใหม่ๆที่นำเสนอในการเขียน C# หรือ Java นั้น จะเน้นไปที่ความยืดหยุ่นเพื่อให้รองรับงานใหญ่ๆระดับ Enterprise ซึ่งอาจจะมีการพัฒนาที่ยาวนาน และมีการเขียน Base class ไว้เพื่อใช้งานมากมาย มี method ในการทำงานจำนวนมาก ในระดับ method ยังไม่นับรวมพวกที่ทำการ Overload เพื่อให้รองรับการพัฒนาในแบบต่อยอด ซึ่งจะทำให้มีจำนวน method มหาศาล

การสร้าง Generic Method เป็นอีกทางเลื่อกนึงที่ถูกนำเสนอออกมา เพราะเป็นการทำให้ method ยืดหยุ่นมากกว่าที่เคยเป็นมา และไม่ต้องทำการ Overload เพิ่มมากมาย ในเวลาที่ต้องการเปลี่ยนชนิดของค่า เหมือนในภาษาสมัยก่อน จึงมีความยืดหยุ่นและลดความซ้ำซ้อนได้มาก

Generic method สร้างขึ้นไม่ยาก ผู้เขียนจะสร้าง method ง่ายๆเพื่อดูการทำงาน
ผู้เขียนสร้าง Generic method ง่ายๆเพื่อให้แสดงค่าเป็นข้อความออกมา แต่ให้สังเกตุที่ค่า Parameter ที่ส่งเข้ามาใน method

        //สร้าง Generic method ที่มีการ return ค่าเป็น string
        //การระบุ Type ของ Parameter จะขึ้นอยู่กับการกำหนดค่า T และ X
        private string showMess<T,X>(T age,X display)
        {
            string res = null;

            //เก็บค่า Type ของ X
            Type X_is = typeof(X);
            //ตรวจสอบ Type ของ X ว่าเป็น string หรือไม่
            if (X_is == typeof(string))
                //ถ้าเป็น string ให้คืนค่าเป็นข้อความ
                res= Convert.ToString(display+age.ToString());
            else 
                //หากเเป็น Type อื่นๆ ให้แปลงเป็น int แล้วนำมาบวกกัน
                res= Convert.ToString(Convert.ToInt32(display)+Convert.ToInt32(age));

            return res;
        }

การทดสอบนั้น ผู้เขียนได้ใช้ Generic method "showMess" ให้แสดง MessageBox ขึ้นมาเพื่อดูผลของค่าที่ return ออกมา

        public Form1()
        {
            InitializeComponent();
            MessageBox.Show(showMess<int, string>(22,"ข้าพเจ้ามีอายุ : "));
            MessageBox.Show(showMess<double, string>(.357, "คุณพ่อมีปืนขนาด : "));
            MessageBox.Show(showMess<int, int>(2011, 543));
            MessageBox.Show(showMess<int, double>(2011, 1.00));
        }

ผลการทำงาน

  

ไม่มีความคิดเห็น:

แสดงความคิดเห็น