Prefacio
- Qué no es este libro
Agradecimientos
Sobre Software Crafters
Sobre el autor
Introducción
Deuda técnica
- Tipos de deuda
- Refactoring, las deudas se pagan
- Mejor prevenir que curar, las reglas del diseño simple
SECCIÓN I: CLEAN CODE
¿Qué es Clean Code?
Variables, nombres y ámbito
- Uso correcto de var, let y const
- Nombres pronunciables y expresivos
- Ausencia de información técnica en los nombres
- Establecer un lenguaje ubicuo
- Nombres según el tipo de dato
- Arrays
- Booleanos
- Números
- Funciones
- Clases
- Ámbito o scope de las variables
- Ámbito global
- Ámbito de bloque
- Ámbito estático vs. dinámico
- Hoisting
Funciones
- Declaración de una función
- Expresión de una función
- Expresiones con funciones flecha (arrow functions)
- Funcionamiento del objeto this en arrow functions
- Funciones autoejecutadas IIFE
- Parámetros y argumentos
- Limita el número de argumentos
- Parámetros por defecto
- Parámetro rest y operador spread
- Tamaño y niveles de indentación
- Cláusulas de guarda
- Evita el uso de else
- Prioriza las condiciones asertivas
- Estilo declarativo frente al imperativo
- Funciones anónimas
- Transparencia referencial
- Principio DRY
- Command–Query Separation (CQS)
- Algoritmos eficientes
- Notación O grande (big O)
Clases
- Prototype y ECMAScript moderno
- Constructores y funciones constructoras
- Métodos
- Herencia y cadena de prototipos
- Tamaño reducido
- Organización
- Prioriza la composición frente a la herencia
Comentarios y formato
- Evita el uso de comentarios
- Formato coherente
- Problemas similares, soluciones simétricas
- Densidad, apertura y distancia vertical
- Lo más importante primero
- Indentación
SECCIÓN II: PRINCIPIOS SOLID
Introducción a SOLID
De STUPID a SOLID
- ¿Qué es un code smell?
- El patrón singleton
- Alto acoplamiento
- Acoplamiento y cohesión
- Código no testeable
- Optimizaciones prematuras
- Complejidad esencial y complejidad accidental
- Nombres poco descriptivos
- Duplicidad de código
- Duplicidad real
- Duplicidad accidental
Principios SOLID al rescate
SRP - Principio de responsabilidad única
- ¿Qué entendemos por responsabilidad?
- Aplicando el SRP
- Detectar violaciones del SRP:
OCP - Principio Abierto/Cerrado
- Aplicando el OCP
- Patrón adaptador
- Detectar violaciones del OCP
LSP - Principio de sustitución de Liskov
- Aplicando el LSP
- Detectar violaciones del LSP
ISP - Principio de segregación de la interfaz
- Aplicando el ISP
- Detectar violaciones del ISP
DIP - Principio de inversión de dependencias
- Módulos de alto nivel y módulos de bajo nivel
- Depender de abstracciones
- Inyección de dependencias
- Aplicando el DIP
- Detectando violaciones del DIP
SECCIÓN III: TESTING Y TDD
Introducción al testing
Tipos de tests de software
- ¿Qué entendemos por testing?
- Test manuales vs automáticos
- Test funcionales vs no funcionales
- Tests funcionales
- Tests no funcionales
- Pirámide de testing
- Antipatrón del cono de helado
Tests unitarios
- Características de los tests unitarios
- Anatomía de un test unitario
Jest, el framework de testing JavaScript definitivo
- Características
- Instalación y configuración
- Nuestro primer test
- Aserciones
- Organización y estructura
- Gestión del estado: before y after
- Code coverage
TDD - Test Driven Development
- Las tres leyes del TDD
- El ciclo Red-Green-Refactor
- TDD como herramienta de diseño
- Estrategias de implementación, de rojo a verde.
- Implementación falsa
- Triangular
- Implementación obvia
- Limitaciones del TDD
TDD Práctico: La kata FizzBuzz
- Las katas de código
- La kata FizzBuzz
- Descripción del problema
- Diseño de la primera prueba
- Ejecutamos y… ¡rojo!
- Pasamos a verde
- Añadiendo nuevas pruebas
- Refactorizando la solución, aplicando pattern matching.