Clean Code en Kotlin: principios y ejemplos para principiantes
El código limpio (Clean Code) no es solo un término de moda, sino una habilidad fundamental de cualquier desarrollador. En el lenguaje Kotlin, que combina concisión y potencia, escribir código legible y mantenible se vuelve especialmente importante. En este artículo, analizaremos los principios clave de Clean Code aplicados a Kotlin, proporcionaremos ejemplos prácticos y mostraremos cómo evitar errores típicos. El material está dirigido a desarrolladores principiantes que desean escribir código profesional desde el primer día.
1. Nomenclatura de variables, funciones y clases
La nomenclatura correcta es la base del código limpio. El nombre debe responder a las preguntas: "¿Qué es esto?" y "¿Para qué sirve?". En Kotlin se utiliza camelCase para variables y funciones, y PascalCase para clases y objetos.
Ejemplo incorrecto:
val x = 5fun calc(a: Int, b: Int): Int { return a * b + 10}Ejemplo correcto:
val maxRetryCount = 5fun calculateTotalPrice(basePrice: Int, tax: Int): Int { return basePrice + tax}Reglas clave:
- Evite abreviaturas — es mejor reemplazar
usrporuser, ycalcporcalculate. - Use verbos para funciones —
getUser(),sendEmail(),validateInput(). - Las variables booleanas nómbrelas con prefijos
is,has,can—isActive,hasPermission. - Evite información innecesaria —
userListes mejor quelistOfUsersFromDatabase.
2. Principios SOLID en Kotlin
SOLID son cinco principios de la programación orientada a objetos que ayudan a crear sistemas flexibles y fáciles de mantener. Veámoslos con ejemplos en Kotlin.
Single Responsibility (Responsabilidad Única)
Una clase debe tener una sola razón para cambiar. Divida la lógica en clases pequeñas y especializadas.
Ejemplo incorrecto:
class UserManager { fun saveUser(user: User) { /* guardar en BD */ } fun sendEmail(user: User) { /* enviar correo */ } fun printReport(user: User) { /* imprimir informe */ }}Ejemplo correcto:
class UserRepository { fun save(user: User) { /* guardar en BD */ }}
class EmailService { fun send(user: User) { /* enviar correo */ }}
class ReportPrinter { fun print(user: User) { /* imprimir informe */ }}Open/Closed (Abierto/Cerrado)
Las clases deben estar abiertas para extensión, pero cerradas para modificación. Use interfaces y herencia.
interface Shape { fun area(): Double}
class Circle(val radius: Double) : Shape { override fun area() = Math.PI * radius * radius}
class Rectangle(val width: Double, val height: Double) : Shape { override fun area() = width * height}
// Ahora se pueden agregar nuevas figuras sin cambiar el código existenteLiskov Substitution (Sustitución de Liskov)
Los objetos de las subclases deben poder reemplazar objetos de la clase base sin alterar la lógica. En Kotlin, esto es especialmente relevante al trabajar con colecciones y herencia.
open class Bird { open fun fly() = "Vuela"}
class Penguin : Bird() { override fun fly() = throw UnsupportedOperationException("Los pingüinos no vuelan")}// Esto viola el principio: es mejor mover la "capacidad de volar" a una interfaz separada3. Trabajo con funciones: concisión y limpieza
Kotlin ofrece herramientas potentes para escribir funciones limpias. Reglas principales:
Blogs
Book Recommendations
Leer también
Swift para aprendizaje automático: posibilidades y limitaciones