Dieser Blog wird ab Januar 2013 nicht mehr benutzt! Dann blogge ich ausschließlich auf meinem neuen Blog unter beyermatthias.de/blog! Bis dahin werden alle Artikel auf beiden Blogs erscheinen.
Ich wurde auf Google+ gefragt, wie man denn schönen Code schreibt, nachdem ich einen Artikel über den unleserlichen Code des Standard-Octopress-Themes bzw. des Themes, welches ich für diesen Blog geforked habe, geschrieben habe.
Dies ist mein zweiter Teil zu diesem Thema.
Do it the right way
Es gibt in vielen Sprachen verschiedene Wege ein Teilproblem zu lösen. So bietet C die Möglichkeit, Klammern um einen If-Block zu setzen oder sie weg zu lassen, wenn in dem Block nur eine einzige Anweißung steht. Außerdem gibt es dann noch die ganz kurze Schreibweiße mit Fragezeichen und Doppelpunkt Syntax.
Folgend ein paar Beispiele.
if ( i == 5 ) {
return 5;
}
else {
return i+1;
}
/* oder */
if ( i == 5 )
return 5;
else
return i+1;
/* oder */
i == 5 ? return 5 : return i+1;
Es ist wichtig zu wissen, dass man diese Möglichkeiten hat. Aber noch wichtiger ist es, zu wissen wann man diese Möglichkeiten nutzen sollte und wann nicht. So ist die letzte der drei aufgezeigten Möglichkeiten die, die am schnellsten unübersichtlich wird. Man sollte sie auf keinen Fall bei komplizierten If-Anweisungen verwenden. Ich verwende sie gar nicht, einfach aus Prinzip.
Die zweite der drei aufgezeigten Möglichkeiten ist zwar schick, aber wenn noch etwas dazu kommt, also mit in den If-Block, müssen die Klammern recht mühsam hinzugefügt werden. Deswegen nehme ich meistens die erste Variante.
Ein allgemeines Kochrezept gibt es natürlich nicht und es ist von der Situation abhängig, welche Schreibweiße man benutzt. Solange man den Code so übersichtlich wie möglich hält, ist es meiner Meinung nach auch kein Problem die verschiedenen Arten der If-Syntax zu vermischen.
Loop vs. Block
Eine weitere Sache, die mir vor kurzem aufgefallen ist, sind manche for-Schleifen (speziell jetzt in C), die man als einzige Schleife schreiben kann, ganz ohne Block.
So sind folgende Codeabschnitte äquivalent:
/* erste Variante */
for( del_pos_found = 0, i = 0;
i < m->cnt_set_elements &&
!del_pos_found;
i++ ) {
del_pos_found = 0 == memcmp(&m->elements[i], del, sizeof(*del));
}
/* zweite Variante */
for( i = 0;
i < m->cnt_set_elements &&
0 != memcmp(&m->elements[i], del, sizeof(*del));
i++ );
Die Frage ist nur: Welchen nehmen?
Ich habe das auch auf stackoverflow gefragt und folgende Antwort erhalten: Wenn man so “schwere” Funktionsaufrufe wie memcmp() machen muss, sollte man die Variante mit Block wählen, andernfalls ist die ohne Block durchaus okay.
Wichtig ist, wie hier auch zu sehen ist, dass der Code übersichtlich gehalten wird. Hier habe ich das mit Zeilenumbrüchen versucht zu realisieren.
Next Time
Und wieder will ich diese Reihe an dieser Stelle nicht beenden, sondern einen weiteren Artikel in Aussicht stellen. Wann dieser kommen wird, weiß ich allerdings noch nicht.
Gefällt mir:
Gefällt mir Lade...