Clean Code em Swift: princípios e exemplos para iniciantes
Todo desenvolvedor iOS ou macOS, mais cedo ou mais tarde, enfrenta o problema: o código que funcionava perfeitamente ontem, hoje se torna ilegível. Isso não é culpa da linguagem Swift — é o resultado de negligenciar os princípios do Clean Code. Código limpo não é apenas estética. É a base da manutenibilidade do projeto, da redução do tempo de depuração e do trabalho confortável em equipe. Neste artigo, vamos analisar os princípios-chave do Clean Code com exemplos em Swift que ajudarão você a escrever código compreensível não apenas para o computador, mas também para as pessoas.
1. Nomenclatura: variáveis, constantes e funções
O primeiro e mais importante princípio — o nome deve responder à pergunta "Por quê?", e não "Como?". Em Swift, graças à tipagem forte, você pode omitir o tipo no nome, mas não a intenção.
Exemplo ruim:
var d: Double = 3.14var arr = [String]()func calc(a: Double, b: Double) -> Double { return a * b}Exemplo bom (Clean Code):
let piValue: Double = 3.14159var userNames: [String] = []func calculateRectangleArea(width: Double, height: Double) -> Double { return width * height}Regras de nomenclatura em Swift:
- Use camelCase para variáveis e funções.
- Evite abreviações (
btn→submitButton). - Para variáveis booleanas, use os prefixos
is,has,should(por exemplo,isUserLoggedIn). - Nomes de funções devem começar com um verbo:
fetchData(),saveToCache().
2. Funções: uma tarefa — uma função
O princípio da responsabilidade única (Single Responsibility) se aplica não apenas a classes, mas também a funções. Se uma função faz mais de uma coisa — ela precisa ser dividida.
Exemplo ruim: a função faz tudo de uma vez
func processUserData(user: User) { // Validação guard user.email.contains("@") else { return } // Salvamento no banco de dados Database.shared.save(user) // Envio de notificação NotificationCenter.default.post(name: .userDidRegister, object: nil) // Atualização da UI DispatchQueue.main.async { self.label.text = "Bem-vindo, \\(user.name)" }}Exemplo bom: divisão em funções pequenas
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 = "Bem-vindo, \\(user.name)" }}Dica: Se você não consegue pensar em um nome curto para a função, provavelmente ela está fazendo demais.
3. Comentários: menos é melhor, mas com precisão
No Clean Code, comentários são um sinal de código mal escrito. Um bom código deve se documentar por si só. No entanto, existem exceções: lógica de negócios complexa, trabalho com legado ou APIs públicas.
Comentário redundante (ruim):
// Incrementa o contador em 1counter += 1Comentário útil (bom):
// Usamos Decimal para evitar erros de arredondamento ao trabalhar com moedalet price = Decimal(string: "19.99") ?? .zeroRegras para trabalhar com comentários:
- Não escreva o óbvio — o código se lê por si só.
- Use
// MARK: -para