Clean Code en Swift: principios y ejemplos para principiantes
Cada desarrollador de iOS o macOS, tarde o temprano, se enfrenta al problema: el código que funcionaba perfectamente ayer, hoy se vuelve ilegible. Esto no es culpa del lenguaje Swift, sino el resultado de descuidar los principios de Clean Code. El código limpio no es solo estética. Es la base de la mantenibilidad del proyecto, la reducción del tiempo de depuración y el trabajo en equipo cómodo. En este artículo, analizaremos los principios clave de Clean Code con ejemplos en Swift que le ayudarán a escribir código comprensible no solo para la computadora, sino también para las personas.
1. Nomenclatura: variables, constantes y funciones
El primer y más importante principio: el nombre debe responder a la pregunta «¿Para qué?», no «¿Cómo?». En Swift, gracias al tipado estricto, puede omitir el tipo en el nombre, pero no la intención.
Ejemplo malo:
var d: Double = 3.14var arr = [String]()func calc(a: Double, b: Double) -> Double { return a * b}Ejemplo bueno (Clean Code):
let piValue: Double = 3.14159var userNames: [String] = []func calculateRectangleArea(width: Double, height: Double) -> Double { return width * height}Reglas de nomenclatura en Swift:
- Use camelCase para variables y funciones.
- Evite abreviaturas (
btn→submitButton). - Para variables booleanas, use prefijos
is,has,should(por ejemplo,isUserLoggedIn). - Los nombres de funciones deben comenzar con un verbo:
fetchData(),saveToCache().
2. Funciones: una tarea — una función
El principio de responsabilidad única (Single Responsibility) se aplica no solo a las clases, sino también a las funciones. Si una función hace más de una cosa, debe dividirse.
Ejemplo malo: la función lo hace todo a la vez
func processUserData(user: User) { // Validación guard user.email.contains("@") else { return } // Guardar en la base de datos Database.shared.save(user) // Enviar notificación NotificationCenter.default.post(name: .userDidRegister, object: nil) // Actualizar UI DispatchQueue.main.async { self.label.text = "Bienvenido, \\(user.name)" }}Ejemplo bueno: división en funciones pequeñas
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 = "Bienvenido, \\(user.name)" }}Consejo: Si no puede pensar en un nombre corto para una función, probablemente esté haciendo demasiado.
3. Comentarios: menos es mejor, pero precisos
En Clean Code, los comentarios son una señal de código deficiente. El buen código debe documentarse a sí mismo. Sin embargo, hay excepciones: lógica de negocio compleja, trabajo con código heredado o APIs públicas.
Comentario redundante (malo):
// Incrementamos el contador en 1counter += 1Comentario útil (bueno):
// Usamos Decimal para evitar errores de redondeo al trabajar con monedalet price = Decimal(string: "19.99") ?? .zeroReglas para trabajar con comentarios:
- No escriba lo obvio: el código se lee solo.
- Use
// MARK: -para