Code-Review in C#: Was prüfen und wie man Feedback gibt
\nCode-Review ist eines der mächtigsten Werkzeuge zur Verbesserung der Codequalität. Für Anfänger in der C#-Entwicklung wirkt es oft stressig: Man hat Angst, dass der eigene Code kritisiert wird, oder man weiß nicht genau, worauf man im Code anderer achten soll. Tatsächlich ist ein gutes Code-Review ein Dialog, keine Prüfung. In diesem Artikel schauen wir uns an, worauf Sie bei der Überprüfung von C#-Code (insbesondere im .NET-Ökosystem) achten sollten und wie Sie Anmerkungen so formulieren, dass sie helfen, ohne zu verletzen.
\n\n1. Was im C#-Code prüfen: Eine Checkliste für den Reviewer
\nWenn Sie einen Pull Request (PR) eines Kollegen öffnen, schweift der Blick umher. Um nicht in Details zu ertrinken, verwenden Sie einen systematischen Ansatz. Hier sind die wichtigsten Bereiche, die Sie in jedem C#-Projekt prüfen sollten.
\n\n1.1. Architektur und Lesbarkeit
\nBewerten Sie zuerst das Gesamtbild. Beantworten Sie die Fragen:
\n- \n
- Löst dieser Code die gestellte Aufgabe? \n
- Dupliziert er vorhandene Logik (DRY-Prinzip)? \n
- Sind die Namen von Klassen, Methoden und Variablen verständlich? \n
Schlecht:
\npublic void DoStuff(int a, int b)\n{\n var x = a + b;\n // ... weitere 50 Zeilen\n}\nGut:
\npublic int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n return basePrice + taxAmount;\n}\nDer Name der Methode und der Parameter verraten sofort den Zweck. Das reduziert die kognitive Belastung des Lesers.
\n\n1.2. Fehlerbehandlung und Null-Sicherheit
\nC# ist eine Sprache mit einem ausgefeilten Typsystem, aber NullReferenceException ist ein häufiges Problem. Prüfen Sie:
\n- \n
- Werden
null-Prüfungen verwendet (?.,??,??=)? \n - Gibt es eine Ausnahmebehandlung (try-catch), wo nötig? \n
- Werden Ausnahmen in einem leeren catch verschluckt? \n
Beispiel für gefährlichen Code:
\nvar user = GetUserById(id);\nConsole.WriteLine(user.Name); // Fehler, wenn user == null\nSichere Variante:
\nvar user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "Gast");\n\n1.3. Leistung und LINQ
\nLINQ ist praktisch, kann aber ineffizient sein. Prüfen Sie:
\n- \n
- Wird ein mehrfacher Durchlauf durch die Sammlung gemacht (z. B.
.Where().Select().ToList()auf IQueryable)? \n - Wird
Any()anstelle vonCount() > 0verwendet, um das Vorhandensein von Elementen zu prüfen? \n - Gibt es unnötige Materialisierungen (
.ToList(),.ToArray()) in der Mitte einer Kette? \n
Schlecht:
\nvar list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();\nBesser:
\nvar first = items.FirstOrDefault(x => x.IsActive);\n\n1.4. Asynchronität und Task
\nIn .NET ist Asynchronität Standard. Achten Sie auf:
\n- \n
- Wurde
awaitvor einem asynchronen Aufruf vergessen? \n - Gibt es blockierende Aufrufe (
.Result,.Wait()) in einem synchronen Kontext? \n - Wird die Konvention eingehalten: Asynchrone Methoden enden auf
Async? \n
Antipattern:
\nvar data = GetDataAsync().Result; // Kann einen Deadlock verursachen\nRichtig:
\nvar data = await GetDataAsync();\n\n2. Wie man Feedback gibt: Sanft, aber konstruktiv
\nSelbst die perfekte Checkliste ist nutzlos, wenn Ihre Kommentare wie Kritik klingen. Hier sind einige Regeln, die helfen, das Code-Review für alle nützlich zu machen.
\n\n2.1. Verwenden Sie "Ich"-Aussagen und Fragen
\nSagen Sie statt "Du hast schlechten Code geschrieben" lieber "Ich finde, diese Methode könnte vereinfacht werden. Was meinst du?".
\nBeispiele für Formulierungen:
\n- \n
- "Ich bin nicht siche