Clean Code em Swift: por que isso é importante para um desenvolvedor iOS
Todo desenvolvedor já passou pela situação em que o código antigo se transforma em "espaguete" depois de um mês. No mundo do Swift, onde os projetos crescem rapidamente, manter a limpeza do código se torna crítico. Clean Code não é apenas estética, mas uma ferramenta que economiza horas de depuração e simplifica a adição de novos recursos. Neste artigo, vamos analisar os princípios-chave do Clean Code aplicados ao Swift, com exemplos reais para iOS e macOS.
1. Nomenclatura: legibilidade em primeiro lugar
A nomenclatura correta é a base do código limpo. No Swift, onde as APIs são frequentemente autodocumentadas, nomes ruins são a principal fonte de confusão.
Exemplo ruim:
class DataManager { func getData() -> [String: Any] { // ... }}Exemplo bom:
class UserProfileFetcher { func fetchUserProfile(for userID: String) -> Result<UserProfile, NetworkError> { // ... }}- Use verbos para métodos (fetch, update, delete).
- Evite abreviações — vc, btn, str — isso é coisa do passado.
- Variáveis booleanas devem ser lidas como afirmações:
isLoggedIn,hasNetworkConnection.
2. Funções: pequenas e com um único propósito
No Swift, onde closures e programação funcional são populares, é fácil se empolgar e escrever uma função monolítica. O princípio da responsabilidade única (Single Responsibility) funciona 100% aqui.
Exemplo ruim:
func processUserData(user: User) { // Validação if user.email.isEmpty { return } // Salvar no CoreData CoreDataStack.shared.save(user) // Enviar para o servidor APIClient.shared.send(user) // Atualizar UI DispatchQueue.main.async { self.tableView.reloadData() }}Exemplo bom (divisão em funções pequenas):
func processUserData(user: User) { guard validateUser(user) else { return } saveUserLocally(user) sendUserToServer(user) updateUI()}
private func validateUser(_ user: User) -> Bool { return !user.email.isEmpty}
private func saveUserLocally(_ user: User) { CoreDataStack.shared.save(user)}
private func sendUserToServer(_ user: User) { APIClient.shared.send(user)}
private func updateUI() { DispatchQueue.main.async { self.tableView.reloadData() }}Regra das 20 linhas: se a função não couber na tela — divida. Cada função deve fazer apenas uma ação.
3. SOLID em Swift: exemplos práticos
Os princípios SOLID não são abstração, mas ferramentas de trabalho. Vamos analisar dois essenciais para iOS.
Princípio Aberto/Fechado (Open/Closed)
As classes devem estar abertas para extensão, mas fechadas para modificação. Em vez de alterar uma classe pronta, use protocolos.
protocol PaymentProcessor { func process(amount: Double, currency: String) -> Bool}
class ApplePayProcessor: PaymentProcessor { func process(amount: Double, currency: String) -> Bool { // Lógica do Apple Pay return true }}
class StripeProcessor: PaymentProcessor { func process(amount: Double, currency: String) -> Bool { // Lógica do Stripe return true }}
// Agora adicionar uma nova forma de pagamento é simples: criar uma nova classe, sem mexer nas antigas.Princípio da Substituição de Liskov (Liskov Substitution)
As subclasses não devem quebrar a lógica da classe pai. Um erro típico é sobrescrever um método alterando o contrato.
class Vehicle { func startEngine() { print("Engine started") }}
class ElectricCar: Vehicle { override func startEngine() { // Violação: elétric
```