Como lidar com classes com o mesmo nome (pacotes diferentes)


9

Eu e minha equipe de P&D mantemos uma grande base de código. Dividimos nossa lógica de negócios em vários pacotes. alguns dos quais possuem classes com nomes idênticos .

Como você pode imaginar, os nomes entram em conflito quando as duas classes são referenciadas no mesmo arquivo Java.


Por exemplo:

com.myapp.model (package)
 - Device (class)
 - ...

com.myapp.data (package)
 - Device (class)
 - ...

Tivemos um debate sobre qual a melhor prática para tratar esses casos e surgiram as seguintes opções:

1ª Opção

  • Renomeando a classe, adicionando um prefixo

    ModelDevice
    DataDevice

2ª Opção

  • Usando o pacote completo + nome da classe quando ambos são referenciados

    com.myapp.model.Device
    com.myapp.data.Device

O que é mais correto em termos de gerenciamento de código e escalabilidade?

atualmente estamos misturando as duas abordagens e começando a ter inconsistência


Se for ocasional, provavelmente não importa - se for um padrão recorrente, provavelmente nomearia as classes com mais precisão para evitar que se tornasse uma bagunça.
Assylias

Você não tem idéia do quanto eu odeio java.util.Datee java.sql.Date- especialmente porque java.sql.Dateé uma subclasse java.util.Datee muito bem sai das camadas de dados (e não serializa muito bem para JSON).

Opção 2.1 Sempre usar o nome completo, mesmo se o outro não é referenciado
Caleth

Respostas:


16

Use o nome do pacote. Esse tipo de problema é precisamente o motivo pelo qual o Java usa a convenção de nomenclatura de pacotes. Isso evita esse tipo de problema, sejam duas equipes na mesma empresa ou duas equipes em lados opostos do mundo.


1

A partir de agora você tem uma classe ModelDevice (Dispositivo no pacote do modelo). E se você tiver outro ModelDevice para uma classificação diferente? O problema ainda pode persistir e as despesas gerais também continuarão aumentando.

Embora, por enquanto, você possa achar que renomear classes é de alguma ajuda, a longo prazo a alternativa sugerida é prefixar os nomes dos pacotes, que é o padrão da indústria.


0

Apenas para adicionar um aspecto que ainda não foi mencionado:

Veja os padrões de uso, ou seja, as fontes Java que fazem referência a uma ou ambas as classes.

IMHO, na maioria dos casos, os arquivos de origem devem fazer referência apenas a uma das classes conflitantes e, a partir do contexto, deve ficar claro se eles lidam com o modelo ou o mundo dos dados. Se isso for difícil, por qualquer motivo, renomeio as classes, pois geralmente não gosto de nomes de classes com prefixo de pacote no código-fonte (isso prejudica a legibilidade).

Se você possui arquivos de origem que lidam com os dois mundos, eles podem estar unindo classes com a resonsibilidade de traduzir entre duas visões diferentes do mundo, e aqui eu preferiria encontrar nomes de classes com prefixo de pacote.

Mas ver as duas classes de dispositivos em uma fonte também pode ser uma dica de que a fonte viola o princípio de responsabilidade única misturando tarefas do modelo e do mundo dos dados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.