Tutorial: Enums / Aufzählungen HowTo

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

 

Shaman

Betreff: Tutorial: Enums / Aufzählungen HowTo

BeitragMo, Nov 07, 2011 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Vorwort:

Dieses Tutorial ist an die gerichtet, die von anderen OOP-Sprachen (wie Java) kommen und an die,

die ihre Programme möglichst objektorientiert schreiben möchten.

Was ist ein Enum
Enum oder Enumeration ist englisch für Aufzählung.
Mit Aufzählung ist eine Reihe von Konstanten zum Beschreiben eines Zustandes.

Beispiel:
Die GUI-Programmierer unter uns haben Enums sicher schon angewendet.
Sie sind z.B. beim erstellen von Buttons zu finden:
BlitzMax: [AUSKLAPPEN]
CreateButton(..., BUTTON_OK)

Dieses BUTTON_OK beschreibt den Zustand des Buttons und ist somit die einfachste Form eines Enums.

Bei der Aufzählung kann man 3 verschiedene Methoden unterscheiden.
Diese sind zunehemend komplexer, aber auch objektorientierter.

Die einfachste Aufzählung
Besteht aus einer Reihe von Integer-Konstanten:
BlitzMax: [AUSKLAPPEN]

Const BUTTON_OK:Int = 1
Const BUTTON_RETURN:Int = 2
'... (Werte weichen ab)

und benutzt wird es z.B. so:
BlitzMax: [AUSKLAPPEN]

Function TestButton(buttonType:Int)
Select buttonType
Case BUTTON_OK '...
Case BUTTON_RETURN '...
End Select
End Function
'und Aufruf:
TestButton(BUTTON_OK)


Diese Variante eignet sich gut für sehr kurze und kleine Aufzählungen.


2. Variante: Kapselung
Kapselung ist ein großes Wort. Es heißt, die Zusammenfassung von Befehlen und Attribute in einer Klasse.
Dies könnte z.B. so aussehen:
BlitzMax: [AUSKLAPPEN]

Type TButtonEnum
Const OK:Int = 1
Const ESCAPE:Int = 2
End Type

und die Benutzung:
BlitzMax: [AUSKLAPPEN]

Function TestButton(buttonType:Int)
Select buttonType
Case BUTTON.OK 'Unterschied liegt im . statt _
Case BUTTON.ESCAPE '...
End Select
End Function
'und Aufruf:
TestButton(BUTTON.OK)


Diese Variante ist mehr Klassenorientier, bietet allerdings keine neuen Prinzipien.
Ich benutzte diese Variante für häufig benutzte, kleine Aufzählungen

Denn das Problem ist:
Die Abfrage/Parameterübergabe ist nicht typesave, d.h. du kannst z.B. aufrufen:
BlitzMax: [AUSKLAPPEN]

'... siehe oben
Const COLOR_RED:Int = 1

TestButton(COLOR_RED) 'ist vom Compiler erlaubt, gleiches Ergebnis wie bei BUTTON.OK
'obwohl ganz anderer Sinn


Um dieses Problem zu lösen, gibt es eine Methode, die Enumerations mit Type-Instanzen zu realisieren:

3. Variante: Auf Type-Instanzen basierend

Die Aufzählungs-"Optionen" sind nun Type-instanzen.
Dadurch werden beim Vergleich (siehe Beispiel) die Zeiger auf Instanzen verglichen!
Da diese immer die selben bleiben funktionniert dies.

Die Typesicherheit erfolgt dadurch, dass der Compiler einen Fehler ausgibt, wenn Zeiger auf Instanzen unterschiedlichen Types verglichen werden sollen.

In der Umsetztung:
BlitzMax: [AUSKLAPPEN]

Type TButtonEnum
Global OK:TButtonEnum = New TButtonEnum
Global ESCAPE:TButtonEnum = New TButtonEnum
End Type

und die Benutztung:
BlitzMax: [AUSKLAPPEN]

Function TestButton(buttonType:TButtonEnum)
If buttonType = TButtonEnum.OK Then '...
Else If buttonType = TButtonEnum.ESCAPE Then '...
EndIf
End Function

'Aufruf:
TestButton(TButtonEnum.OK)
'man sieht, der Aufruf verändert sich nicht, nur die Implementierung ist anders!

'So etwas ist jetzt nicht mehr erlaubt (vom Compiler)
TestButton(COLOR_RED) 'Error: cannot cast from int to TButtonEnum (oder so)


Diese Variante ist die Sicherste von allen vorgestellten.
Ich benutzte sie für alle größeren Aufzählungen.


Weiterführend:
Diese Variante kann noch mit "Extras" ausgestattet werden. Diese sind z.B.
- Elemente besitzten eine ID und einen Namen
- sie können durch die ID od. Namen gespeichert werden
- Function fromID gibt Enumeration-Element passend zur übergebenen ID zurück
- Function fromName selbe wie oben, blos mit Namen.

Da diese zum Teil sehr schreibintensiv sind, habe ich eine Funktion geschrieben, die so eine Aufzählung mit den gewünschten Eigenschaften erstellt:
Funktion im Codearchiv

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group