Dart lang: Ep.5 (Enum with Extension)
Enum with Extension methods มันคืออะไร สำหรับคนที่ใช้บ่อยๆคงเข้าใจอย่างรวดเร็ว แต่สำหรับ newbie เรามาศึกษาพร้อมกับดู used case กันคับ
An enumeration is used for defining named constant values. An enumerated type is declared using the enum keyword.
enum ใช้สำหรับกำหนดค่า constant values ที่เรารู้หรือจะเป็นค่า status ต่างๆที่เรารู้อยู่ก่อนแล้วก็ได้
พูดง่ายๆคือกำหนดค่าไว้ใช้งาน ซึ่งเป็นการกำหนดไว้ล่วงหน้า ประโยชน์ของมันคือ ทำให้ code เราอ่านง่ายและเข้าใจได้ทัน
(จริงๆแล้ว
enum
ก็คือtype
แบบนึงนะคับ เหมือนกับclass
นั่นแหละ ที่เป็นtype
แบบนึง แต่ทีนี้enum
เรารู้ค่ามันล่วงหน้าอยู่แล้วไง ว่าvalues
ของมันมีอะไรบ้าง ฉะนั้นเมื่อเรารู้อยู่แล้ว เราก้อกำหนดมันเข้าไปได้ตั้งแต่ต้นเลย)
มาดูตัวอย่างกันคับ
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
print('running: ${Status.running}, ${Status.running.index}');
print('running index: ${Status.values[1]}');
}
จะได้ผลลัพธ์แบบนี้
[Status.none, Status.running, Status.stopped, Status.paused]
value: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running
จะพบว่า มี method ที่เราใช้ได้ใน enum คือ
Status.values
จะ return ออกมาเป็น List ของ enum ทั้งหมดStatus.values[index]
เมื่อ return ออกมาเป็น List จึงเข้าถึง index แต่ละตัวได้Status.running.index
สามารถหา index จาก Status ได้เลย เมื่อใช้.index
ในที่นี้จะได้ 1 นั่นเอง เพราะ Status.running อยู่ในตำแหน่งที่ 1
ลองมาดูอีกตัวอย่างนึงคับ ในการใช้ enum เพื่อช่วยในการ display information.
เมื่อเรารู้แล้วว่ามี method อะไรบ้างที่ใช้กับ enum และ แบบที่ใช้ swich case ร่วมด้วย ต่อไปจะลองมาประยุกต์ใช้ใน Used case จริงๆ ซึ่งจะเป็นการเช็คว่า user ที่ Login เข้ามาเป็นหมอรึเปล่า โดยใช้ร่วมกับ extension.
จะสังเกตุว่าพออ่านแล้วก้อจะเข้าใจได้เลยว่าคือการเช็ค Role ว่าเป็น Doctor รึเปล่า ถ้าเราไม่ใช้ enum ก็จะต้องเขียนแบบนี้
// role 5 = 'doctor'
if (role == '5') {
print('You are doctor');
}
ซึ่งพบว่าอ่านตอนแรกไม่เข้าใจแน่นอน ว่า role 5 คืออะไร จึงต้องเขียน comment กำกับไว้
สำหรับเรื่อง extension methods สามารถอ่านเพิ่มเติมได้ ที่นี่ คับ
อีกตัวอย่างนึงของ Used case ที่ต้องเข้าใจคือ การใช้ enum ในการช่วย pass ค่า String
จากรูปด้านล่างเมื่อมีการกดปุ่ม SocialMedia ทั้ง 3 ปุ่ม จะนำไปเปิด Browser ของแต่ละ platform โดยเราจะใช้ enum ช่วยในการรับค่าเข้ามาผ่าน Function share() และนำค่าจริงๆไปกำหนดเป็น value ของ
Map<SocialMedia, String> urls
โดยเมื่อได้รับ key เข้ามาก็จะ get value ออกมาจาก map ด้วยurls[platform]
แบบนี้ พอได้ value ที่เป็น url จริงๆของ platform แล้วจึงใส่เข้าไปใน launch(url) เพื่อเปิดด้วย default browser นั้นๆ
จบล่ะ
PS.
ในกรณีที่เราไม่ต้องการใช้ enum สามารถแทนด้วย class ได้เช่นกัน เช่น ในเคสที่ต้องการเช็ค role ของ user ก่อนหน้านี้เราจะสร้าง class มาจัดการ
แล้วพบกันใหม่คับ
GRASSROOT ENGINEER.