Felsorolt ​​típus

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2014. május 19-én felülvizsgált verziótól ; az ellenőrzések 12 szerkesztést igényelnek .

Felsorolt ​​típus (rövidített felsorolás , eng.  enumeration, enumerated type ) - programozási adattípus , amelynek értékkészlete az azonosítók korlátozott listája.

Leírás és használat

A felsorolt ​​típust olyan azonosítók halmazaként határozzuk meg, amelyek nyelvi szempontból ugyanazt a szerepet töltik be, mint a szabályos nevű állandók, de az adott típushoz kapcsolódnak. A Pascal-féle felsorolástípus klasszikus leírása a következő:

típus Cardsuit = ( ütők , gyémántok , szívek , ásók ) ;

Itt deklarálják a Cardsuit adattípust, melynek értéke a felsorolt ​​négy konstans bármelyike ​​lehet. A típusváltozó Cardsuitfelveheti az értékek egyikét, clubs, diamonds, hearts, spadesmegengedett a felsorolástípus értékeinek egyenlőség vagy egyenlőtlenség összehasonlítása, valamint a kiválasztási utasításokban (Pascal - case) történő felhasználása opciókat azonosító értékként.

A felsorolások használata lehetővé teszi a programok forráskódjainak olvashatóbbá tételét, mivel lehetővé teszik bizonyos értékeket kódoló "varázsszámok" olvasható nevekkel való helyettesítését.

Egyes nyelvek felsorolása alapján típuskészletek hozhatók létre . Ilyen esetekben a halmazt egy enum típusú egyedi értékek rendezetlen gyűjteményeként értjük (és írjuk le).

A felsorolt ​​típus használható változók deklarációjában és függvények formális paramétereiben (eljárások, metódusok). A felsorolt ​​típusú értékek hozzárendelhetők a megfelelő változókhoz, és átadhatók a megfelelő típusú paramétereken a függvényekben. Ezenkívül az egyenlőség és az egyenlőtlenség felsorolt ​​értékeinek összehasonlítása mindig támogatott. Egyes nyelvek más összehasonlító operátorokat is támogatnak a felsorolt ​​típusú értékekhez. A két felsorolt ​​érték összehasonlításának eredményét ilyen esetekben általában a típusdeklarációban szereplő értékek sorrendje határozza meg - a típusdeklarációban korábban előforduló értéket tekintjük "kisebbnek", mint az később következik be. Néha egy felsorolt ​​típus vagy egy felsorolt ​​típusú érték bizonyos tartománya is használható egy tömb indextípusaként. Ebben az esetben a kiválasztott tartomány minden értékéhez tartozik egy elem a tömbben, és az elemek tényleges sorrendje megfelel a típusdeklarációban szereplő értékek sorrendjének.

Megvalósítás

Általában az összeállítás során a felsorolási értékeket egész számokkal ábrázolják. Az adott programozási nyelvtől függően egy ilyen ábrázolás vagy teljesen elrejthető a programozó elől, vagy bizonyos „megkerülő megoldások” segítségével elérhető (például egy enum típusú érték kényszerített konvertálása „egész” típusú értékké), vagy akár a programozó vezérli (ilyen esetekben a programozónak lehetősége van kifejezetten megadni, hogy az enum típusú összes vagy néhány értéket milyen számokkal kódoljon. Minden lehetőségnek megvannak a maga pozitívumai és negatívumai. Egyrészt a felsorolástípust alkotó konstansok számértékeinek használatának képessége, különösen akkor, ha visszaélnek vele, megfosztja e típusok használatát, és hibaveszélyt jelent (a számértékek használatakor amelyeknek a típusban nincsenek megfelelő állandók). Másrészt az explicit értékkezelés néhány további funkciót is biztosít. Például lehetővé teszi az enum típusok használatát más nyelven írt modulokkal való interfész szervezésekor, ha azok valamilyen előre meghatározott halmazból egész számmal kódolt értékeket használnak vagy adnak vissza.

Egy másik lehetőség, amelyet a felsorolt ​​típusok nyújtanak a nyelvi megvalósítás szintjén, a memóriatakarékosság. Kis mennyiségű enum típus esetén néhány bit elegendő egy ilyen típusú érték tárolásához (a fenti típus Cardsuitcsak két bitet igényel értékenként, míg a szabványos egész szám a legtöbb használt architektúrán 32 bitet – 16-szor többet), és a A fordító ezt a tényt felhasználhatja az adatok memóriában való tárolására. Ez különösen akkor lehet fontos, ha egy rekordban több enum-típus értéket tárolnak – a rekordok tömörítése nagyszámú feldolgozáskor sok memóriát szabadíthat fel. A fordítók általában nem valósítják meg ezt a funkciót, legalábbis nem az utóbbi időben, amikor a számítógépmemória sokkal olcsóbb lett.

Kritika

A felsorolás típusa hagyományos a fejlett programozási nyelveknél, meglehetősen széles körben használatos, és gyakran természetesnek tekintik. Ez a típus azonban nem mentes a kritikától a programozás teoretikusai és gyakorlói részéről. Tehát az Oberon programozási nyelv fejlesztésekor felsorolt ​​típusok szerepeltek a nyelvből eltávolított szolgáltatások listáján. Niklaus Wirth , a nyelv tervezője a következő okokra hivatkozott:

  • „egyre több programban az enumok rosszul átgondolt használata... népességrobbanáshoz vezet a típusok között, ami viszont nem a programok tisztázásához, hanem bőbeszédűséghez vezet” [1] ;
  • amikor egy enum típust egy modul exportál (vagyis egy interfész részévé válik ), megsértik az általános szabályt - a type export parancs egyszerre exportálja az összes elemét, míg az összes többi típus esetében a type export elrejti a belső szerkezetét;
  • A program olvashatóságának szempontjából semmi sem akadályozza meg abban, hogy egy felsorolt ​​típus helyett csak közösen definiált elnevezett konstansok csoportját használja, különösen nyelvi mechanizmusok, például modulok vagy osztályok jelenlétében.

Másrészt például a kezdetben felsorolt ​​típust nem tartalmazó Java -ban ezt a típust utólag nemcsak kényelmi, hanem megbízhatósági okokból is bevezették: a felsorolás helyett az elnevezett konstanscsoportok használatának problémája az, hogy nem szabályozza a fordító az értékállandók egyediségét, valamint annak lehetőségét, hogy véletlenszerűen hozzárendeljenek értékeket olyan változókhoz, amelyek nem felelnek meg ezen állandók egyikének sem.

Az enumok leírása különböző nyelveken

Ada

Az Ada nyelven a felsorolások megadása kulcsszóval is, majd vesszővel elválasztott értéklistával történik:

típusú Cardsuit is ( ütők , gyémántok , szívek , ásók );

C és nyelvek C-szerű szintaxissal

A C eredeti K&R nyelvjárásában nem voltak felsorolt ​​típusok, de az ANSI C szabványba bekerültek .

enum cardsuit { KLUBOK , GYÉMÁNT , SZÍVEK , ásó };

A dinamikus, gyengén tipizált nyelvek C-szerű szintaxissal (például perl vagy JavaScript ) általában nem tartalmaznak enumokat.

C++

A C++ enumok közvetlenül öröklik a C enumok viselkedését, azzal a különbséggel, hogy a felsorolt ​​típus a C++-ban valós típus, és a kulcsszó enumcsak ilyen típus deklarálásakor használatos. Ha egy felsorolásnak minősülő paraméter feldolgozásakor a felsorolásból származó bármely érték nem kerül feldolgozásra (például az egyik felsorolási elemet elfelejtették feldolgozni a konstrukcióban switch), akkor a fordító figyelmeztetést adhat ki az elfelejtett értékre. [2]

A C++11 egy második, típusbiztos enumtípust biztosít, amely nem konvertálható implicit módon integrált típussá. Ezt az "enum osztály" kifejezés határozza meg. Például:

enum class Szín { Piros , Zöld , Kék };

Az alaptípus egy bizonyos integráltípus megvalósítása, amely elég nagy ahhoz, hogy az összes felsorolt ​​értéket tartalmazza (nem kell a lehető legkisebb típusnak lennie!). A C++ nyelven közvetlenül megadhatja az alaptípust. Ez lehetővé teszi az enumok "további deklarációit":

enum osztály Szín : hosszú { Piros , Zöld , Kék }; // meg kell egyeznie a memóriatípus "long" enum class méretével és elrendezésével Alakzatok : char ; // előzetes nyilatkozat. Ha később olyan értékeket definiálnak, amelyek nem férnek el a 'char'-ban, ez hiba. C# enum Cardsuit { Klubok , gyémántok , pikkek , szívek } Java

Az eredeti Java-ban nem voltak enumok, ehelyett statikus állandókkal rendelkező osztályok használatát javasolták. Amióta az 5-ös verziójú (1.5) felsorolások bekerültek a nyelvbe, ezek egy teljes értékű osztály, amelyben tetszőleges számú mezőt és metódust adhatunk hozzá. Az enumokat a típusbiztonsági ellenőrzés javítása érdekében vezették be. [3]

enum Cardsuit { Klubok , gyémántok , pikkek , szívek } Kotlin enum class Irány { ÉSZAK , DÉL , NYUGAT , KELET }

Haskell

Egyes programozási nyelvekben (pl. Haskell) a felsorolások emulálhatók algebrai típusokkal . Például egy logikai típus, amely két azonosítót tartalmaz az igazságértékek megjelenítésére, a következőképpen van kódolva:

adatok Bool = False | Igaz

Nim

type enumType = enum one , two , three var a : enumType = három var b = két visszhang a > b

Vala

//Szokásos enum enum Színek { GREEN = 1 , BLUE , RED } //Flags enum [ Flags ] enum Borders { LEFT , RIGHT , TOP , BOTTOM } void draw_borders ( Borders selected_borders ) { // ekvivalens: if ((Borders.LEFT & selected_borders) > 0) if ( Borders . LEFT in selected_borders ) { } }

szilárdság

pragma szilárdság ^ 0,4,4 ; szerződés SimpleEnum { enum SomeData { DEFAULT , ONE , TWO } SomeData someData ; function SimpleEnum (){ someData = SomeData . ALAPÉRTELMEZETT ; } function setValues ( uint _value ){ request ( uint ( SomeData . TWO ) >= _value ); someData = SomeData ( _value ); } function getValue () konstans returns ( uint ){ return uint ( someData ); } }


Jegyzetek

  1. N. Wirth. Modulától Oberonig . Letöltve: 2008. április 17. Az eredetiből archiválva : 2011. szeptember 19..
  2. Felsorolások C++ nyelven (c++ enum típusok) . Letöltve: 2009. április 20. Az eredetiből archiválva : 2009. április 16..
  3. Enums . Letöltve: 2008. február 13. Az eredetiből archiválva : 2008. február 27..