Clean Code auf Swift: Prinzipien und Beispiele
Clean Code ist nicht nur ein modischer Begriff, sondern eine Entwicklungsphilosophie, die sich direkt auf die Geschwindigkeit der Feature-Entwicklung, die Anzahl der Fehler und die Freude an der Arbeit auswirkt. Für Swift-Entwickler, die an iOS- und macOS-Apps arbeiten, ist es besonders wichtig, Code zu schreiben, der leicht zu lesen und zu warten ist, da Projekte jahrelang bestehen und sich Teams verändern. In diesem Artikel werden wir die grundlegenden Prinzipien von Clean Code in Bezug auf Swift erläutern und konkrete Beispiele betrachten.
1. Benennung: Sprechen Sie die Sprache der Fachdomäne
Richtige Benennung ist die Grundlage für lesbaren Code. Namen von Variablen, Funktionen und Klassen sollten die Fragen "Was?" und "Warum?" beantworten. Vermeiden Sie Abkürzungen und einbuchstabige Namen (außer i in kurzen Schleifen).
Schlechtes Beispiel:
func calc(a: Int, b: Int) -> Int { return a * b + 10}Gutes Beispiel:
func calculateTotalPriceWithShipping(itemPrice: Int, shippingCost: Int) -> Int { return itemPrice + shippingCost}Für boolesche Variablen verwenden Sie die Präfixe is, has, should:
var isUserLoggedIn: Bool = falsevar hasCompletedOnboarding: Bool = trueKlassennamen sollten Substantive sein ( UserManager, NetworkService ), und Funktionen sollten Verben oder Verbphrasen sein ( fetchData(), validateEmail() ).
2. Funktionen: Klein und mit einer einzigen Verantwortung
Jede Funktion sollte genau eine Sache tun und diese gut machen. Die ideale Länge einer Funktion beträgt 10-20 Zeilen. Wenn eine Funktion mehr als 30 Zeilen hat, teilen Sie sie in kleinere auf.
Schlechtes Beispiel: Eine Funktion, die validiert, speichert und eine Benachrichtigung sendet.
func processUser(_ user: User) { // Validierung guard !user.name.isEmpty else { return } guard user.age > 18 else { return } // Speicherung CoreDataManager.shared.save(user) // Benachrichtigung NotificationCenter.default.post(name: .userDidRegister, object: nil)}Gutes Beispiel: Aufteilung in drei separate Funktionen.
func processUser(_ user: User) { guard isValid(user) else { return } saveUser(user) notifyUserRegistration()}
private func isValid(_ user: User) -> Bool { return !user.name.isEmpty && user.age > 18}
private func saveUser(_ user: User) { CoreDataManager.shared.save(user)}
private func notifyUserRegistration() { NotificationCenter.default.post(name: .userDidRegister, object: nil)}Vermeiden Sie auch eine große Anzahl von Parametern. Wenn es mehr als drei sind, fassen Sie sie in einer Struktur zusammen.
struct SearchConfig { let query: String let category: String? let page: Int let pageSize: Int}
func search(with config: SearchConfig) -> [Result] { ... }3. SOLID in Swift: Praktische Beispiele
Die SOLID-Prinzipien sind ein Eckpfeiler von Clean Code in objektorientierten Sprachen. Betrachten wir zwei Schlüsselprinzipien anhand von Swift-Beispielen.
Single-Responsibility-Prinzip (SRP)
Eine Klasse sollte nur einen Grund für Änderungen haben. Vermischen Sie nicht Netzwerklogik und UI.
// Verletzung von SRPclass UserViewController: UIViewController { func fetchUser() { URLSession.shared.dataTask(with: URL(string: "...")!) { ... } } func updateUI() { ... }}
// Korrekturclass UserNetworkService { func fetchUser(completion: (User) -> Void) { ... }}
class UserViewController: UIViewController { let networkService = UserNetworkService() func loadUser() { networkService.fetchUser { [weak self] user in DispatchQueue.main.async { self?.updateU