AE Android Kochbuch Exkurs: Flags. Spass mit Flaggen.

Dieser kleine Exkurs beschäftigt sich mit Flags. Deutsch: Flaggen und warum sie für uns in der Programmierung nützlich sind! Kurz gefasst: Mit Flags können Programmierer Spaß haben.

Schon in der bekannten Fernsehserie Big Bang Theorie wurde der Witz aufgenommen. Durch die deutsche Übersetzung Spaß mit Flaggen ist aber wohl die Ursprünglichkeit verloren gegangen. Hätte man das englische Original Fun with flags verwendet, hätten Programmierer landein / landauf die Anspielung auf ihren Alltag verstanden. Das Thema flags ist auch nicht auf Android Programmierung beschränkt, sondern zieht sich durch (fast alle) Programmiersprachen!

Wir kennen es aus dem Alltag. Am Strand ist eine rote Flagge aufgezogen, um zu zeigen, dass die Wellen heute übel sind. Wenn der Eiswagen kommt und noch Eis zum Verkauf hat, hängt er eine Flagge raus. Dasselbe Konzept verfolgen wir in der EDV. Leider ohne Eis und ohne Strand zum Schwimmen.

Flags in der Programmierung sind hier so etwas wie Markierungsfahnen. Mit ihnen signalisieren und merken wir uns bestimmte Zustände, die wir an anderer Stelle abfragen. Entscheidend ist das Abfragen an anderer Stelle. Wenn wir sofort ein Eis wollen, könnten wir auch zum Eiswagen sprinten, kaum dass er angekommen ist. Wollen wir später ein Eis, schauen wir nach, ob die Flagge noch weht und fällen dann unsere Entscheidung: losgehen oder nicht. Kurz: wenn wir sofort etwas wollen, brauchen wir keine Flags. Dann können wir es auch machen. Daher verwenden wir Flags als Markierung für später.

Fahnen mit drei Zustände

Eine Fahne kann hoch oder runter sein oder gar nicht vorhanden. In der Programmierung nennen wir das true, false, undefiniert. Ein Flag in einem Programm wird mindestens 2x verwendet: an einer Stelle wird es gesetzt und an mindestens einer (anderen) Stelle abfragt.

Für den praktischen Ablauf sind true oder false die am häufigsten gebräuchlichen Zustände. Ich verwende Flags häufig, um mir Marker über Ereignisse zu setzen, die ich später an anderen Stellen im Programmcode benötige. So nach dem Motto: Wenn ich in zwei Stunden ein Eis will, schaue ich dann nach ob die Fahne vom Eiswagen noch weht. Ist das der Fall ist ist der Wagen noch da und hat noch Eis. Ist die Fahne unten gibt es kein Eis mehr.

Der undefined Zustand wird zwar selten verwendet, ihr müsst ihn aber im Hinterkopf behalten. Wenn ihr ein Flag nur deklariert aber nicht auf true oder false setzt, dann ist sein Zustand unbekannt. Dann könnt ihr auch keine Entscheidung fällen, ob ihr zum Eiswagen geht. Also könnt ihr den undefined Zustand in der Regel nicht für sinnvolle Abfragen verwenden. (Ich schreibe das mal ganz vorsichtig. Es gibt immer wieder Experten, die auch diesen Zustand für ihre Programmierung ausnutzen. Was auch kein Problem ist, wenn man weiß, was man tut.)

Fahne setzen

Übersetzt in Programmcode heißt das dann so etwas wie: if (flag == gesetzt) oder in anderer Schreibweise if (flag) dann tue irgend etwas. Sonst mache nichts oder etwas anderes.

Das typische Konstrukt zum Setzen eines Flags sieht daher so aus:

boolean flagnewfile;    //Hier wird es deklariert
if (..irgendeine Bedingung existiert)
   flagnewfile = true;
else
   flagnewfile = false;

In der Programmierung von C oder Java lässt sich das auf die Zeile verkürzen

boolean flagnewfile = (irgendeine Bedingung existiert) ? true : false;

Die verkürzte Schreibweise spart haufenweise Zeilen und lässt euren Code gleich professioneller aussehen! Und sie erledigt das Gleiche wie die fünf Zeilen oben drüber. Es gilt: ist der Ausdruck links neben dem ? true – dann gilt der Wert rechts neben dem Fragezeichen, ansonsten der Werte nach dem : . Die Klammern sind technisch bei den meisten Sprachen nicht notwendig. Ich setze sie aber wg der besseren Übersichtlichkeit.

In dem Beispiel verwenden wir das Flag flagnewfile, um zu markieren, ob eine Datei schon existiert (true) oder noch nicht (false).

boolean flagnewfile = (myFile.exist ()) ? true : false;
boolean flagwasauchimmer = (1+1=2) ? true : false;

Eines haben wir noch nicht besprochen: die Lebensdauer! Über diese müsst ihr euch im klaren sein. Wenn ihr euer Flag nur innerhalb einer Methode benötigt, reicht es aus, sie auch nur dort zu deklarieren und initialisieren. Sollen sie irgendwo in der Klasse in einer oder mehreren Methoden verwendet werden, solltet ihr sie am Anfang der Klasse als private static deklarieren und dann bei Bedarf dort initialisieren, wo es anfällt.

Flags abfragen

Wenn ihr das Flag an anderer Stelle abfragen wollt kommt in der Regel aber nicht immer die if Abfrage ins spiel:

if (flag) {
   //jetzt tue etwas
}

Ihr könnt natürlich auch eine while-Schleife mit einem Flag steuern. Beispiel:

boolean flag = true;
while (flag) {
   tue jetzt was......
   und irgendwo: 
   flag = false; //dann wird die Schleife verlassen
}

Am Beispiel oben seht ihr auch, wie wichtig es ist, dass ihr sicherstellt, dass ein Flag nicht undefiniert ist. Sonst wird der ganze while Loop gar nicht durchgeführt!

Für die Abfragen haben sich verschiedene Schreibweisen durchgesetzt, die ihr nach Belieben verwenden könnt:

Bedingung Schreibweise kurze Alternative
Wenn Flag gesetzt if (flag == true) if (flag)
Wenn Flag nicht gesetzt if (flag == false) if (!flag)

Flags werden euch oftmals das Programmierer-Leben erleichtern. Ihr könnt sie an beliebigen Stellen einbauen und nutzen. Aber Vorsicht: Ihr solltet sie auch immer ausreichend dokumentieren, damit auch eine andere Person versteht, was ihr mit einem Flag bezweckt!

 


Text und Entwurf. (c) AE SYSTEME Testcenter, Hans-J. Walter
Hans-J. Walter ist Programmierer für Windows DOT.NET / C# und Android und als eingetragener, unabhängiger Journalist verantwortlich für Fachberichte und Schulungstexte über Technik u. Entwicklung. hjw@terminal-systems.de

Für diese und alle nachfolgenden Seiten gilt ebenso der obligatorische Hinweis: Alle Angaben ohne Gewähr. Bilder und Codes zeigen Beispiele. Diese Beschreibung bezieht sich auf unsere Installation und stellt keine Bewertung der verwendeten Techniken da. Fehler und Irrtümer vorbehalten!

 

Schreibe einen Kommentar