Clean Code em Swift: princípios e exemplos
Código limpo (Clean Code) não é apenas um termo da moda, mas uma filosofia de desenvolvimento que impacta diretamente a velocidade de criação de funcionalidades, a quantidade de bugs e o prazer no trabalho. Para desenvolvedores Swift que trabalham em aplicativos iOS e macOS, é especialmente importante escrever código fácil de ler e manter, já que os projetos duram anos e as equipes mudam. Neste artigo, vamos analisar os principais princípios do Clean Code aplicados ao Swift e ver exemplos concretos.
1. Nomenclatura: fale a linguagem do domínio
A nomenclatura correta é a base de um código legível. Nomes de variáveis, funções e classes devem responder às perguntas "o quê?" e "por quê?". Evite abreviações e nomes de uma letra (exceto i em loops curtos).
Exemplo ruim:
func calc(a: Int, b: Int) -> Int { return a * b + 10}Exemplo bom:
func calculateTotalPriceWithShipping(itemPrice: Int, shippingCost: Int) -> Int { return itemPrice + shippingCost}Para variáveis booleanas, use prefixos is, has, should:
var isUserLoggedIn: Bool = falsevar hasCompletedOnboarding: Bool = trueNomes de classes devem ser substantivos ( UserManager, NetworkService ), e funções — verbos ou frases verbais ( fetchData(), validateEmail() ).
2. Funções: pequenas e com uma única responsabilidade
Cada função deve fazer exatamente uma coisa e fazê-la bem. O tamanho ideal de uma função é de 10 a 20 linhas. Se a função ultrapassar 30 linhas — divida-a em funções menores.
Exemplo ruim: função que valida, salva e envia notificação.
func processUser(_ user: User) { // Validação guard !user.name.isEmpty else { return } guard user.age > 18 else { return } // Salvamento CoreDataManager.shared.save(user) // Notificação NotificationCenter.default.post(name: .userDidRegister, object: nil)}Exemplo bom: divisão em três funções separadas.
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)}Evite também um grande número de parâmetros. Se houver mais de três — agrupe-os em uma estrutura.
struct SearchConfig { let query: String let category: String? let page: Int let pageSize: Int}
func search(with config: SearchConfig) -> [Result] { ... }3. SOLID em Swift: exemplos práticos
Os princípios SOLID são a pedra angular do código limpo em linguagens orientadas a objetos. Vamos analisar dois princípios-chave com exemplos em Swift.
Princípio da Responsabilidade Única (SRP)
Uma classe deve ter apenas um motivo para mudar. Não misture lógica de rede e UI.
// Violação do SRPclass UserViewController: UIViewController { func fetchUser() { URLSession.shared.dataTask(with: URL(string: "...")!) { ... } } func updateUI() { ... }}
// Correçãoclass 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