Wat is een opsomming in programmeertalen?
Richard Drury/Iconica/Getty Images
Afkorting van opsomming, een opsomming variabel type is te vinden in C (ANSI, niet de originele K&R), C++ enC#. Het idee is dat in plaats van een int om een reeks waarden weer te geven, wordt in plaats daarvan een type met een beperkte reeks waarden gebruikt.
Als we bijvoorbeeld de kleuren van de regenboog gebruiken, namelijk:
- Rood
- Oranje
- Geel
- Groente
- Blauw
- Indigo
- paars
Als opsommingen niet bestonden, zou je een kunnen gebruiken #definiëren (in C) of const in C++/C# om deze waarden op te geven. bijv
Te veel ints om te tellen!
Het probleem hiermee is dat er veel meer zijn ints dan kleuren. Als violet de waarde 7 heeft, en de programma een waarde van 15 toewijst aan een variabele, dan is het duidelijk een bug, maar wordt deze mogelijk niet gedetecteerd omdat 15 een geldige waarde is voor een int.
Enums to the Rescue
Een enum is een door de gebruiker gedefinieerd type dat bestaat uit een set benoemde constanten die enumerators worden genoemd. De kleuren van de regenboog zouden als volgt in kaart worden gebracht.:
Nu zal de compiler intern een int gebruiken om deze vast te houden en als er geen waarden worden opgegeven, is rood 0, oranje 1 enz.
Wat is het voordeel van een Enum?
Het punt is dat regenboogkleuren is een type en alleen andere variabelen van hetzelfde type kunnen hieraan worden toegewezen. C is gemakkelijker in de omgang (dwz minder strikt getypt), maar C++ en C# staan geen toewijzing toe tenzij je het forceert door een cast te gebruiken.
Hier zit je niet aan vast compiler gegenereerde waarden, kunt u er uw eigen integer-constante aan toewijzen, zoals hier wordt weergegeven.
Het is geen vergissing om blauw en indigo met dezelfde waarde te hebben, aangezien enumerators synoniemen als scharlaken en karmozijn kunnen bevatten.
Taalverschillen
In C, de variabele verklaring moet worden voorafgegaan door het woord opsomming als in
In C++ is het echter niet nodig als regenboogkleuren is een apart type dat het voorvoegsel van het type enum niet nodig heeft.
In C# zijn de waarden toegankelijk via de typenaam zoals in
Wat is het nut van Enums?
Het gebruik van opsommingen verhoogt het abstractieniveau en laat de programmeur nadenken over wat de waarden betekenen in plaats van zich zorgen te maken over hoe ze worden opgeslagen en geopend. Dit vermindert het optreden van bugs.
Hier is een voorbeeld. We hebben een set verkeerslichten met drie lampen- rood , geel en groente . In het VK verandert de volgorde van verkeerslichten in deze vier fasen.
- Beide Rood en Geel - Verkeer Nog steeds gestopt, maar lichten staan op het punt op groen te springen.
- Ze beperken de waarden die de variabele enum kan aannemen.
- Ze dwingen je na te denken over alle mogelijke waarden die de opsomming kan aannemen.
- Ze zijn een constante in plaats van een getal, waardoor de leesbaarheid van de broncode
Voorbeeld van verkeerslicht
De lichten worden bestuurd door naar de onderste drie bits van een besturingsbyte te schrijven. Deze zijn hieronder als een bitpatroon in binair weergegeven, waarbij RYG de drie bits vertegenwoordigt. Als R 1 is, brandt het rode lampje enz.
In dit geval is het gemakkelijk te zien dat de vier bovenstaande toestanden overeenkomen met de waarden 4 = Rood aan, 6= Rood + Geel beide aan, 1 = Groente aan en 2 = Geel Aan.
Met deze functie
Een klasse gebruiken in plaats van opsommingen
In C++ en C# moeten we een klasse maken en dan overbelasten de operator | toelaten OF-ing van soorten verkeerslichten .
Door het gebruik van enums voorkomen we problemen met het toewijzen van andere bits aan de bulb-stuurbyte. Het kan zijn dat sommige van de andere bits de zelftest of een 'Green Lane'-schakelaar regelen. In dat geval kan een bug die ervoor zorgt dat deze bits voor normaal gebruik worden ingesteld, grote schade aanrichten.
Om zeker te zijn, zouden we de stukjes in de maskeren Verkeerslichten instellen() functie dus het maakt niet uit welke waarde wordt doorgegeven, alleen de onderste drie bits worden gewijzigd.
Conclusie
Enums hebben deze voordelen: