Guía

Código Sostenible

Cómo programar código fácil de mantener.

En video

Código Sostenible

Capítulo 1

¿Qué es Código Sostenible?

Fundamentos para escribir código mantenible y duradero

Definición

Código fácil de mantener con diseño intuitivo y mínima complejidad

  • Diseño intuitivo
  • Mínima complejidad esencial
  • Buena cobertura de test

Escribir para Humanos

El código debe ser legible y comprensible para otros desarrolladores

  • Priorizar la legibilidad
  • Usar nombres descriptivos
  • Documentar decisiones complejas

Degeneración del Código

Cómo evitar que el código se deteriore con el tiempo

  • Complejidad Accidental vs. Fundamental
  • Refactorización continua
  • Mantener la arquitectura limpia

Las Personas Primero

La empatía como principio fundamental del desarrollo

  • Considerar al equipo
  • Facilitar el mantenimiento
  • Reducir la carga cognitiva
Capítulo 2

Refactorización

La práctica diaria de mejorar el código existente

Práctica Diaria

La refactorización debe ser parte del flujo de trabajo diario

  • Pequeñas mejoras constantes
  • No esperar a grandes refactors
  • Integrar en el desarrollo normal

Mejoras de Legibilidad

Enfocarse en hacer el código más fácil de leer y entender

  • Renombrar variables y funciones
  • Extraer métodos complejos
  • Simplificar expresiones

Code Smells

Identificar y eliminar patrones problemáticos en el código

  • Métodos muy largos
  • Clases con muchas responsabilidades
  • Código duplicado
  • Comentarios excesivos
Capítulo 3

Fundamentos

Principios básicos para código sostenible

Diseñar para el Presente

Evitar la sobre-ingeniería y enfocarse en necesidades actuales

  • YAGNI (You Aren't Gonna Need It)
  • Soluciones simples primero
  • Evolución incremental

Uso Concreto vs Reutilización

Priorizar soluciones específicas sobre abstracciones prematuras

  • Resolver el problema actual
  • Abstraer cuando hay patrones claros
  • Evitar generalización prematura

Reglas del Código Sostenible

Cuatro reglas fundamentales para mantener código de calidad

  • 1. Cubierto por test
  • 2. Los test son sostenibles
  • 3. Las abstracciones tienen sentido
  • 4. Intencionalidad explícita
Capítulo 4

Técnicas para Elegir Nombres

El arte de nombrar elementos en el código

Características de Buenos Nombres

Propiedades que deben tener los nombres en el código

  • Fáciles de pronunciar
  • Sin información técnica
  • Concretos y específicos
  • Forman frases naturales (is, has)

Evitar Malas Prácticas

Qué no hacer al nombrar elementos

  • Sin alias confusos
  • Evitar abreviaciones
  • No usar números en secuencia
  • Evitar nombres genéricos

Estrategias de Naming

Técnicas para crear nombres efectivos

  • Apoyarse en el contexto
  • Usar sustantivos, verbos, adjetivos apropiados
  • Nombrar valores literales
  • Renombrar al día siguiente si es necesario
Capítulo 5

Principio de Menor Sorpresa

La brújula del código sostenible

Definición del Principio

El código debe comportarse como los desarrolladores esperan

  • Comportamiento predecible
  • Consistencia en la API
  • Seguir convenciones establecidas

Aplicación Práctica

Cómo implementar este principio en el día a día

  • Métodos que hacen lo que su nombre indica
  • Parámetros en orden lógico
  • Valores de retorno esperados

Evitar Efectos Secundarios

Minimizar comportamientos inesperados

  • Funciones puras cuando sea posible
  • Documentar efectos secundarios necesarios
  • Separar comandos de consultas
Capítulo 6

Cohesión y Acoplamiento

La estrella polar del diseño de software

Alta Cohesión

Elementos relacionados deben estar juntos

  • Responsabilidades relacionadas
  • Funciones que trabajan juntas
  • Datos y comportamientos unidos

Bajo Acoplamiento

Minimizar dependencias entre módulos

  • Ley de Demeter
  • Dile, no preguntes (Tell, Don't Ask)
  • Interfaces bien definidas

Connascence

Medida de la fuerza de dependencia entre elementos

  • Connascence de nombre
  • Connascence de tipo
  • Connascence de significado
  • Connascence de algoritmo
Capítulo 7

Principios SOLID

Cinco principios fundamentales del diseño orientado a objetos

SRP - Responsabilidad Única

Una clase debe tener una sola razón para cambiar

  • Una responsabilidad por clase
  • Facilita el mantenimiento
  • Reduce el acoplamiento

OCP - Abierto-Cerrado

Abierto para extensión, cerrado para modificación

  • Extensible sin modificar código existente
  • Uso de abstracciones
  • Polimorfismo y herencia

LSP - Sustitución de Liskov

Los objetos derivados deben ser sustituibles por sus bases

  • Contratos bien definidos
  • Precondiciones no más fuertes
  • Postcondiciones no más débiles

ISP - Segregación de Interfaces

Muchas interfaces específicas mejor que una general

  • Interfaces cohesivas
  • Evitar dependencias innecesarias
  • Clientes no dependen de métodos que no usan

DIP - Inversión de Dependencias

Depender de abstracciones, no de concreciones

  • Módulos de alto nivel no dependen de bajo nivel
  • Ambos dependen de abstracciones
  • Facilita testing y flexibilidad
Capítulo 8

Implementación Sostenible

Técnicas prácticas para escribir código mantenible

Estructura y Formato

Organización visual del código

  • Indentación consistente
  • Reducir el ámbito al máximo
  • Cláusulas guarda y simetría

Composición vs Herencia

Preferir composición sobre herencia

  • Mayor flexibilidad
  • Menos acoplamiento
  • Más fácil de testear

Constructores y Funciones

Mejores prácticas para métodos y constructores

  • Constructores simples
  • Constructores con nombre
  • Separar control de flujo y lógica
  • Preferir funciones puras

Parámetros y CQS

Gestión de parámetros y separación de responsabilidades

  • Sin parámetros de configuración
  • Reducir la aridad
  • CQS: Separar Consultas y Comandos
Capítulo 9

Gestión y Prevención de Errores

Estrategias para código robusto y resiliente

Prevención de Errores Humanos

Diseñar sistemas que minimicen errores

  • Comprender el lenguaje profundamente
  • Valores, referencias, objetos
  • Comparación (equals, hashCode)
  • Copia superficial vs profunda

Áreas de Concentración de Accidentes

Zonas del código más propensas a errores

  • Gestión del estado
  • Asincronía y concurrencia
  • Manejo de recursos
  • Validación de entrada

Código Resiliente vs Defensivo

Estrategias para manejar situaciones inesperadas

  • Fail fast vs fail safe
  • Validación en fronteras
  • Recuperación elegante

Gestión de Ausencia y Errores

Patrones para manejar valores ausentes y errores

  • Patrón Objeto Nulo
  • Tipo Optional/Maybe
  • Tipo Either
  • Patrón Notificación
  • Tipo Try
Capítulo 10

Tipos Específicos del Dominio

Expresividad y cohesión a través de tipos

Ventajas de Tipos Específicos

Por qué crear tipos propios del dominio

  • Mayor expresividad
  • Mejor cohesión
  • Anti-Primitive Obsession
  • Validación en tiempo de compilación

Objetos Valor vs Entidades

Diferencias fundamentales en el diseño

  • Objetos Valor: inmutables, sin identidad
  • Entidades: mutables, con identidad
  • Cuándo usar cada uno

Genéricos y Tipos Algebraicos

Herramientas avanzadas de tipado

  • Genéricos para reutilización
  • Tipos Suma (Union Types)
  • Tipos Producto (Record Types)
  • Composición de tipos
Capítulo 11

Principios Malinterpretados

Desmitificando reglas obsoletas de programación

Contexto Histórico

Por qué surgieron ciertas reglas y por qué ya no aplican

  • Limitaciones de hardware antiguo
  • Herramientas de desarrollo primitivas
  • Evolución de lenguajes y paradigmas

Reglas Obsoletas

Principios que ya no son relevantes o son contraproducentes

  • Un solo return por función
  • Definir variables al inicio
  • Interfaces siempre desacoplan
  • Getters y Setters para todo

Optimización Prematura

El equilibrio entre legibilidad y rendimiento

  • El código debe ser óptimo (mito)
  • Legibilidad primero, optimización después
  • Medir antes de optimizar
  • Comentar solo lo necesario
Capítulo 12

Créditos

Libro

Está basado en el libro

  • Autor: Carlos Blé Jurado
  • Prólogo: Javier Ferrer

Resumen

Puntos principales

  • Autor: Daniel Boggiano

Audio

Podcast generado con IA

  • Autor: Daniel Boggiano
  • YouTube: