Dart lang: Ep.5 (Enum with Extension)

Grassroot Engineer
3 min readAug 8, 2021

--

Enum with Extension methods มันคืออะไร สำหรับคนที่ใช้บ่อยๆคงเข้าใจอย่างรวดเร็ว แต่สำหรับ newbie เรามาศึกษาพร้อมกับดู used case กันคับ

Enumerated types, often called enumerations or enums, are a special kind of class used to represent a fixed number of constant values.

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

จะพบว่า มี 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.

Appley enum with Switch case.

เมื่อเรารู้แล้วว่ามี method อะไรบ้างที่ใช้กับ enum และ แบบที่ใช้ swich case ร่วมด้วย ต่อไปจะลองมาประยุกต์ใช้ใน Used case จริงๆ ซึ่งจะเป็นการเช็คว่า user ที่ Login เข้ามาเป็นหมอรึเปล่า โดยใช้ร่วมกับ extension.

เปรียบเทียบ role ด้วย enum with 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 นั้นๆ

เทคนิคการใช้ enum เพื่อให้ช่วยเปิด Browser ตามปุ่มต่างๆที่ต้องการ ในการ implement เมื่อมีการเขียน enum ไว้ใน function แล้ว จะช่วยให้ง่ายขึ้น เพราะไม่ต้องเขียน url ใหม่ทั้งหมด ซึ่งมีโอกาสผิดพลาดได้ (q_samples)

จบล่ะ

PS.

ในกรณีที่เราไม่ต้องการใช้ enum สามารถแทนด้วย class ได้เช่นกัน เช่น ในเคสที่ต้องการเช็ค role ของ user ก่อนหน้านี้เราจะสร้าง class มาจัดการ

เมื่อใช้ class แทน enum ในการเปรียบเทียบ Role

แล้วพบกันใหม่คับ
GRASSROOT ENGINEER.

--

--

Grassroot Engineer
Grassroot Engineer

Written by Grassroot Engineer

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com

No responses yet