com.caioms.java_marketplace (ver ADR-0001 e ADR-0002)Ao materializar a primeira fatia em código, duas decisões estruturais precisaram ser fixadas para não virarem inconsistência acumulada:
shared/security e shared/openapi. Na prática, um pacote
shared acrescenta uma palavra que não carrega informação: o que ele quer dizer é "não
pertence a nenhum módulo, logo qualquer módulo pode usar". Essa mesma informação já está na
ausência de modules/ no caminho.usecases). Em nomes de mais de uma palavra isso prejudica a
leitura, e a decisão precisa valer desde o começo para não ter de reescrever pacotes depois.1. Fronteira por posição, não por nome shared. A infra transversal vive em pacotes na
raiz de com.caioms.java_marketplace (hoje http.security e http.openapi); os bounded
contexts vivem sob modules.<contexto>. A regra que substitui o shared do ADR-0002:
Estar fora de
modules/É a marca de transversal — qualquer módulo pode depender dele. Nada emmodules/<x>pode ser importado pormodules/<y>a não ser via API pública do módulo.
Isto supersede apenas o naming do ADR-0002 (shared/… → pacotes na raiz). A decisão de
fundo do 0002 — segurança/emissão de token repartidas por responsabilidade, com direção de
dependência única modules.identity → (transversal) — permanece integralmente válida.
2. Convenção de nomes.
snake_case (use_cases, não useCases
nem usecases). Casa com o java_marketplace já presente na base e separa melhor num
caminho pontilhado.use_cases, nunca Use_cases), para não haver
ambiguidade "pacote ou classe?" num import.snake_case vale exclusivamente para segmento de
pacote — em nenhum outro identificador.google-java-format/Spotless formata espaçamento e ordem de
import, mas nunca renomeia identificador ou segmento de pacote, então não briga com o
snake_case nos pacotes.snake_case em pacote desvia da convenção oficial do Java — um revisor pode estranhar.
Aceito conscientemente em troca de legibilidade; documentado aqui para que seja lido como
escolha, não descuido.PackageName default (^[a-z]+(\.[a-z][a-z0-9]*)*$),
ela reprovaria os pacotes snake_case. Mitigação: ajustar o regex da regra, não os pacotes.shared) depende de disciplina/leitura
do caminho; a verificação de fronteiras do Spring Modulith (ADR-0001) é quem torna isso
executável, não apenas convencional.Manter shared/ (ADR-0002) — descartado. Palavra redundante com a informação que a
ausência de modules/ já dá; e "http" na raiz comunica melhor a natureza (encanamento web
transversal) do que "shared".
Segmento de pacote em camelCase (useCases) — descartado. No meio de um caminho
pontilhado, um segmento camelCase pode ser lido como nome de classe; snake_case separa de
forma mais clara e alinha com a base java_marketplace.
Seguir a convenção oficial usecases (tudo minúsculo, junto) — descartado. Nomes de mais
de uma palavra ficam difíceis de ler colados; a legibilidade foi priorizada sobre a
conformidade estrita.
Reconsiderar quando: (a) entrar uma ferramenta de lint de nomes (ex.: Checkstyle) cujo custo de configurar a exceção supere o ganho de legibilidade; ou (b) o projeto passar a ter mais de um autor e a convenção não-padrão virar fonte recorrente de fricção em revisão.