Encapsulation

13 October 2016

ในบทนี้ คุณจะได้เรียนเกี่ยวกับคุณสมบัติการห่อหุ้มข้อมูลหรือ encapsulation ในภาษา Visual Basic

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

ในการเขียนโปรแกรม encapsulation นั้นใช้สำหรับปกปิดตัวแปรภายในคลาส และการทำงานของเมธอด สำหรับการทำงานของเมธอด คุณแค่ทราบว่าจะส่งค่าอะไรไปยังเมธอดและสิ่งที่จะได้กับมาคืออะไร

Access modifiers

ในการเขียนโปรแกรมเชิงวัตถุสำหรับ encapsulation นั้น จะมีคำสั่งสำหรับกำหนดการเข้าถึงของตัวแปร เมธอด คลาส หรือชนิดข้อมูลประเภทต่างๆ ซึ่งเรียกว่า access modifier โดยในภาษา Visual Basic มีดังนี้

Access modifierAccess level granted
Publicสามารถเข้าถึงได้จากทุกส่วนของโปรแกรม
Protectedสามารถเข้าถึงได้ภายในคลาสที่ใช้ประกาศ Protected และในคลาสที่สืบทอดจากคลาสนั้น
Friendโค้ดใน assembly ที่ประกาศเป็นแบบ Friend สามารถเข้าถึงได้
Protected Friendโค้ดในคลาสและ assembly เดียวกัน หรือคลาสที่สืบทอดจาก สามารถเข้าถึงได้
Privateสามารถเข้าถึงได้เฉพาะภายในคลาสที่ประกาศ Private เท่านั้น

เราจะยกตัวอย่างการใช้ำงานสำหรับบางคำสั่ง

คำสั่ง Public และ Private

ต่อไปจะเป็นตัวอย่างโปรแกรมในภาษา Visual Basic เพื่อแสดงการทำงานของ encapsulation และทำให้คุณเข้าใจมันมากขึ้น เราจะสร้างคลาสเกี่ยวกับดวงดาวในระบบสุริยะสำหรับตัวอย่าง

Class Star

    Public name As String
    Private distanceFromSun As Decimal ' in km
    Private orbitalTime As Decimal ' in second

    Public Sub SetDistance(ByVal d As Decimal)
        distanceFromSun = d
    End Sub

    Public Sub SetOrbitalTime(ByVal day As Decimal)
        orbitalTime = day * 86400 ' set time in second
    End Sub

    Public Function GetOrbitalSpeed() As Decimal
        Dim orbitalDistance As Decimal = OrbitDistance()
        Dim speedPerSec As Decimal = orbitalDistance / orbitalTime
        Return Math.Round(speedPerSec, 2)
    End Function

    Private Function OrbitDistance() As Decimal
        Return 2 * Math.PI * distanceFromSun
    End Function

End Class

Module EncapsulationExample

    Sub Main()

        Dim earth As Star = New Star()
        earth.name = "Earth"
        earth.SetDistance(152100000)
        earth.SetOrbitalTime(365.256)

        Console.Write(earth.name & " travels around the sun with speed ")
        Console.WriteLine(earth.GetOrbitalSpeed() & " km/s")

    End Sub

End Module

นี่เป็นตัวอย่างโปรแกรมในการคำนวณหาความเร็วการโคจรของดวงดาวรอบดวงอาทิตย์ โดยเราได้สร้างคลาส Star สำหรับในการนำมาสร้างออบเจ็คของดวงดาว และในตัวอย่างเราได้สร้างออบเจ็คของโลกในตัวแปรออบเจ็ค earth เพื่อใช้งานในการหาความเร็ว

Class Star

    Public name As String
    Private distanceFromSun As Decimal ' in km
    Private orbitalTime As Decimal ' in second
    ...

ในคลาส Star เรามีสามตัวแปรโดย name สำหรับเก็บชื่อของดวงดาว ซึ่งเราประกาศเป็น Public นั่นหมายความว่ามันสามารถเข้าถึงได้จากข้างนอกของคลาส ในโมดูลของการรันโปรแกรม คำสั่ง earth.name เป็นการเข้าถึงค่าของตัวแปรจากภายนอกคลาสและกำหนดค่าให้กับตัวแปรโดยตรง

ต่อมาเป็นตัวแปร distanceFromSun และ orbitalTime ซึ่งมีระดับการเข้าถึงเป็น Private ทำให้เราไม่สามารถเข้าถึงตัวแปรเหล่านี้ได้จากออบเจ็ค earth เพราะว่าตัวแปรที่เป็น Private สามารถเข้าถึงได้ภายในคลาสเดียวกันเท่านั้น โดยปกติเมื่อเราประกาศตัวแปรในคลาสโดยใช้คำสั่ง Dim นั้นมันจะทำงานเป็นแบบ Private

Public Sub SetDistance(ByVal d As Decimal)
    distanceFromSun = d
End Sub

Public Sub SetOrbitalTime(ByVal day As Decimal)
    orbitalTime = day * 86400 ' set time in second
End Sub

เนื่องจากตัวแปรทั้งสองไม่สามารถเข้าถึงได้จากภายนอกคลาส เราได้สร้างเมธอด SetDistance() และเมธอด SetOrbitalTime() สำหรับการกำหนดค่าให้กับตัวแปร และเราสามารถเข้าถึงเมธอดนี้ผ่านออบเจ็ค earth ในโมดูลได้ เพราะเมธอดเหล่านี้ได้ประกาศเป็น Public

ในเมธอด SetDistance() เพียงแค่นำค่าจากพารามิเตอร์มากำหนดให้กับตัวแปร distanceFromSun ส่วนเมธอด SetOrbitalTime() ทำการคำนวณเวลาในวินาทีและเก็บในตัวแปร orbitalTime

Public Function GetOrbitalSpeed() As Decimal
    Dim orbitalDistance As Decimal = OrbitDistance()
    Dim speedPerSec As Decimal = orbitalDistance / orbitalTime
    Return Math.Round(speedPerSec, 2) ' two digits floating point
End Function

Private Function OrbitDistance() As Decimal
    Return 2 * Math.PI * distanceFromSun
End Function

สองเมธอดต่อมา เมธอด GetOrbitalSpeed() เป็นการคำนวณหาความเร็วในการโคจรรอบดวงอาทิตย์ ซึ่งโปรแกรมได้เรียกใช้เมธอด OrbitDistance() ซึ่งคำนวณระยะทางในการโคจร และเมธอดนี้เป็น Private มันสามารถเข้าถึงได้เฉพาะในคลาสเท่านั้น เราไม่สามารถเข้าถึงโดยตรงจากออบเจ็ค earth ได้

และในเมใธอด Main() ของโมดูลหลักของโปรแกรมเป็นการสร้างออบเจ็คในโปรแกรม นี่เป็นผลลัพธ์

Earth travel around the sun with speed 30.28 km/s

คำสั่ง Protected

ในการสืบทอดของคลาสนั้น ตัวแปร เมธอดหรือสมาชิกที่ถูกประกาศเป็นแบบ Private จะไม่ถูกสืบทอดมาด้วย สำหรับคำสั่ง Protected นั้นตัวแปรจะถูกสืบทอดมาด้วย และสามารถเข้าถึงได้ภายใน delivered class เท่านั้น ซึ่งจะไม่สามารถเข้าถึงจากภายนอกหรือโดยตัวแปรของออบเจ็คได้

Class Person

    Public name As String
    Protected height As Decimal

End Class

Class Programmer
    Inherits Person

    Public Sub SetHeight(ByVal h As Decimal)
        height = h
    End Sub

    Public Function GetHeightInMeter() As Decimal
        Return Math.Round(height * 12 * 2.54, 2)
    End Function

End Class

Module ProtecedExample

    Sub Main()
        Dim prog As Programmer = New Programmer()
        prog.name = "Mateo"
        prog.SetHeight(5.9) ' set height feet

        Console.WriteLine(prog.name & " height is " &
        prog.GetHeightInMeter() & " meters")

    End Sub

End Module

ข้างบนเป็นตัวอย่างในการใช้คำสั่ง Protected โดยเราได้สร้างคลาส Programmer ซึ่งสืบทอดมาจากคลาส Person ถึงแม้ว่าตัวแปรทั้งหมดจะถูกสืบทอดมาด้วย แต่เราไม่สามารถเข้าถึงตัวแปร height จากออบเจ็คโดยตรงได้ เพราะว่ามันได้ประกาศเป็น Protected ใน base class

ทางเดียวที่จะเข้าถึงตัวแปร height ได้ ในคลาส Programmer เราได้สร้างเมธอด SetHeight() สำหรับการกำหนดค่าความสูงในหน่วยฟุต และเมธอด GetHeightInMeter() เป็นการรับค่าความสูงในหน่วยเมตร ซึ่งเป็นแบบ Public

Mateo height is 179.83 meters

นี่เป็นผลลัพธ์ของโปรแกรมในการใช้งานคำสั่ง Protected

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

คำสั่ง Shared

ในภาษา Visual Basic นั้นมีคำสั่งสำหรับการทำงานแบบ global นั่นคือคำสั่ง Shared ซึ่งจะถูกสร้างขึ้นในตอนที่โปรแกรมคอมไพล์ และสามารถใช้ได้สำหรับทุกที่ มาดูตัวอย่างการใช้คำสั่ง Shared

Public Class sharedClass

    Public Shared incrementer As Integer = 0

End Class

Module SharedExample

    Sub Main()
        sharedClass.incrementer = 3
    End Sub

    Sub Update()
        sharedClass.incrementer = sharedClass.incrementer + 1
    End Sub

End Module

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

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับคุณสมบัติการสืบทอดในภาษา Visual Basic ซึ่งเป็นคุณสมบัติที่สำคัญในการเขียนโปรแกรมเชิงวัตถุ ที่เราสามารถปกปิดข้อมูลและการทำงานของโปรแกรมจากภายนอกได้

บทความนี้เป็นประโยชน์หรือไม่?Yes·No