Clean Code (Código Limpio), un reconocido libro de ingeniería de software escrito por Robert C. Martin, aboga por un conjunto de buenas prácticas de programación que conducen a un código legible, mantenible y eficiente. Esta publicación profundiza en los conceptos fundamentales de Clean Code, explicando cada principio junto con ejemplos relevantes. Adoptar estas prácticas te ayudará a ser un mejor programador y contribuir a mejores proyectos de software.
Nombres Significativos
Elige nombres descriptivos y no ambiguos para variables, funciones, clases y módulos. Evita abreviaturas, nombres de una sola letra o nombres demasiado generales. Por ejemplo, usa contador
en lugar de c
o i
, y calcularArea()
en lugar de calcA()
.
Funciones
Pequeñas y enfocadas: Mantén las funciones pequeñas, idealmente con menos de 20 líneas, y asegúrate de que realicen una única tarea bien definida.
Pocos Parámetros: Limita los parámetros de las funciones a un máximo de tres, facilitando su comprensión y prueba.
Sin Efectos Secundarios: Las funciones no deben modificar el estado global ni los parámetros de entrada.
Ejemplo:
// Incorrecto
function crearYGuardarUsuario(nombreUsuario, contraseña) {
// lógica para crear usuario
// lógica para guardar usuario
}
// Correcto
function crearUsuario(nombreUsuario, contraseña) {
// lógica para crear usuario
return usuario;
}
function guardarUsuario(usuario) {
// lógica para guardar usuario
}
const usuario = crearUsuario(nombreUsuario, contraseña);
guardarUsuario(usuario);
Comentarios
Explicar la Intención: Usa comentarios para aclarar el propósito del código y describir cualquier lógica no obvia.
Mantenerlos Actualizados: Asegúrate de que los comentarios sean actuales y relevantes, ya que los comentarios desactualizados pueden ser confusos.
Evitar Redundancia: No repitas lo obvio ni comentes código autoexplicativo.
Formato:
Consistencia: Sigue un estilo de codificación consistente, respetando las convenciones específicas del lenguaje.
Indentación Adecuada: Utiliza el nivel adecuado de indentación para hacer que el código sea más legible.
Organización Lógica: Agrupa el código relacionado, con una clara separación entre las diferentes secciones.
Manejo de Errores:
Usa Excepciones: Utiliza excepciones en lugar de códigos de error para manejar errores.
Manejar Errores Temprano: Verifica los errores lo más pronto posible y manéjalos de manera adecuada.
Centralizar el Manejo de Errores: Crea un mecanismo centralizado para el manejo de errores para evitar duplicar código.
Objetos y Estructuras de Datos:
Encapsulación: Oculta los detalles internos de implementación, exponiendo solo lo necesario.
Favorecer la Composición sobre la Herencia: Componer objetos complejos a partir de objetos más simples, en lugar de depender de jerarquías de herencia.
Mantener las Estructuras de Datos Simples: Utiliza estructuras de datos apropiadas y mantenlas pequeñas y enfocadas.
Otros "Code smells":
Uso excesivo de condicionales: Cuando te encuentres con múltiples condicionales en cadena (if-else) o conmutadores (switch), considera aplicar el patrón de diseño "Strategy" o usar un mapa de funciones para simplificar y mejorar la legibilidad del código.
Uso excesivo de herencia: La herencia profunda puede dificultar la comprensión y mantenimiento del código. En lugar de utilizar la herencia, favorece la composición y la delegación, lo que permite un mayor grado de flexibilidad y modularidad en tu código.
Variables y funciones globales: El uso excesivo de variables y funciones globales puede llevar a un código difícil de mantener y depurar. Minimiza el uso de variables globales y funciones, utilizando en su lugar objetos y métodos para organizar y encapsular el código.
Métodos o funciones que hacen demasiado: Si un método o función está realizando múltiples tareas, puede ser difícil de entender y mantener. Divide el método o función en funciones más pequeñas y específicas, siguiendo el principio de responsabilidad única.
Uso excesivo de "magic numbers" y "magic strings": Los números y cadenas mágicas son valores literales en el código que no tienen un significado claro. Reemplaza estos valores literales con constantes o variables con nombres descriptivos, lo que facilitará la comprensión y el mantenimiento del código.
Uso excesivo de la herencia múltiple: La herencia múltiple puede causar ambigüedad y dificultar la comprensión del código. En lugar de utilizar herencia múltiple, considera utilizar interfaces, mixins o traits para lograr la misma funcionalidad con menos complejidad.
Violaciones de la Ley de Demeter: La Ley de Demeter establece que un objeto solo debe comunicarse con sus vecinos inmediatos y no con objetos más distantes. Si el código viola esta ley, puede ser difícil de mantener y propenso a errores. Reestructura el código para reducir las violaciones de la Ley de Demeter, utilizando técnicas como la inyección de dependencias y la delegación.
Porqué aplicar los conceptos de Clean Code?
Clean Code ofrece una guía invaluable para los desarrolladores de software que se esfuerzan por crear un código legible, mantenible, bajo en errores, reutilizable, eficiente y de alta calidad. Al adherirse a estos principios, no solo mejorarás tus propias habilidades, sino que también contribuirás al éxito de tus proyectos de software.