Estándares de Código
Reglas para mantener calidad y consistencia en el proyecto.
Formato de código
Google Java Format
El proyecto usa Google Java Format aplicado automáticamente por Spotless.
Convenciones específicas
Indentación
- 2 espacios (no tabs)
- Continuación: 4 espacios adicionales
Longitud de línea
- Máximo 100 caracteres
- Excepciones: URLs, imports, Gherkin
Llaves
- Apertura en la misma línea (estilo K&R)
Nombrado
Clases
// ✅ Bien
public class ArrayListExample { }
public class HashSetOperations { }
// ❌ Mal
public class arraylistexample { }
public class Hash_Set_Operations { }
Métodos
// ✅ Bien
public void addElement(String element) { }
public boolean containsValue(String value) { }
public List<String> getAllElements() { }
// ❌ Mal
public void add_element(String element) { }
public boolean contains(String value) { } // muy genérico
Variables
// ✅ Bien
private List<String> elementList;
private int currentSize;
private boolean isEmpty;
// ❌ Mal
private List<String> list; // muy genérico
private int size; // podría confundir con método
private boolean empty; // falta verbo
Constantes
// ✅ Bien
private static final int DEFAULT_CAPACITY = 10;
private static final String SEPARATOR = ", ";
// ❌ Mal
private static final int defaultCapacity = 10;
private static final String separator = ", ";
Javadoc
Toda clase pública debe tener Javadoc:
/**
* Ejemplifica el uso de ArrayList para almacenar elementos.
*
* <p>Demuestra operaciones básicas como agregar, eliminar,
* acceder y buscar elementos en una lista.
*/
public class ArrayListExample {
// ...
}
Métodos públicos importantes:
/**
* Agrega un elemento a la lista.
*
* @param element el elemento a agregar
* @return true si se agregó correctamente
*/
public boolean addElement(final String element) {
// ...
}
Gherkin (BDD)
Idioma
- Todas las features en español
# language: esal inicio del archivo
Estructura
# language: es
Característica: Operaciones básicas de ArrayList
Como desarrollador Java
Quiero usar ArrayList
Para almacenar elementos
Escenario: Agregar elemento
Dado un ArrayList vacío
Cuando agrego "Java"
Entonces el tamaño es 1
Step definitions
@Dado("un ArrayList vacío")
public void unArrayListVacio() {
arrayList = new ArrayList<>();
}
@Cuando("agrego el elemento {string}")
public void agregoElElemento(final String element) {
arrayList.add(element);
}
Imports
Orden
java.*javax.*- Librerías de terceros
io.github.cazucito.*
import java.util.ArrayList;
import java.util.List;
import io.cucumber.java.es.Dado;
import io.cucumber.java.es.Cuando;
Checkstyle
El proyecto usa Checkstyle para verificar estilo. Reglas principales:
- ✅ Javadoc en clases públicas
- ✅ No wildcard imports
- ✅ Line length ≤ 100
- ✅ Method length ≤ 150 líneas
- ✅ Cyclomatic complexity ≤ 10
- ✅ No trailing whitespace
SpotBugs
Análisis estático para detectar bugs potenciales:
- Null pointer dereferences
- Infinite loops
- Dead stores
- Resource leaks
Pre-commit checklist
Antes de hacer commit:
# 1. Formato
mvn spotless:apply
# 2. Verificación completa
mvn clean verify
# 3. Si todo pasa, commit
git add .
git commit -m "tipo: descripción"
Mensajes de commit
Formato: tipo: descripción breve
Tipos:
- feat: Nueva funcionalidad
- fix: Corrección de bug
- docs: Documentación
- test: Tests
- refactor: Refactorización
- style: Cambios de formato
- chore: Tareas de mantenimiento
Ejemplos:
feat: agregar ejemplos de TreeMap
fix: corregir NullPointerException en HashSetSteps
docs: completar documentación de ArrayList
test: agregar 5 escenarios para PriorityQueue
Violaciones comunes
❌ Múltiples strings literales
// ❌ Mal
String result = a + ", " + b + ", " + c;
// ✅ Bien
private static final String SEPARATOR = ", ";
String result = a + SEPARATOR + b + SEPARATOR + c;
❌ Catching Exception genérico
// ❌ Mal
try {
// código
} catch (Exception e) {
// ...
}
// ✅ Bien
try {
// código
} catch (IllegalArgumentException e) {
// ...
}