Code wird ungefĂ€hr zehnmal öfter gelesen als geschrieben â und meistens von jemandem, der den Zusammenhang nicht mehr im Kopf hat. Oft bist das du selbst, drei Monate spĂ€ter.
Namen sind das einzige Mittel, mit dem der Code seinem Leser etwas erklÀren kann, ohne dass jemand einen Kommentar pflegen muss. Sieh dir an, was das ausmacht:
public List<int[]> GetThem()
{
var list1 = new List<int[]>();
foreach (var x in theList)
if (x[0] == 4)
list1.Add(x);
return list1;
}Das ist syntaktisch tadellos und vollstĂ€ndig unverstĂ€ndlich. Nicht wegen der KomplexitĂ€t â die Methode hat vier Zeilen â sondern weil kein einziger Name etwas verrĂ€t.
Die Fragen, die offenbleiben: Was steht in theList? Was bedeutet Index 0? Was bedeutet der Wert 4? Was tut der Aufrufer mit dem Ergebnis?
Dieselbe Methode, mit demselben Ablauf und derselben Anzahl Zeilen:
public List<Zelle> HoleMarkierteZellen()
{
var markierte = new List<Zelle>();
foreach (var zelle in _spielfeld)
if (zelle.IstMarkiert)
markierte.Add(zelle);
return markierte;
}Nichts wurde vereinfacht
Die Struktur ist identisch â dieselben Zeilen, dieselbe Schleife, dieselbe Bedingung. VerĂ€ndert wurden ausschliesslich Namen und ein Typ. Der gesamte VerstĂ€ndnisgewinn kommt daher, dass der Code jetzt sagt, worĂŒber er redet.
Magische Zahlen sind Namen, die fehlen
Der Wert 4 im ersten Beispiel war eine magische Zahl: ein Literal, dessen Bedeutung nur im Kopf des Autors existiert. Sie sind besonders teuer, weil sie sich vermehren.
Dasselbe Literal an mehreren Stellen
Magische Zahl
if (versuche > 3)
Sperren(konto);
// ⊠200 Zeilen weiter âŠ
if (fehlversuche >= 3)
_logger.LogWarning("Konto gefÀhrdet");
// Welche 3 gehört zu welcher Regel?Benannt
private const int MaxFehlversuche = 3;
if (versuche > MaxFehlversuche)
Sperren(konto);
if (fehlversuche >= MaxFehlversuche)
_logger.LogWarning("Konto gefÀhrdet");
// Eine Regel, eine Stelle.Der eigentliche Gewinn ist nicht die Lesbarkeit, sondern die Suchbarkeit: Nach MaxFehlversuche kannst du greppen. Nach 3 nicht.
Welche Literale bleiben dĂŒrfen
0 und 1 in einer Schleife, 2 in einer Halbierung, string.Empty â Werte, deren Bedeutung aus dem Ausdruck selbst folgt. Die Regel ist nicht «keine Zahlen im Code», sondern: Wenn die Zahl eine Entscheidung darstellt, braucht die Entscheidung einen Namen.
Die LĂ€nge eines Namens
Es gibt eine brauchbare Faustregel: Ein Name darf so lang sein, wie sein GĂŒltigkeitsbereich gross ist.
- Der Laufindex einer dreizeiligen Schleife darf
iheissen. Alles ist sichtbar. - Eine lokale Variable in einer Methode braucht ein Wort:
markierte,summe. - Ein privates Feld braucht ein bis zwei:
_offeneRechnungen. - Eine öffentliche Klasse in einer Bibliothek darf ruhig
MehrwertsteuerBerechnungheissen â sie wird an Stellen gelesen, die von ihrem Zuhause nichts wissen.
Umgekehrt heisst das: Ein kurzer Name in einem grossen GĂŒltigkeitsbereich ist ein Fehler, und ein sehr langer Name in einer kurzen Methode ist meist ein Hinweis darauf, dass die Methode zu viel tut.