Encapsulation

4 September 2016

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

Encapsulation คืออะไร

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

Encapsulation in Java

แนวคิดของ Encapsulation ที่มีตัวแปรที่ถูกปกปิดไว้ภายใน

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

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

ตัวอย่างการใช้งาน encapsulation

ต่อไปมาดูตัวอย่างการพัฒนาโปรแกรมที่มีคุณสมบัติในการปกปิดข้อมูล ซึ่งเป็นโปรแกรมนาฬิกานับเวลา

// TestTimer.java
public class TestTimer {
    public static void main (String[] args) {
        Timer time = new Timer();
        time.setTime(9, 30, 55);

        while (true) {
            time.increaseTime();
            System.out.println(time.getTime());

            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
        }
    }
}

class Timer {
    public int timeStamp = 0;

    private int second = 0;
    private int minute = 0;
    private int hour = 0;

    public void setTime(int h, int m, int s) {
        second = s; minute = m; hour = h;
        timeStamp = (hour * 3600) + (minute * 60) + second;
    }

    public void increaseTime() {
        timeStamp = (timeStamp + 1) % 86400;
        updateMembers ();
    }

    private void updateMembers () {
        second = timeStamp % 60;
        minute = (timeStamp / 60) % 60;
        hour = (timeStamp / 3600) % 24;
    }

    public String getTime() {
        return String.format("%02d:", hour) + 
               String.format("%02d:", minute) + 
               String.format("%02d", second);
    } 
}

ในตัวอย่างเป็นโปรแกรมแสดงนาฬิกาเหมือนในคอมพิวเตอร์ของเรา เราได้สร้างคลาส Timer ซึ่งเป็นคลาสของนาฬิกา และภายในจะมีสมาชิกตัวแปรที่เป็น private ได้แก่ second minute hour และสมาชิกเมธอด updateMembers () นั่นหมายความว่าข้อมูลเหล่านี้ถูกห่อหุ้ม เราไม่สามารถเข้าถึงมันได้โดยตรง

ทางเดียวที่เราสามารถทำได้คือเข้าถึงข้อมูลโดยเมธอดหรือตัวแปรที่เป็น public ในคำสั่ง

time.increaseTime();

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

System.out.println(time.getTime());

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

try {
    Thread.sleep(1000);
} catch (InterruptedException ex) {
    System.out.println(ex);
}

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

09:30:56
09:30:57
09:30:58
09:30:59
09:31:00
09:31:01
09:31:02
09:31:03
09:31:04
09:31:05
.
.
.

และนี่เป็นผลลัพธ์ของโปรแกรม มันจะนับเวลาและแสดงเวลาไปเรื่อยๆ เพราะเราให้ infinity loop คุณต้องออกจากโปรแกรมเพื่อจบมัน

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

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

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