คลาสนี้ใครๆก็รัก เข้ามาหาไม่หยุดหย่อน แล้วจะประกาศที่ไหนดีละ โอ้แม่คุณ Static Class

หลังจากอ่านหัวข้อ Entry นี้แล้ว คิดว่าหลายๆคนคงสงสัยว่า ผู้เขียนเป็นอะไรกันแน่ ขอบอกเลยว่าไม่ได้เป็นอะไร แต่เนื้อหาตอนนี้มันให้ความรู้สึกอลวน ประดั่งชื่อเรื่องเสียจริง
 
คงมีหลายๆครั้ง ที่เราเขียนโปรแกรมขึ้นมา โดยมีการเขียนแบ่งออกเป็นหลายฟอร์ม ซึ่งมันก็เป็นเรื่องปกติอยู่แล้ว เราทุกคนทำกันได้ดี แต่บางครั้ง เราอาจมีการเขียนโค้ดในลักษณะที่ให้หลายๆฟอร์มของเรา เข้าถึงข้อมูลตัวเดียวกัน ซึ่งหากมีการรับส่งกันของข้อมูลระหว่างกันไม่กี่ฟอร์ม ก็คงเป็นเรื่องง่ายที่เราจะเขียนเมธอดขึ้นมาจัดการ แต่หากทั้ง 20 30 ฟอร์มของเรา เกิดต้องมีการเข้าถึงข้อมูลตัวเดียวกันขึ้นมาละ จะทำอย่างไร
 

ถ้าจะมองให้เห็นภาพ ก็จะลองยกตัวอย่างนึงขึ้นมาง่ายๆ สมมุติว่า เรามีโปรแกรมจัดการห้องเรียน โดยแบ่งออกเป็น 3 ฟอร์ม ก็คือ 1. ฟอร์มแสดงรายชื่อนักเรียน 2. ฟอร์มแสดงโต๊ะเรียน และ 3. ฟอร์มแสดงตารางสอนของห้อง ซึ่งก็เหมือนจะไม่มีอะไรยาก แค่สร้าง Class ของห้องเรียน Class ต่างๆที่จำเป็นต้องใช้ แล้วนำมาใช้ร่วมกันเท่านั้นเอง
 
    internal class ClassRoom
    {
        private List<Student> studentList = newList<Student>();
        internal List<Point> deskPositionList = newList<Point>();
        internal voidAddStudent(Student student)
        {
            studentList.Add(student);
        }
        internal voidAddRangeStudent(IEnumerable<Student> students)
        {
            studentList.AddRange(students);
        }
    }
    internal class Student
    {
        public string name = “unnamed”;
        public Student(stringname)
        {
            this.name = name;
        }
        public Student()
        {
        }
    }
หลังจากที่เราทำการโค้ดมาเรื่อยๆ พอจะเริ่มเอา Class ห้องเรียนมาใช้ นั่นแหละ เราก็จะพบกับปัญหาทันใด!!
ปัญหาที่ว่าก็คือ เราไม่มีที่สำหรับการประกาศตัวแปรของ Class ClassRoom
พูดง่ายๆก็คือ เนื่องจาก Class ClassRoom นั้น จำเป็นต้องเรียกผ่านทั้ง 3 ฟอร์ม ซึ่งในแต่ละฟอร์ม ก็จะถือว่าเป็นคนละ Class กัน ทำให้เราไม่สามารถทำการประกาศตัวแปร ClassRoom ไว้ใน Class ใด Class หนึ่งได้ หรือหากเราต้องการจะเก็บ ClassRoom ไว้ใน Class ใดๆจริงๆ เราก็จะเป็นต้องทำการส่งตัวแปรไปให้ทุกฟอร์ม แต่ก็เป็นเรื่องที่ซับซ้อน และจะมีปัญหาต่างๆตามมาอีกมากมาย
 
แล้วทำไม เราถึงไม่ทำพื้นที่สาธารณะที่หนึ่งไว้ เพื่อที่จะให้เราสามารถสร้างตัวแปรของ Class ที่เราต้องการเข้าถึงแบบสาธารณะมาเก็บไว้ในนี้ และใช้เป็นตัวกลางในการแลกเปลี่ยนข้อมูลระหว่างแต่ละฟอร์มของเราด้วย ฟังดูเป็นแนวคิดที่ดี ซึ่งแนวความคิดนี้ ก็คือแนวคิดของ Static Class(C#, JAVA) หรือ Module(VB.NET) นั่นเอง
ว่าแล้ว เราก็มาสร้างพื้นที่สาธารณะของเรากันเลยดีกว่า
 
    internal sealed static class InternalPublicZone
    {
        internal static ClassRoom classRoom = newClassRoom();
    }
จากโค้ดข้างต้น เป็นการประกาศพื้นที่สาธารณะ ชื่อว่า InternalPublicZoneโดยมีการประกาศ ClassRoomเข้าไปและทำการกำหนดค่าเริ่มต้นให้แล้ว ทำให้เราสามารถเรียกใช้ตัวแปร classRoomจากที่ใดก็ได้ในโปรแกรม
    public Form1()
    {
        InitializeComponent();
        InternalPublicZone.classRoom.AddStudent(new Student());
    }
    public Form2()
    {
        InitializeComponent();
        InternalPublicZone.classRoom.AddStudent(new Student());
    }
    public Form3()
    {
        InitializeComponent();
        InternalPublicZone.classRoom.AddStudent(new Student());
    }
นอกจากนี้ เรายังสามารถกำหนดค่าเริ่มต้นของ classRoom ได้ตั้งแต่ใน InternalPublicZoneผ่าน Static Constructor ได้เช่นกัน ดังนี้
 
    internal sealed static class InternalPublicZone
    {
        internal static ClassRoom classRoom = newClassRoom();
        //Initialize Here
        static InternalPublicZone()
        {
            classRoom.AddRangeStudent( new Student [] {
                new Student() {name = “Somchai”},
                new Student() {name = “Somying”}
            });
        }
    }
จะเห็นได้ว่า การทำพื้นที่สาธารณะ หรือที่เรียกว่า Static Class นั้น มีประโยชน์มาก โดยเฉพาะเมื่อมีหลายๆคลาสต้องการที่จะเข้าถึงตัวแปรตัวเดียวกัน ซึ่งเราอาจนำไปประยุกต์กับโปรแกรมประเภทเชื่อมต่อ Database ผ่าน OleDb ก็ได้ เพราะโปรแกรมประเภทนี้ มักจะใช้ OleDbConnection เพียงตัวเดียว หรือโปรแกรมประเภทอื่น ก็ต้องมีการใช้งานลักษณะนี้มากมาย
 
สุดท้ายนี้ ขอให้บทความนี้เป็นประโยชน์ และขอบคุณทุกคนที่พยายามอ่านมาถึงตรงนี้ พบกันใหม่ครั้งต่อไป

Leave a Reply

Your email address will not be published. Required fields are marked *