Einleitung: Warum Code-Review für Swift-Entwickler wichtig ist
\n\nCode-Review (Code-Überprüfung) ist ein Prozess, bei dem ein oder mehrere Entwickler den von einem Kollegen geschriebenen Code überprüfen, bevor er in den Hauptzweig des Projekts gelangt. Für Einsteiger in der iOS/macOS-Entwicklung ist dies nicht nur eine Formalität, sondern ein mächtiges Werkzeug zum Lernen und zur Verbesserung der Codequalität.
\n\nIm Swift-Ökosystem, in dem strenge Typisierung und Speichersicherheit an erster Stelle stehen, hilft das Code-Review nicht nur dabei, logische Fehler zu erkennen, sondern auch Probleme mit der Verwendung von ARC (Automatic Reference Counting), optionalen Typen und Multithreading. In diesem Artikel werden wir untersuchen, was genau im Swift-Code zu überprüfen ist und wie man Feedback gibt, das nützlich und konstruktiv ist.
\n\nWesentliche Aspekte des Code-Reviews in Swift
\n\n1. Code-Sauberkeit und Einhaltung des Swift-Stils
\n\nZuallererst sollte der Code lesbar sein. In Swift gibt es klare Namenskonventionen, die in den API Design Guidelines von Apple beschrieben sind. Worauf ist zu achten:
\n\n- \n
- Namen von Variablen und Funktionen sollten klar und aussagekräftig sein. Vermeiden Sie Abkürzungen wie
btn– verwenden SiesubmitButton. \n - Reihenfolge der Deklarationen: Eigenschaften, Initialisierer, Methoden, Unterklassen. Verwenden Sie
// MARK:zur Gruppierung. \n - Verwendung von Leerzeichen und Einrückungen. Die Swift-Community bevorzugt 4 Leerzeichen (oder 2 in manchen Teams), aber das Wichtigste ist die Einheitlichkeit. \n
- Vermeiden Sie Force Unwrapping (
!) ohne zwingende Notwendigkeit. Verwenden Sie stattdessenguard letoderif let. \n
Beispiel für schlechten und guten Stil:
\n\n// Schlecht\nvar x: String!\nfunc doSomething() { print(x!) }\n\n// Gut\nvar username: String?\nfunc printUsername() {\n guard let name = username else { return }\n print(name)\n}\n\n\n2. Speichersicherheit und ARC
\n\nSwift verwendet die automatische Referenzzählung (ARC), aber das bedeutet nicht, dass man starke Referenzzyklen ignorieren kann. Überprüfen Sie beim Code-Review unbedingt:
\n\n- \n
- Closures: Wenn ein Closure
selferfasst undselfdas Closure hält, entsteht ein Zyklus. Verwenden Sie[weak self]oder[unowned self]. \n - Delegates: Sie sollten fast immer schwach sein (
weak var delegate). \n - Caches und Beobachter: Entfernen Sie Abonnements von
NotificationCenteroder KVO bei der Deinitialisierung des Objekts. \n
class NetworkManager {\n var onComplete: (() -> Void)?\n\n func fetchData() {\n // GEFÄHRLICH: starke Referenz auf self\n URLSession.shared.dataTask(with: url) { data, _, _ in\n self.handleResponse(data) // Zyklus!\n }\n \n // SICHER\n URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in\n self?.handleResponse(data)\n }\n }\n}\n\n\n3. Fehlerbehandlung und optionale Typen
\n\nSwift bietet ein leistungsstarkes System zur Fehlerbehandlung mit do-catch und optionalen Typen. Überprüfen Sie beim Code-Review:
- \n
- Sind alle Fehler behandelt? Verwenden Sie
try?nur, wenn Sie mitnilumgehen können. \n - Wird
try!im Produktionscode verwendet? Dies ist fast immer eine schlechte Praxis. \n - Werden optionale Verkettungen korrekt behandelt? Vermeiden Sie tiefe Verschachtelungen von
if let– verwenden Sieguardfür frühe Ausstiege. \n
// Stattdessen:\nif let data = response.data {\n if let json = try? JSONSerialization.jsonObject(with: data) {\n i