Type something to search...
Convención de Nombres en Clases Java: Mejora de Legibilidad y Mantenibilidad

Convención de Nombres en Clases Java: Mejora de Legibilidad y Mantenibilidad

En proyectos de gran escala, identificar rápidamente el tipo de una clase facilita la comprensión del código, la colaboración y la depuración. Sin un esquema de nombres estandarizado, es común que los desarrolladores enfrenten dificultades al interpretar la funcionalidad de una clase solo por su nombre, lo que ralentiza el mantenimiento y el desarrollo. En entornos profesionales, donde múltiples equipos trabajan sobre el mismo código base, contar con una nomenclatura clara mejora la comunicación y reduce la posibilidad de errores. Para solucionar esto, se propone una convención de nombres basada en prefijos y sufijos que permita diferenciar los distintos tipos de clases en Java.

Para garantizar la claridad, adoptamos las siguientes reglas:

  • Prefijos:
    • Enumeraciones: E (Ejemplo: EUserRole)
    • Interfaces: I (Ejemplo: IUserService)
  • Sufijos:
    • Entities (Ent): Representan objetos persistentes. Ejemplo: UserEnt
    • Value Objects (VO): Objetos inmutables con valor significativo. Ejemplo: MoneyVO
    • Data Transfer Objects (DTO): Transporte de datos entre capas. Ejemplo: UserDTO
    • Repositories (Repo): Acceso a datos. Ejemplo: UserRepo
    • Services (Svc): Lógica de negocio. Ejemplo: UserSvc
    • Controllers (Ctrl): Gestionan solicitudes HTTP. Ejemplo: UserCtrl
    • Exceptions (Ex): Manejo de errores. Ejemplo: InvalidUserEx
    • Configuration (Cfg): Configuraciones de aplicación. Ejemplo: DatabaseCfg
    • Utility (Util): Métodos reutilizables. Ejemplo: DateUtil
    • Test (Test): Clases de prueba. Ejemplo: UserSvcTest
    • Commands (Cmd): Acciones en el sistema. Ejemplo: CreateUserCmd
    • Domain Events (Evt): Eventos de dominio. Ejemplo: UserCreatedEvt
    • Validation (Val): Validaciones. Ejemplo: UserVal
    • Adapters (Adp): Integraciones con otros sistemas. Ejemplo: ExternalServiceAdp
    • Message Brokers (Brk): Comunicación con colas de mensajes. Ejemplo: KafkaMsgBrk
    • Mappers (Map): Transformación de objetos. Ejemplo: UserMap
    • Views (View): Modelos de presentación. Ejemplo: UserView
    • Gateways (Gtw): Comunicación con servicios externos. Ejemplo: PaymentGtw
    • Factories (Fct): Creación de objetos. Ejemplo: UserFct
    • Specifications (Spec): Criterios de búsqueda. Ejemplo: UserSpec
    • Middleware (Mid): Interceptores de solicitudes. Ejemplo: AuthMid
    • Aggregates (Agg): Raíces de agregados DDD. Ejemplo: OrderAgg
    • Use Cases (UC): Casos de uso específicos. Ejemplo: RegisterUserUC
    • Queries (Qry): Consultas a la base de datos. Ejemplo: FindUserQry
    • View Models (VM): Modelos de datos para UI. Ejemplo: UserVM
    • Policy / Guard (Pol o Grd): Reglas de negocio. Ejemplo: UserAccessPol

Para aplicar esta convención en un proyecto, recomendamos documentarla dentro del repositorio, integrar validaciones automáticas en las revisiones de código mediante linters o revisiones de PR y aplicar la convención en nuevos desarrollos, refactorizando el código legado progresivamente.

Adoptar una convención de nombres en clases Java mejora la comprensión del código y la colaboración en equipos de desarrollo. Al estandarizar prefijos y sufijos, cada clase tiene un propósito claro y es más fácil de ubicar y utilizar. Implementar esta convención desde el inicio de un proyecto o refactorizar el código existente progresivamente traerá beneficios a largo plazo.

Tipo de ClasePrefijo/SufijoEjemploDescripción
EnumeracionesEEUserRoleDefine un conjunto de valores constantes
InterfacesIIUserServiceDefine contratos que deben implementar las clases
EntitiesEntUserEntRepresenta objetos persistentes en la base de datos
Value ObjectsVOMoneyVOObjetos inmutables que representan valores
DTOsDTOUserDTOTransporte de datos entre capas
RepositoriesRepoUserRepoAcceso a la base de datos
ServicesSvcUserSvcContiene la lógica de negocio
ControllersCtrlUserCtrlGestiona las solicitudes HTTP
ExceptionsExInvalidUserExManejo de errores y excepciones
ConfigurationCfgDatabaseCfgConfiguraciones de la aplicación
UtilitiesUtilDateUtilMétodos reutilizables
TestsTestUserSvcTestPruebas unitarias y de integración
CommandsCmdCreateUserCmdRepresenta una acción o comando
Domain EventsEvtUserCreatedEvtEventos del dominio
ValidationValUserValValidaciones de datos
AdaptersAdpExternalServiceAdpIntegración con sistemas externos
Message BrokersBrkKafkaMsgBrkComunicación con colas de mensajes
MappersMapUserMapConversión entre objetos
ViewsViewUserViewModelos de presentación
GatewaysGtwPaymentGtwComunicación con servicios externos
FactoriesFctUserFctCreación de instancias de objetos
SpecificationsSpecUserSpecDefinición de criterios de búsqueda
MiddlewareMidAuthMidInterceptores de solicitudes
AggregatesAggOrderAggRaíz de un agregado en DDD
Use CasesUCRegisterUserUCCasos de uso específicos
QueriesQryFindUserQryConsultas a la base de datos
View ModelsVMUserVMModelos de datos para UI
Policy/GuardPol/GrdUserAccessPolReglas de negocio y restricciones

Related Posts

Estructuración de Carpetas en Proyectos de Software

Estructuración de Carpetas en Proyectos de Software

En proyectos de software de gran escala, la falta de una estructura de carpetas bien definida puede generar desorden, dificultando la mantenibilidad, escalabilidad y comprensión del código. Muchas vec

Descubre el Poder del SemVer: Optimiza el Versionado de tu Software y Mantén un CHANGELOG Excepcional

Descubre el Poder del SemVer: Optimiza el Versionado de tu Software y Mantén un CHANGELOG Excepcional

El Versionado Semántico (SemVer) es una herramienta fundamental para comunicar de forma precisa los cambios en el software, facilitando el mantenimiento y la colaboración. Complementarlo con un **

Estándar de Codificación y Gestión de Errores en Arquitecturas de Microservicios

Estándar de Codificación y Gestión de Errores en Arquitecturas de Microservicios

En el ecosistema de aplicaciones web modernas, la arquitectura de microservicios distribuidos se ha consolidado como un paradigma dominante. Su flexibilidad, escalabilidad y resiliencia son innegables

Desarrollo de Software Implementando Gitflow

Desarrollo de Software Implementando Gitflow

Introducción El desarrollo de software requiere metodologías y flujos de trabajo que permitan un control eficiente del código fuente. Uno de los enfoques más utilizados para la gestión de versiones

Optimizando el Acceso a Datos: La Importancia de las Proyecciones JPA en Spring Boot

Optimizando el Acceso a Datos: La Importancia de las Proyecciones JPA en Spring Boot

El Costo Oculto de Traer Demasiada Información En el desarrollo de aplicaciones que interactúan con bases de datos, una tarea fundamental es la recuperación de datos. Al usar Object-Relational Map

Asegurando el Tejido Distribuido: Una Guía para la Seguridad en Arquitecturas de Microservicios

Asegurando el Tejido Distribuido: Una Guía para la Seguridad en Arquitecturas de Microservicios

El viaje hacia arquitecturas de microservicios ha transformado la forma en que construimos y desplegamos software. La agilidad, escalabilidad y resiliencia que ofrecen son innegables. Sin embargo, est

Implementando Trunk Based Development con Ramas de Vida Corta en Tu Equipo: Una Guía Completa

Implementando Trunk Based Development con Ramas de Vida Corta en Tu Equipo: Una Guía Completa

En el ámbito del desarrollo de software, la elección de una estrategia de versionamiento eficiente y estable es fundamental para el éxito de un equipo. El Trunk Based Development (TBD) tradicional, do

Arquitectura DDD y Hexagonal: Construyendo Software para el Futuro

Arquitectura DDD y Hexagonal: Construyendo Software para el Futuro

En el dinámico mundo del desarrollo de software, la complejidad es el enemigo silencioso. Las aplicaciones crecen, los requisitos cambian y, sin una guía clara, el código puede convertirse rápidamente

Manejando el Caos: Una Guía Definitiva sobre Excepciones de Dominio 🎯

Manejando el Caos: Una Guía Definitiva sobre Excepciones de Dominio 🎯

En el desarrollo de software moderno, escribir código que funciona perfectamente en escenarios ideales es solo el primer paso. La verdadera fortaleza de un sistema se manifiesta cuando debe enfrentar

El Arte de Conectar: Forjando un DataSource Dinámico en Spring Boot

El Arte de Conectar: Forjando un DataSource Dinámico en Spring Boot

En el vertiginoso universo del desarrollo de software, donde la seguridad es un pilar innegociable y la agilidad es la moneda de cambio, nos enfrentamos a desafíos que van más allá de la simple lógica

Transacciones Declarativas en Arquitecturas Hexagonales con Spring WebFlux y AOP

Transacciones Declarativas en Arquitecturas Hexagonales con Spring WebFlux y AOP

En el desarrollo de aplicaciones reactivas modernas, especialmente bajo paradigmas como la Arquitectura Hexagonal, surgen desafíos que nos obligan a repensar cómo aplicamos conceptos transversales. Un

Más Allá del `try-catch`: Diseñando un Sistema de Excepciones Robusto y Escalable 🎯

Más Allá del `try-catch`: Diseñando un Sistema de Excepciones Robusto y Escalable 🎯

En el desarrollo de APIs, el manejo de errores suele ser un ciudadano de segunda clase. Con frecuencia, nos conformamos con respuestas de error genéricas, inconsistentes o, en el peor de los casos, co

Respuestas API Consistentes: Un Wrapper Transversal con Spring WebFlux y `WebFilter`

Respuestas API Consistentes: Un Wrapper Transversal con Spring WebFlux y `WebFilter`

En entornos modernos de microservicios, la consistencia en las respuestas de una API es más que una cuestión de estética: es un factor crítico para la mantenibilidad, observabilidad y experiencia del

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD

Hay una tensión que todo equipo de desarrollo enfrenta tarde o temprano: la necesidad de saber qué está pasando dentro del sistema sin que esa necesidad contamine el código que lo hace funcionar. Los

Arquitectura Modular por Contexto: Cuando la Teoría se Encuentra con la Realidad

Arquitectura Modular por Contexto: Cuando la Teoría se Encuentra con la Realidad

Has estado ahí. Es lunes por la mañana, abres el proyecto en tu IDE, y necesitas modificar cómo se procesa un pedido. Treinta minutos después, todavía estás navegando entre carpetas intentando encontr

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD — Parte II

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD — Parte II

La primera parte de este artículo construyó el argumento conceptual: por qué los logs dispersos se convierten en deuda técnica, cómo AOP permite centralizar la observabilidad sin contaminar la lógica

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD — Parte III

Observabilidad sin Ruido: Diseñando un Sistema de Logs con AOP en Arquitecturas DDD — Parte III

Las dos primeras partes de esta serie resolvieron un problema bien delimitado: construir un sistema de logging centralizado que operara de forma transversal sobre una arquitectura DDD sin contaminar l

El tramo en cascada que todo proyecto ágil necesita (y casi ninguno tiene)

El tramo en cascada que todo proyecto ágil necesita (y casi ninguno tiene)

Llevas un tiempo trabajando en equipos que dicen practicar Scrum, y algo no termina de cuadrarte. Los sprints avanzan, la demo sale en tiempo, el tablero se vacía cada dos semanas. Y aun así, al cabo