/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day31] Enum

สวัสดีวันสงกรานต์ครับ วันนี้วันที่สามสิบเอ็ดของ ‪#‎365วันแห่งโปรแกรม‬ ผ่านไปเดือนนึงแล้วนะครับ วันนี้เราจะคุยกันต่อจากเรื่องเมื่อวาน นั่นก็คือ Enum


Enum คืออะไร?

Enum หรือ enumerated type (AKA enumeration, enum, factor) นั่นก็คือ data type ชนิดหนึ่งที่เป็นเซ็ตของค่าคงที่ ค่าคงที่ที่อยู่ใน Enum เนี่ย จะเรียกว่า element, member หรือ enumerator ซึ่งแต่ละตัวจะประกอบด้วย Name และ Value (บางภาษาโปรแกรมไม่ยอมให้มีการกำหนด Value เอง)

enum Days 
{
	Sun, 
	Mon, 
	Tue, 
	Wed, 
	Thu, 
	Fri,
    Sat, 
};

Enum ต่างจาก Constant อย่างไร และเอาไปใช้ทำอะไร?

เมื่อวานเราบอกว่า Constant คือค่าคงที่นะ เวลาประกาศก็ประกาศไปทีละตัว แต่ Enum นี่เราประกาศทีทั้งเซ็ตเลยครับ เพราะว่าจุดประสงค์หลักคือการประกาศเซ็ตของค่าคงที่เพื่อใช้ limit ค่าที่ตัวแปรรับได้

ลองจินตนาการดูว่าถ้าเราบอกให้ user กรอกวัน (อาทิตย์-เสาร์) ปุ๊บ เราจะได้ค่าอะไรมาบ้าง เราอาจจะได้ Friday, Fri, Fr, วันศุกร์, ศุกร์, ศ อะไรแบบนี้ ซึ่งเราแทบไม่สามารถควบคุมได้เลย ก็เพราะ user สามารถกรอกได้ตามใจชอบ แต่ถ้าเรากำหนดไว้เลยว่า user กรอกอะไรได้บ้าง คราวนี้ทุกคนก็กรอกได้เหมือนๆ กันแล้วครับ เราก็ทำงานง่ายขึ้น จริงไหมครั? Enum ก็มีแนวคิดประมาณนั้น

ในทางโปรแกรมมิ่งแล้ว เรามักใช้ Enum สำหรับแทน State ของโปรแกรม/Config ต่างๆ

enum GameState{
	WELCOME,
	RUNNING,
	PAUSE,
	OVER
}

GameState gameState = GameState.RUNNING;

public void update(){
	if(gameState == GameState.RUNNING){
    	if(userClickPauseButton)
        	gameState = GameState.PAUSE;
        //do something
    }
    //do something
}

ตัวอย่างด้านบนเป็นการใช้ Enum เพื่อกำหนด State ที่เป็นไปได้ทั้งหมดของเกม และมีการสร้างตัวแปรแบบ Enum ขึ้นมาเพื่อเก็ย State ปัจจุบัน พอ update() ทำงานปุ๊บ ก็จะเช็คว่าตอนนี้เกมอยู่ใน State ไหน แล้วใน State นั้นทำอะไรได้บ้าง user กดตรงไหนแล้ว State ถึงเปลี่ยน อะไรประมาณนี้ครับ

Enum มีข้อดีอย่างไร?

ถึงจะบอกว่า Enum เป็นกลุ่มของค่าคงที่ แต่เราก็มักจะไม่ได้กำหนด Value ให้ element แต่ละตัว เพราะส่วนใหญ่เราใช้แค่เพื่อให้ลดโอกาสที่จะพิมพ์ผิด แล้วก็ลดเวลาที่ใช้ในการเขียน Constant แยกเป็นตัวๆ มากกว่า

const int WELCOME = 0;
const int RUNNING = 1;
const int PAUSE = 2;
const int OVER = 3;

จากโค้ดด้านบนเป็นการประกาศ Constant เพื่อใช้แทน Enum ในตัวอย่างก่อนหน้า จะเห็นว่ามันยาว และถ้าเรา copy/paste ก็มีโอกาสที่เราจะลืมเปลี่ยนค่าของมันอีก พอเอาไปใช้จริง แต่ละตัวก็เป็น int ดังนั้นจึงมีโอกาสที่เราจะใส่ค่าผิด หรือบางทีก็ขี้เกียจพิมพ์แล้วใส่ตัวเลขลงไปแทน ซึ่งก็จะง่ายต่อการผิดพลาด และยากต่อการแก้ไขในอนาคต

สรุป

ใช้ Enum ทุกครั้งเมื่อพบว่าค่าที่เป็นไปได้ของตัวแปรนั้นมีจำกัด หรือควรถูกจำกัดครับ จะได้ไม่เป็นภาระของลูกหลาน ><

‪#‎day31 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...