@ Welling:
Normalerweise ist mit Codequalität z.B. die Lesbarkeit von Code gemeint. Ein Ausdruck wie:
- Code: Alles auswählen
eineFunktion(eineAndereFunktion(pointer->daten.inhalt, 0, objekt.methode(variable), NULL, nochEineFunktion(&referenz, *objekt));
ist zwar nicht wirklich falsch und würde auch kompilieren, ist aber nur sehr schwer lesbar und verständlich. Sinnvoller wäre es in lokalen Variablen die Werte von "objekt.methode(variable)", "eineAndereFunktion(...)" und "nochEineFunktion(...)" zwischen zu speichern.
Neben der Lesbarkeit spielt Kommentierung eine Rolle. Aber ganz wichtig bei der Qualität von Code ist es, dass logische und arithmetische Fehler vermieden werden müssen. z.B. ist der ausdruck
- Code: Alles auswählen
dynamischesFeld[5] = daten;
nicht falsch im Sinne eines Syntaxfehlers. Aber würde trotzdem zu einem Speicherzugriffsfehler führen, wenn "dynamischesFeld" nur eine Länge von 4 hat. Änliches Beispiel:
- Code: Alles auswählen
funktionDieEinenPointerZurückgibt()->datenAufDieDerPointerZeigt = daten;
Wenn jetzt funktionDieEinenPointerZurückgibt() keinen gültigen pointer zurückgibt (NULL), gibt es wieder einen Speicherzugriffsfehler. Um das zu vermeiden müsste man schreiben:
- Code: Alles auswählen
temporärerPointer = funktionDieEinenPointerZurückgibt();
if(temporärerPointer != NULL)
temporärerPointer->datenAufDieDerPointerZeigt = daten;
Das Ergebnis wäre das gleiche, nur dass ein Absturz im Falle, dass funktionDieEinenPointerZurückgibt() NULL zurückgibt verhindert wäre.
Noch ein Merkmal von qualitativ gutem Code ist, dass bei der Verwendung von Schleifen sichergestellt wird, dass das Programm irgendwann auf jeden Fall aus der Schleife herauskommt. Anderenfalls kommt es dazu, dass das Programm einfriert.
Schlechter Codestil beinhaltet auch manchmal Ausdrücke, die in der Sprache vorgesehen sind. z.B. die goto-Anweisung in C bzw. C++. Kein Programmierer, der sich für gut hält würde diese anweisung jemals verwenden. Sie ist nicht falsch und würde prima kompilieren und funktionieren, aber der Code wird schnell unnachvollziehbar und Fehler werden nahezu unaufspürbar.
Arithmetische Fehler gibt es auch noch:
- Code: Alles auswählen
int nenner, zähler;
unsigned int zahl;
[...]
zahl = zähler/nenner;
Hier sind gleich zwei Fehler im Code. Erstens ist es sehr unwahrscheinlich, dass zähler/nenner einen ganzzahligen Wert annimmt (dann ist zahl vom Wert her falsch) und zweitens würde zahl vom Vorzeichen falsch sein, wenn zähler oder nenner negativ sind.
Nächstes Beispiel von unsicherer Mathematik beim Programmieren:
- Code: Alles auswählen
float a, b;
std::cin >> a;
b = 1 / a;
Dieser Code soll wahrscheinlich den Kehrwert einer Zahl bestimmen. Falsch ist er auch nicht, würde aber abstürzen, wenn der Nutzer 0 eingäbe.
- Code: Alles auswählen
float a, b;
std::cin >> a;
if(a != 0)
b = 1 / a;
So wäre die Division durch 0 ausgeschlossen.
Ich hoffe du hast jetzt einen Eindruck davon, was man beim Programmieren alles trotz richtiger Syntax falsch machen kann.
Grüße, ubuntu
Wenn eine Pizza den Radius z und die Dicke a hat, ist ihr Volumen Pi*z*z*a.