Clean Code auf Swift: Prinzipien und Beispiele für Anfänger
Jeder iOS- oder macOS-Entwickler stößt früher oder später auf ein Problem: Code, der gestern noch einwandfrei funktioniert hat, wird heute unlesbar. Das ist nicht die Schuld der Sprache Swift – es ist das Ergebnis der Vernachlässigung der Clean Code-Prinzipien. Sauberer Code ist nicht nur eine Frage der Ästhetik. Er ist die Grundlage für die Wartbarkeit eines Projekts, die Reduzierung der Debugging-Zeit und eine angenehme Teamarbeit. In diesem Artikel werden wir die wichtigsten Clean Code Prinzipien anhand von Swift-Beispielen erläutern, die Ihnen helfen, Code zu schreiben, der nicht nur für den Computer, sondern auch für Menschen verständlich ist.
1. Benennung: Variablen, Konstanten und Funktionen
Das erste und wichtigste Prinzip: Der Name sollte die Frage „Warum?“ beantworten, nicht „Wie?“. In Swift können Sie dank der strengen Typisierung den Typ im Namen weglassen, aber nicht die Absicht.
Schlechtes Beispiel:
var d: Double = 3.14var arr = [String]()func calc(a: Double, b: Double) -> Double { return a * b}Gutes Beispiel (Clean Code):
let piValue: Double = 3.14159var userNames: [String] = []func calculateRectangleArea(width: Double, height: Double) -> Double { return width * height}Benennungsregeln in Swift:
- Verwenden Sie camelCase für Variablen und Funktionen.
- Vermeiden Sie Abkürzungen (
btn→submitButton). - Verwenden Sie für boolesche Variablen die Präfixe
is,has,should(z.B.isUserLoggedIn). - Funktionsnamen sollten mit einem Verb beginnen:
fetchData(),saveToCache().
2. Funktionen: Eine Aufgabe – eine Funktion
Das Prinzip der einzigen Verantwortung (Single Responsibility) gilt nicht nur für Klassen, sondern auch für Funktionen. Wenn eine Funktion mehr als eine Sache erledigt, sollte sie aufgeteilt werden.
Schlechtes Beispiel: Die Funktion macht alles auf einmal
func processUserData(user: User) { // Validierung guard user.email.contains("@") else { return } // Speichern in der Datenbank Database.shared.save(user) // Senden einer Benachrichtigung NotificationCenter.default.post(name: .userDidRegister, object: nil) // UI aktualisieren DispatchQueue.main.async { self.label.text = "Willkommen, \\(user.name)" }}Gutes Beispiel: Aufteilung in kleine Funktionen
func registerUser(_ user: User) { guard validateUser(user) else { return } saveUserToDatabase(user) postRegistrationNotification() updateUI(for: user)}
private func validateUser(_ user: User) -> Bool { return user.email.contains("@") && !user.name.isEmpty}
private func saveUserToDatabase(_ user: User) { Database.shared.save(user)}
private func postRegistrationNotification() { NotificationCenter.default.post(name: .userDidRegister, object: nil)}
private func updateUI(for user: User) { DispatchQueue.main.async { self.welcomeLabel.text = "Willkommen, \\(user.name)" }}Tipp: Wenn Sie keinen kurzen Namen für eine Funktion finden, macht sie wahrscheinlich zu viel.
3. Kommentare: Weniger ist besser, aber treffend
In Clean Code sind Kommentare ein Zeichen für schlechten Code. Guter Code sollte sich selbst dokumentieren. Es gibt jedoch Ausnahmen: komplexe Geschäftslogik, Arbeit mit Legacy-Code oder öffentliche APIs.
Überflüssiger Kommentar (schlecht):
// Zähler um 1 erhöhencounter += 1Nützlicher Kommentar (gut):
// Verwende Decimal, um Rundungsfehler bei der Arbeit mit Währungen zu vermeidenlet price = Decimal(string: "19.99") ?? .zeroRegeln für die Arbeit mit Kommentaren:
- Schreiben Sie nichts Offensichtliches – der Code liest sich von selbst.
- Verwenden Sie
// MARK: -für