Relativ einfach. Er könnte problenlos schon am Anfang die Prüfung mit auf den negativ fall durchführen, und wenn dieser eintritt, die Funktion verlassen. Das Spart einem eine Verschachtelung für den Rest der Funktion. Es macht den Quellcode deutlich übersichtlicher. Man mag jetzt meinen das sei unwichtig, aber wenn man schon eine so kleine Lib veröffentlicht, dann doch wenigstens sauber und aufgeräumt. Welchen Eindruck hinterlesst den sowas bitte?
Bei Heise gab es dazu auch einige Threads mit weiteren Beispielen.
anders herum kann man aber auch sagen, das eine Funktion nur einen Exitpunkt haben sollte, weil das macht Code auch dahin gehend besser,das man durch die Struktur Fehler vermeidet, weil eine klare Line vorhanden ist. Laufzeit technisch macht es kein unterschied, wenn man den negativen Fall zu erst abprüft.
Das nur mal so als Gedankengang, was gut oder schlechter Code. Das was für einen gut ist, ist für den anderen Chaos
Ich gebe dir Grundsätzlich recht das es Situationen gibt in denen es nicht angebracht ist einzig auf die Verschachtelung zu achten, aber in diesem Fall bin ich absolut der Meinung das die Struktur nicht sinnvoll ist.
Zumal, wenn man sich den rest des Quellcodes ansieht, deutlich wird das wir hier nicht mit einem Code zu tun haben der absolut einer logischen Linie folgt. Ich habe den Quellcode mal überflogen, und etwa 20 Stellen gefunden die ich als unschön oder gar falsch ansehen würde. Sprachvermischungen, unklare Variablennamen, unschöne Strukturen und co. sind in dem Quellcode leider mehrfach zu finden, ebenso rein deutsche Fehlermeldungen. Ich bin mir auch bei meinem Beispiel oben sicher das die Entscheidung nicht, wie bei dir angenommen, aus dem Gedanken der Anzahl der Ausstiegspunkte erfolgt ist, sondern rein weil es so schnell geschrieben war.
Ein Zitat das mir dazu aus einem Coding Styleguide des Linux Kernels einfällt:
"The answer to that is that if you need more than 3 levels of indentation, you're screwed anyway, and should fix your program."
Übrigens wiedersprechen sich deine Aussage und meine an sich auch nicht. Auch hier gibt es Beispiele im Coding Styleguide.
int fun(int ) { int result = 0; char *buffer = kmalloc(SIZE);
if (buffer == NULL) return -ENOMEM;
if (condition1) { while (loop1) { ... } result = 1; goto out; } ... out: kfree(buffer); return result; }
Ein frühes prüfen der Grundwerte um eine unnötgie Verschachtelung zu vermeiden, aber dennoch für die spätere Nutzung in der Funktion ein gemeinsamer Ausstiegspunkt, hier allerdings über Goto gelöst.
Allerdings, wie gesagt glaube ich nicht das sich der Entwickler solche Gedanken darüber gemacht hat.
Kannst du mir das erklären?
Das Spart einem eine Verschachtelung für den Rest der Funktion. Es macht den Quellcode deutlich übersichtlicher.
Man mag jetzt meinen das sei unwichtig, aber wenn man schon eine so kleine Lib veröffentlicht, dann doch wenigstens sauber und aufgeräumt. Welchen Eindruck hinterlesst den sowas bitte?
Bei Heise gab es dazu auch einige Threads mit weiteren Beispielen.
Hammer, den muss ich mir merken!
Das nur mal so als Gedankengang, was gut oder schlechter Code. Das was für einen gut ist, ist für den anderen Chaos
Zumal, wenn man sich den rest des Quellcodes ansieht, deutlich wird das wir hier nicht mit einem Code zu tun haben der absolut einer logischen Linie folgt.
Ich habe den Quellcode mal überflogen, und etwa 20 Stellen gefunden die ich als unschön oder gar falsch ansehen würde. Sprachvermischungen, unklare Variablennamen, unschöne Strukturen und co. sind in dem Quellcode leider mehrfach zu finden, ebenso rein deutsche Fehlermeldungen.
Ich bin mir auch bei meinem Beispiel oben sicher das die Entscheidung nicht, wie bei dir angenommen, aus dem Gedanken der Anzahl der Ausstiegspunkte erfolgt ist, sondern rein weil es so schnell geschrieben war.
Ein Zitat das mir dazu aus einem Coding Styleguide des Linux Kernels einfällt:
"The answer to that is that if you need more than 3 levels of indentation, you're screwed
anyway, and should fix your program."
Übrigens wiedersprechen sich deine Aussage und meine an sich auch nicht. Auch hier gibt es Beispiele im Coding Styleguide.
int fun(int )
{
int result = 0;
char *buffer = kmalloc(SIZE);
if (buffer == NULL)
return -ENOMEM;
if (condition1) {
while (loop1) {
...
}
result = 1;
goto out;
}
...
out:
kfree(buffer);
return result;
}
Ein frühes prüfen der Grundwerte um eine unnötgie Verschachtelung zu vermeiden, aber dennoch für die spätere Nutzung in der Funktion ein gemeinsamer Ausstiegspunkt, hier allerdings über Goto gelöst.
Allerdings, wie gesagt glaube ich nicht das sich der Entwickler solche Gedanken darüber gemacht hat.