เรียนรู้การสร้าง Class และการใช้งานเบื้องต้น (OOP With Swift Part 3) – Encapsulation

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

private คือตัวแปรใช้ได้ภายใน Class เท่านั้นไม่ให้ใครมาเปลี่ยนค่ามันเองได้ตรงๆ
Internal คือตัวแปรใน Class ทั่วไปใช้ได้กับ Object ทั่วๆไป
public ตัวแปรที่สามารถนำไปใช้ที่ใดก็ในโปรแกรม

 

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

 

ขั้นแรกให้เรา Add Class เข้ามาใน Project ก่อนครับ โดยการ Click ขวาแล้วเลือก New File..

ThaiSwiftClass - New File

ThaiSwiftClass – New File

 

จากนั้นเลือกประเภทของ File ให้เลือก Cocoa Class

ThaiSwiftClass - Open New Class

ThaiSwiftClass – Open New Class

 

ตั้งชื่อให้เรียบร้อย อย่าลืมเลือก Language เป็น Swift ด้วยนะครับ

ThaiSwiftClass - Create clsShopKeeper

ThaiSwiftClass – Create clsShopKeeper

 

ทีนี่ก็เริ่มเขียน Code

ThaiSwiftClass - Class ShopKeeper Part 1

ThaiSwiftClass – Class ShopKeeper Part 1

ในส่วนแรก เราจะประกาศตัวแปร ใว้ 5 ตัว

sTitle เป็นตัวอย่างการใช้ Public แบบ String สำหรับแสดงผลทั่วไปไตเติ้ลของโปรแกรม
sPromotion เป็น internal แบบ String ใช้สำหรับตั้งชื่อโปรโมชั่นของร้าน
dProductPrice เป็น private แบบ Double เอาใว้ตั้งราคาสินค้าในร้าน (ร้านเราจะขาย USB Drive)
dMaxDiscount เป็น private แบบ Double ไว้ตั้งราคาสำหรับลูกค้าขอส่วนลดได้สูงสุด
sName เป็น Private แบบ String ใว้ตั้งชื่อร้าน

 

จากนั้นเราจะให้ตั้งค่าเริ่มต้นทั้ง ชื่อ ,รายการโปรโมชั่น และ ราคาขาย ด้วย init()

 

มาถึงในส่วน Method ของ Class หรือ Function

ThaiSwiftClass - Class ShopKeeper Part 2

ThaiSwiftClass – Class ShopKeeper Part 2

อธิบาย Method

Title ใว้สำหรับแสดงส่วน Title ของโปรแกรม
sayHello ใว้แสดงข้อความทักทายลูกค้า

 

ThaiSwiftClass - Class ShopKeeper part 3

ThaiSwiftClass – Class ShopKeeper part 3

อธิบาย Method

setDiscount ใว้สำหรับตั้งค่าส่วนลด เราจะไม่อนุญาตให้มีเปลี่ยนค่า dMaxDiscount ได้ตรงๆต้องผ่าน Method นี้เท่านั้นเพื่อเช็กเงื่อนไขที่เราต้องการให้ถูกต้องเสียก่อน
setPrice เช่นกันเราจะเปลี่ยนค่า dProductPrice หรือราคาสินค้าตรงๆไม่ได้ ต้องผ่าน Method นี้เท่านั้น โดย Method นี้จะถูกเรียกอีกทีใน ShowNewPrice เพื่อตรวจสอบเงื่อนไขของส่วนลดอีกที
ShowNewPrice เราจะตรวจสอบว่าส่วนลดที่ได้มาเท่าไรก็หักออกไปจากราคาขายที่ตั้งใว้แต่แรก และแสดงผลให้ลูกค้าดู

 

 

นำ Class ที่ได้ไปใช้งานจริง

ThaiSwiftClass - using mrJone

ThaiSwiftClass – using mrJone

 

จากตัวอย่างเราตั้ง meJone เป็น class ของ clsShopKeeper โดย

– ตั้งชื่อร้านเป็น Mr.Jone

– มีโปรโมชั่น Special Discount Today!! และตั้งราคาขายใว้ที่ 1000$

– จากนั้นให้ Mr.Jone ทักทายลูกค้า (Title() , sayHello())

– บอกราคาขายออกไป (ShowNewPrice())

– ลูกค้าขอลดไป 300 เราก็ตั้งราคาใหม่จากส่วนลด setDiscount(300)

– และบอกราคาขายใหม่ออกไป (ShowNewPrice() )

 

จะเห็นได้ว่าเราไม่สามารถแก้ไขราคาหรือส่วนลดได้ตรงๆเพราะทั้งคู่ถูกตั้งเป็น Private นั่นคือความหมายของ Encapsulation นั่นเอง เราจะนำเอาตัวแปรแบบ Private ไปห่อใว้ใน Method setPrice,setDiscount อีกทีเพื่อไม่ให้ถูกเรียกตรงๆได้จากภายนอก เป็นข้อดีที่เราจะซ่อนตัวแปรบางประเภทใว้ไม่ให้ object ภายนอกเข้าถึงได้ตรงๆนั่นเอง เอาไว้ทำให้เรามั่นใจในความปลอดภัยของค่าที่อยู่ในตัวแปรว่าจะต้องถูกต้องตามเงื่อนไขที่ต้องการเสียก่อน

ThaiSwiftClass - Encapsulation show member in class

ThaiSwiftClass – Encapsulation show member in class แสดง Method และตัวแปรที่ใช้งานได้

 

ลองพยายามเรียก dProductPrice ตรงๆก็จะเกิด Error เพราะระบบจะตัวแปรหรือ Method ที่เป็น Private หาไม่เจอ

ThaiSwiftClass - Error Encapsulation

ThaiSwiftClass – Error Encapsulation

 

ผลของการทำงาน

ThaiSwiftclass - Encapsulation Result

ThaiSwiftclass – Encapsulation Result

 

ลองนำไปปรับใช้และฝึกฝนดูนะครับ

แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass

Leave a Reply