The World Wide Web Consortium (W3C) has published a new Working Draft of XHTML 2.0!
If you could hardly await seeing the facts, take a look around.
Unter Scope versteht man den Bereich der Sichtbarkeit bzw. die Gültigkeit einer Variable im Programmcode.
Genauer gesagt ist der Gültigkeitsbereich einer Variablen der Programmabschnitt, für den die Variable nutzbar und sichtbar ist.
Demzufolge ist eine Variable mit kleinem Scope nur in einem kleinen Abschnitt des Programmes bekannt.
Die Variable loop_index hat in diesem Beispiel lediglich einen kleinen Gültigkeitsbereich - sie in diesem Fall nur innerhalb des Loops gültig.
Dagegen ist eine Variable mit großem Scope in vielen Teilen des Programmes bekannt.
# some code
…
# table of departments
$abteilungsleiter_zellenfarbe = $zellen_farbe;
…
# some code
…
# table of employees
$sachbearbeiter_zellenfarbe = $zellen_farbe;
# some code
…
In diesem Beispiel hat die Variable zellen_farbe einen großen Gültigkeitsbereich, da sie fast im kompletten Programm verwendet wird.
In diesem Zusammenhang muss man natürlich die Begriffe globale Varibale und lokale Variable erläutern.
Wie wir festgestellt haben, birgt die Verwendung von globalen Variablen auch ein gewisses Fehlerpotential, denn
kann es zu schwer auffindbaren Fehlern kommen, die den Programmierer zusätzliche Zeit aufgrund der Fehlersuche kosten.
Die folgende Abbildung verdeutlicht noch einmal den Unterschied zwischen einer lokalen und einer globalen Variable.
Gültigkeitsbereich von lokalen und globalen Variablen (Quelle: de.wikipedia.org)
Die Live time einer Variablen ist die Lebenszeit der Variablen.
Sie beginnt mit der ersten Referenz dieser Variable (z.B. x = 0) und endet mit der letzten Anweisung in welcher auf diese Variable referenziert wird.
# some code
…
# second reference
$abteilungsleiter_zellenfarbe = $zellen_farbe;
…
# some code
…
# last reference - end of live time of the variable zellen_farbe
$sachbearbeiter_zellenfarbe = $zellen_farbe;
# some code
…
Wird also eine Variable in Zeile 1 zum ersten Mal referenziert (1.Referenz) und in Zeile 50 zum letzten Mal (letzte Referenz), so hat die Variable eine Lebenzeit von 50 Anweisungen (Statements).
Die daraus resultierenden Vorteile liegen auf der Hand:
Wie bereits erwähnt kann man die Lebenszeit einer Variablen messen, indem man die Differenz zwischen der letzten Referenz und der ersten Referenz der Variable bildet.
Hier ein Beispiel einer zu langen Lebenszeit von Variablen:
*LR* - last reference of the variable
Die Lebenszeiten der einzelnen Variablen sind:
anzahl_noten -> (Zeile 28 - Zeile 2 + 1) = 27
durchschnittsnote -> (Zeile 69 - Zeile 3 + 1) = 67
berechnung_abgeschlossen -> (Zeile 70 - Zeile 4 + 1) = 67
Durchschnittliche Lebenszeit der Variablen -> (27 + 67 + 67) / 3 = 54
Hier nun ein weitaus besseres Beispiel mit kurzen Lebenszeiten der Variablen:
*LR* - last reference of the variable
Die Lebenszeiten der einzelnen Variablen sind:
anzahl_noten -> (Zeile 28 - Zeile 25 + 1) = 4
durchschnittsnote -> (Zeile 69 - Zeile 62 + 1) = 8
berechnung_abgeschlossen -> (Zeile 70 - Zeile 63 + 1) = 8
Durchschnittliche Lebenszeit der Variablen -> (4 + 8 + 8) / 3 = 7
Wie man gut erkennen kann, wurden in diesem Beispiel die Variablen so nah wie möglich zur ersten Referenz initialisiert (siehe: Initialisiere die Variable so “nah†wie möglich bei der ersten Verwendung).
Der Unterschied der durchschnittlichen Lebenszeiten der Variablen ist beachtlich:
54 zu 7!
Deshalb ist es eindeutig, dass das 2.Beispiel bei weitem das bessere der beiden ist.
Zusammenfassend, hier nun einige Tipps um die Lebenzeit von Variablen zu verkürzen.
Wenn man die Zählvariable direkt vor dem Loop initialisiert, hat man sie gleich mit der Schleife im Blickfeld und muss nicht erst lang suchen.
Wenn der Loop nun geändert wird, denkt man zwangsläufig an eventuelle Anpassungen der Zählvariable, weil sie ja unmittelbar mit dem Loop in Verbindung steht.
Siehe auch Achte auf Zählvariablen
Somit kann man sich langes Suchen sparen und weiß sofort wo der Wert zugewiesen wurde.
Siehe auch Initialisiere die Variable so “nah†wie möglich bei der ersten Verwendung
Es ist bedeutend einfacher, aus einer lokalen Variable eine globale variable zu machen.
Der umgekehrte Weg kann jedoch, je nach Komplexität des Programmes, immense Schwierigkeiten bereiten.
Demnach sollte der Programmierer stets bestrebt sein, globale Variablen zu vermeiden und stattdessen, lokale Variablen zu nutzen.
Durch die Trennung in mehrere kleinere Routinen wird das Programm einerseits modularer und andererseits wird der Scope (also die Sichtbarkeit) der Variablen minimiert.
Allerdings sollte ein Programm auch gut lesbar sein!
Gute Lesbarkeit erreicht man jedoch nicht, wenn jede Routine eines Programmes auf jede Variable im Programm zugreifen kann!
Vielleicht fragen sich einige von euch, was daran so schwer sein soll - ist doch ganz einfach eine Variable zu initialisieren.
Die Initialisierung der Variable als Aktion ist ja auch nicht der Sachverhalt, welcher hier besprochen werden soll.
Viel entscheidender ist in diesem Zusammenhang der Prozess der Initialisierung einer Variable.
Ungeeignete Dateninitialisierung ist eine der Hauptprobleme in der Software-Entwicklung.
Mögliche Fehlerursachen sind:
Im folgenden nun einige Tipps zur korrekten Initialisierung von Variablen.
Dadurch erstickst du bereits einen Großteil der Initialisierungsfehler im Keim.
Zu Beginn ein eher schlechtes Beispiel einer Variableninitialisierung:
‘ initialize all variables
anzahl_der_noten = 0
durchschnittsnote = 0.00
berechnung_abgeschlossen = False
…
‘ code using anzahl_der_noten
…
‘ code using durchschnittsnote
…
‘ code using berechnung_abgeschlossen
while Not berechnung_abgeschlossen
…
Hier kann man gut erkennen, das die Spanne zwischen Deklaration und Initialisierung der Variablen und der ersten Nutzung dieser sehr groß ist.
Je größer die Spanne ist, umso unübersichtlicher und fehlerbehafteter kann der Code werden.
Folgendes lässt sich hierzu sagen:
Hier nun ein weitaus besseres Beispiel:
Dim durchschnittsnote As Double
durchschnittsnote = 0.00
‘ code using durchschnittsnote
…
Dim berechnung_abgeschlossen As Boolean
berechnung_abgeschlossen = False
‘ code using berechnung_abgeschlossen
while Not berechnung_abgeschlossen
…
Dieses Beispiel ist viel übersichtlicher und eindeutig besser lesbar als das erste Beispiel.
Man muss sich nämlich nicht fragen, wo die verwendete Variable auf einmal herkommt und von welchem Typ sie ist bzw. mit welchem Wert sie vorbelegt ist - man sieht es sofort.
Wird häufig genutzt bei Klassen-Konstanten, Eingabeparametern oder sonstigen Variablen, die vor dem Überschreiben nach deren Initialisierung geschützt werden sollen.
Besonders bei Zählvariablen ist größte Sorgfalt geboten.
Achte darauf, dass man Zählvariablen (i,j,k,sum) stets neu initialisieren muss, bevor man sie wieder benutzt (sonst wird aus der Summe sum nach dem nächsten Durchlauf sum+sum)
Variablen der Klasse sollte im Konstruktor der Klasse initialisiert werden.
Zugeteilter Speicher im Konstruktor sollte im Destruktor wieder freigegeben werden.
Sollte eine verwendete Variable reinitialisiert werden, so muss man prüfen wo die Variable erneut initialisiert werden soll.
Dies ist wiederum abhängig von der Nutzung der jeweiligen Variable.
Wird die Variable innerhalb eines Loops genutzt, so muss man sie vor dem Loop neu initialisieren.
Wird sie jedoch zum Austausch von Daten zwischen mehreren Routinen benutzt, so sollte sie auch an der dazugehörigen Stelle in der jeweiligen Routine neu initialisiert werden.
Variablen die Konstanten namenhaft nachbilden sollen, können am Anfang des Programmes initialisiert werden (vielleicht mit einer Initialize-Routine o.ä.).
Echte Variablen sollten, wie bereits erwähnt, so nah wie nur möglich am Verwendungsort initialisiert werden.
Soll beispielsweise eine Routine am Ende des Programmes nun statt einmal mehrmals aufgerufen werden, werden die Variablen, welche in der Initialize-Routine initialisiert worden sind, nicht mehr neu initialisiert, da diese Routine ja nur am Anfang des Programmes ausgeführt wird.
Das kann mitunter sehr schwerwiegende Folgen für die weitere Ausführung des Programmes haben und muss vom Programmierer abgefangen werden.
Sei dankbar über jede Warnung des Compilers, er habe eine nicht initialisierte Variable gefunden.
Eingabewerte sollten vor einer Zuweisung einer Plausibilitätsprüfung unterzogen werden, um so bereits unsinnge Werte auszuschließen.
Wenn man den Begriff Variable im Zusammenhang mit Programmierung hört, denkt man sich mitunter “Was gibt es dazu großartiges zu sagen - ist doch ganz einfach”.
Um jedoch einen guten und vorallem sauberen, gut lesbaren Code zu entwickeln, sollte man sich dennoch an ein paar Richtlinien halten.
A new stable version of streber released today.
This release fixes some of the issues of the last development release, adds translation to Slovak and a very cool new theme by Mats Djärf.
major
Minor
You can download the latest version (0.065) here.