ตอน 4 : Encapsulation

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย


เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

Encapsulation

ว่ากันว่านักเขียนโปรแกรมคนหนึ่งเมื่ออ่านตำรา OOP เห็นคำว่า encapsulation ก็ไม่เข้าใจและปวดหัว จึงหยิบยาแก้ปวดมารับประทาน ก่อนรับประทานได้อ่านที่ฉลาก เห็นเขียนกำกับว่าให้รับประทานครั้งละสองแคปซูล คือสองเม็ด ลองแกะแคปซูลออกดูก็เห็นมีผงยาขมอัดแน่นอยู่ เนื่องจากผู้ผลิตยาต้องการให้รับประทานได้โดยไม่ขม จึงทำเยลลาตินเป็นหลอดแคปซูลหุ้มผงยาไว้ นักเขียนโปรแกรมเห็นดังนั้นก็เข้าใจความหมายของ encapsulation และหายปวดหัวโดยไม่ต้องรับประทานยา เขาเข้าใจว่า encapsulation คือการผนึกโค้ดให้เป็นแคปซูลเหมือนแคปซูลยา เพื่อให้ผู้อื่นนำไปใช้ได้โดยง่าย

 

 

  ภาพ 112: แคปซูลยา

 

encapsulation (อ่านว่า เอ็นแคปซูเลชัน แปลว่า การบรรจุลงในแคปซูล) คือแนวคิดว่า object ควรแยกโค้ด “ส่วนเชื่อมต่อ” (interface) กับโค้ด “ส่วนประมวลผลและข้อมูล” (logic หรือ process และ data หรือ field) ออกจากกัน ข้อมูลและส่วนประมวลผลทั้งหมด ควรถูกซ่อนไว้เบื้องหลัง interface หากเราจัดให้มี interface ที่ดี และรักษาความคงเส้นคงวาของ interface ไว้ แม้เราจะเปลี่ยนโค้ดส่วนประมวลผลไปทั้งหมด โปรแกรมประยุกต์ก็ยังสามารถใช้งาน object ได้ตามปรกติ

ยกตัวอย่างเช่น ผู้เขียนสร้างคลาสชื่อ BCC ทำหน้าที่คำนวณผลรวมของข้อมูลเพื่อใช้ตรวจสอบความถูกต้องในการรับ-ส่งข้อมูลระหว่างคอมพิวเตอร์ ผู้นำคลาสนี้ไปใช้ไม่จำเป็นต้องรู้ว่า ผู้เขียนใช้วิธีหาค่า (algorithm) อย่างไร ผู้ใช้เพียงสร้าง object จากคลาสนี้ และส่งชุดข้อมูลให้มันๆ ก็จะส่งผลลัพธ์กลับมาให้ หากผู้เขียนปรับปรุง algorithm เพื่อให้คลาส BCC ทำงานมีประสิทธิภาพสูงขึ้น ผู้ใช้ก็ไม่จำเป็นต้องแก้ไขโค้ดแต่อย่างใด

บ่อยครั้งที่การสร้างซอฟท์แวร์ตามวิธี OOP จะได้ซอฟท์แวร์ที่ประกอบด้วย object จำนวนมาก object แต่ละตัวถูกสร้างจากคลาสซึ่งมีที่มาต่างๆ กัน เช่นมาจาก .NET Framework มาจากผู้เขียนเอง มาจากบุคคลที่สาม (third party) การทำให้ object แต่ละตัวเป็นอิสระต่อกันในขณะที่สามารถทำงานสอดคล้องกันได้เป็นอย่างดีจำเป็นต้องมีข้อตกลง หรือแนวทางที่ทุกฝ่ายใช้ร่วมกัน encapsulation คือแนวทางหลักอันหนึ่งที่ใช้ในการสร้างซอฟท์แวร์ตามวิธี OOP

 

ภาพ 113: ตัวอย่างคลาสจาก third party คลาสจัดการด้านเวลาสำหรับใช้งานใน .NET จากบริษัท Aspose ราคา 8,000 บาท

 

encapsulation เป็นจาร์กอนที่กินใจ และมันเป็นหนึ่งในสามจาร์กอนหลักของ OOP (อีกสองคำคือ Inheritance และ Polymorphism ที่ท่านจะได้เรียนต่อไป) คนส่วนใหญ่อ่านตำรา OOP ไม่เข้าใจเพราะไม่รู้คำจาร์กอน เหมือนท่านฟังแพทย์สองคนสนทนากันไม่รู้เรื่อง เพราะไม่เข้าใจคำจาร์กอนของแพทย์ หากท่านเข้าใจคำจาร์กอนของแพทย์ทุกคำ ท่านย่อมเข้าใจการสนทนานั้น วงการ OOP ก็เช่นเดียวกัน หากท่านเข้าใจคำจาร์กอน OOP ทุกคำ ท่านจะอ่านตำรา หรือบทความเกี่ยวกับ OOP เข้าใจได้ทั้งนั้น

ผู้เขียนขอยกตัวอย่างโค้ดสั้นๆ เพื่อสาทิตหลักการ encapsulation โปรดพิจารณาโค้ดต่อไปนี้

 

1 class CelsiusToFahrenheit
2 {
3      private double celsius;
4      public double Celsius
5      {
6            set { celsius = value; }
7       }
8       public double MakeFahrenhit()
9      {
10          return (celsius * 9 / 5) + 32;
11     }
12 }

 

นี่คือคลาสทำหน้าที่แปลงหน่วยวัดอุณหภูมิจากองศาเซลเซียสไปเป็นองศาฟาห์เรนไฮท์ คลาสนี้มีคุณลักษณ์ encapsulation อยู่สองประการคือ

  1. รวมส่วนข้อมูลและส่วนประมวลผลไว้เป็นก้อนเดียวกัน : บรรทัดที่ 3 คือส่วนที่เป็นข้อมูลของคลาส เราเรียกส่วนนี้ว่า data field (variable filed ก็ว่า) ทำหน้าที่เก็บข้อมูล ส่วนประมวลผลคือบรรทัดที่ 10 ซึ่งเป็นสูตรคณิตศาสตร์ง่ายๆ ทำหน้าที่แปลงค่าจากองศาเซลเซียสไปเป็นองศาฟาห์เรนไฮท์ การร่วมส่วนข้อมูลและส่วนประมวลผลไว้อย่างเบ็ดเสร็จเช่นนี้คือลักษณะอย่างหนึ่งของหลักการ encapsulation
  2. ใช้กลไก property เพื่อติดต่อกับโค้ดภายนอก : คลาสซึ่งทำหน้าที่เช่นนี้ท่านคงมองออกว่าอย่างน้อยต้องมีวิธีรับข้อมูลเป็นเซลเซียส และมีวิธีส่งข้อมูลผลลัพธ์ที่ได้จากแปลงหน่วยวัด หากเราสามารถกันไม่ให้โค้ดภายนอกเข้าถึงส่วนข้อมูลภายใน object ได้ คลาส CelsiusToFahrenheit ก็จะมีคุณสมบัติ encapsulation ผู้สร้างภาษ C# ให้ทางออกที่สง่างามด้วยการจัดให้มีกลไกชื่อ property ซึ่งในคลาสนี้คือบรรทัดที่ 4 ถึง 7 ทำให้ผู้ใช้คลาส CelsiusToFahrenheit สามารถส่งค่าองศาเซลเซียสไปให้ object ได้โดยไม่แตะต้องส่วน data field ของคลาสเลย

โค้ดสำหรับทดสอบคลาส CelsiusToFahrenheit เป็นดังนี้

 

1 static void Main(string[] args)
2 {
3      CelsiusToFahrenheit myCTOF = new CelsiusToFahrenheit();
4      myCTOF.Celsius = 37;
5      Console.WriteLine(myCTOF.MakeFahrenhit());
6      Console.ReadLine();
7 }

 

คำสั่งบรรทัดที่ 3 สร้าง object ชื่อ myCTOF จากคลาส CelsiusToFahrenheit บรรทัดที่ 4 ส่งค่า 37 ซึ่งเป็นองศาเซลเซียสที่ต้องการแปลงไปให้ myCTOF โดยการ set property ของมัน (เรื่องการ set property จะมีอธิบายโดยละเอียดในบทที่ 4) บรรทัดที่ 5 เรียก method MakeFahrenhit ซึ่งทำหน้าที่คำนวณการแปลงค่า ส่วน Cosole.WriteLine ทำหน้าที่ส่งผลลัพธ์ไปที่จอภาพ เมื่อวิ่งโปรแกรมนี้ผลลัพธ์ที่ปรากฏบนจอคือ

98.6

ในหนังสือเล่มนี้ท่านจะได้เรียนวิธีเขียนโค้ดด้วยหลักการ encapsulation อย่างละเอียดในหลายๆ บท เช่นบทที่ 7 ซึ่งสอนการสร้าง menu เป็นแบบ object ซึ่งใช้หลักการ encapsulation อย่างสมบูรณ์ เมื่อท่านอ่านและทำแบบฝึกหัดในบทนั้นท่านจะเข้าใจเรื่อง encapsulation ยิ่งขึ้น

ตอนต่อไป : Inheritance

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Pichet  On มกราคม 23, 2007 at 2:17 pm

    ดีมากเลยครับ
     
    ขอบคุณสำหรับความรู้

  • Suban  On มกราคม 26, 2007 at 6:52 pm

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

  • phasook  On พฤษภาคม 7, 2007 at 1:17 pm

    class Program    {        static void Main(string[] args)        {            CelsiusToFahrenheit myCTOF = new CelsiusToFahrenheit();            Console.Write("Input you celcius: ");            double myCelcius = Convert.ToDouble(Console.ReadLine());            myCTOF.Celsius = myCelcius;            Console.WriteLine(myCelcius + " Celsius is " + myCTOF.makeFahrenheit()+ " Fahrenheit");        }    }    class CelsiusToFahrenheit    {        private double celsius;        public double Celsius        {            set { celsius = value; }        }        public double makeFahrenheit()        {            return (celsius * 9 / 5) + 32;        }

  • BoM_Science  On ตุลาคม 15, 2007 at 5:53 pm

    ความรู้เยอะมากเลย ครับ

  • T  On ธันวาคม 2, 2008 at 5:34 pm

    ติดตามอยู่ค่ะ  ขอบคุณมากค่ะ

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: