background
Menü

Class-Based Enum pattern JavaScript segítségével

 Kezdő lépések: első kísérletek

Az enum egy értékkészletből álló típus. Például a TypeScript rendelkezik már hasonló beépített enumokkal, ezekkel meghatározhatjuk a saját logikai típusunkat.

enum MyBoolean  {       false,    true,  }

 Vagy meghatározhatjuk a színek saját típusát is:

enum Color {   red,   orange,   yellow,   green,   blue,   purple, }

 Ezt a TypeScript kódot a erre a JavaScript kódra fordítják le (néhány részlet elhagyásra kerül a dolgok megértésének megkönnyítése érdekében):

const Color = {   red: 0,   orange: 1,   yellow: 2,   green: 3,   blue: 4,   purple: 5, };

Ennek a megvalósításnak számos problémája van:

 
  • Naplózás: Ha olyan enum értéket naplóz, mint például a Color.red, akkor nem látja annak nevét.
  • Típusbiztonság: Az enum értékek nem különösek, összekeverhetők más számokkal. Például az 1. számot tévedhetjük a Color.green-rel és fordítva.
  • Tagsági ellenőrzés: Nem könnyű ellenőrizni, hogy egy adott érték a színes elem-e.

Folytatva az egyszerű JavaScript-et, javíthatjuk az 1. problémát, ha karakterláncokat használunk számok helyett enum értékekként:

const Color = {   red: 'red',   orange: 'orange',   yellow: 'yellow',   green: 'green',   blue: 'blue',   purple: 'purple', }

 Ezenkívül akkor is megkapjuk a tipizációt, ha szimbólumokat használunk enum értékekként:

const Color = {   red: Symbol('red'),   orange: Symbol('orange'),   yellow: Symbol('yellow'),   green: Symbol('green'),   blue: Symbol('blue'),   purple: Symbol('purple'), }

 A szimbólumok egyik problémája az, hogy azokat kifejezetten karakterláncokká kell konvertálni, nem tudjuk erőltetni őket (pl. A + vagy a sablonok betűjelein belül):

assert.throws(   () => console.log('Color: '+Color.red),   /^TypeError: Cannot convert a Symbol value to a string$/ );

 És bár tesztelhetjük a tulajdonságot, ez nem egyszerű:

function isMember(theEnum, value) {   return Object.values(theEnum).includes(value); }

assert.equal(isMember(Color, Color.blue), true);  assert.equal(isMember(Color, 'blue'), false);

 Az ENUM mintája

Egyéni osztály használata az enumhoz tagsági tesztet és nagyobb rugalmasságot eredményez az enum értékeivel kapcsolatban:

class Color {   static red = new Color('red');   static orange = new Color('orange');   static yellow = new Color('yellow');       
static green = new Color('green');   static blue = new Color('blue');   static purple = new Color('purple');      
 constructor(name) {     this.name = name;   }    toString() {     return `Color.${this.name}`;   } }

 Az osztályok használatának ezt a módját nevezem az enum mintának. Az ihlette, hogy a maga Java hogyan építi be az enumot a nyelvbe.

További érdekességek találhatóak a következő linken: https://2ality.com/2020/01/enum-pattern.html és Java fejlesztőknek : https://howtodoinjava.com/java/enum/enum-tutorial/

Címkék : Hungarian, JavaScript, Java