Spartanisch Programmieren
Jeff Atwood hat einen Beitrag geschrieben dem ich mich voll und ganz anschließen kann: Programmiere spartanisch!
Im Laufe der Zeit hat sicher jeder Software Entwickler seinen persönlichen Stil weiter entwickelt. Was mir persönlich dabei sehr geholfen hat und weiterhin hilft ist das Lesen fremden Codes. In Zeiten von Open Source ist es kein Problem sich dazu mit “Futter” zu versorgen. Lesen von fremdem Code dient mir dazu zu reflektieren was ich am jeweiligen Code gut bzw. schlecht finde.
So befolgte ich früher z.B. die “single exit” Regel die besagt, dass eine Methode nur an einer Stelle verlassen werden sollte. Zu C++ Zeiten war das ein Rat der zumindest nicht ganz in die falsche Richtung führte wenn man an die Probleme der “Speicherverwaltung zu Fuß” denkt. Heute plädiere ich vehement für “fast exit”. In einer Methode prüfe ich zunächst alle Voraussetzungen die erfüllt sein müssen und verlasse die Methode sofort sobald eine der Voraussetzungen nicht erfüllt ist. Im Ergebnis nimmt die Schachtelungstiefe ab, der Code wird lesbarer.
Vereinfacht dargestellt (Pseudocode):
public void DoSomething() { if (a) { if (b) { if (c) { DoItRealy(); } } } } public void DoSomething() { if (!a) { return; } if (!b) { return; } if (!c) { return; } DoItRealy(); }
Zu dieser und ähnlichen Erkenntnissen kann man gelangen, in dem man fremden Code studiert. Schneller kommt man vermutlich voran wenn man sich (zusätzlich!) mit Empfehlungen anderer Software Entwickler auseinandersetzt. Eine schöne Gelegenheit dazu bietet dieser Text über spartanisches Programmieren.
So sind z.B. die beiden folgenden Betrachtungsweisen über Komplexität sehr nützlich:
- Horizontal: Verschachtelungstiefe von Kontrollstrukturen sowie Zeilenlänge
- Vertikal: Anzahl Zeilen einer Methode oder Klasse
Bei der Anzahl von Zeilen und der Zeilenlänge bemühe ich mich schon lange diese zu reduzieren. Die Verschachtelungstiefe dagegen habe ich noch nicht so lange im Blickfeld.
Tags: .NET
July 23rd, 2008 at 12:15
Agree!
Immer wieder “gerne” gesehen ist auch:
void foo(object bar)
{
if(! bar == null)
{
a;
b;
c;
d;
e;
f;
g;
//weitere 1000 Zeilen folgen
}
}
July 23rd, 2008 at 20:38
Kann ich nur voll und ganz zustimmen!
Early returns haben noch den Vorteil das Code dadurch besser strukturiert wird und daher einfacher zu lesen sind. Das Beispiel spricht sehr für die deklarative Programmierung.
Ich habe einmal die Empfehlung gelesen nicht mehr als 100 Zeichen in eine Zeile zu schreiben. Alles was länger als eine Bildschirmseite ist,
lagere ich in eine weitere Funktion Methode aus (Ausnahmen gibt es immer). Meist funktioniert diese Logik aber, da im Normalfall nicht mehr als eine Bildschirmseite an Code verwendet werden muss um Logik festzuhalten. Zumal wir ja auch nur ein begrenztes Aufnahmevermögen besitzen.
Stellt euch die Sicht auf den Code wie Google Earth vor. Ich fange ganz
oben auf der Weltkarte an um mir einen Überblick zu verschaffen, und je
mehr nicht nach geeigneten Ortschaften suche, desto Weiter runter gehe
ich mit der Ansicht. Das hilft sich besser zu orientieren. Stellt euch
mal vor ihr seit auf einer Ansicht 50 Meter über dem Ort. Also sehr weit
in die Karte gezoomt und wollte jetzt nach Amerika. könnte etwas länger
dauert, dort genau die richtige Orientierung zu finden. Was machen wir?
Zoomen heraus.
Diesen vorgang praktiziere ich in meinem Quellcode genau so. Durch die
Kapselung und Strukturierung in kleine Funktionen wird der Inhalt
häppchenweise presäntiert. Ich bewege wich dadruch auf einer groben oder feinen Strukturiereung.
July 24th, 2008 at 18:57
@Rainer:
in einem C++ Kurs vor Jahren wurde uns sogar beigebracht, daß eine Klasse nicht mehr wie eine Bildschirmseite ausfüllen soll. Soweit die Theorie.
Ich stimme Stefan zu, der Code ist detulich lesbarer.
Ich sollte mal öfters Stefan’s Code lesen
July 24th, 2008 at 19:37
@Sven: im ersten Moment dachte ich ja, “na soviel Gelegenheit wird er nicht haben meinen Code zu lesen denn bislang habe ich nur mein NHibernate Plugin als Open Source veröffentlicht”. Bis mir dann beim Vornamen etwas dämmerte
))
Dass du jetzt auch bloggst finde ich Klasse! Und das Buch von Bob Martin solltest du sofort lesen. Es lohnt sich! Und direkt danach dann Eric Evans, Domain Driven Design.