“Código Limpo”: Como organizar consultas nomeadas?

5

Há alguns dias comecei a ler o livro "Código Limpo" de Robert C. Martin e ele me encorajou a olhar com mais detalhes no meu código. Depois que eu abri o eclipse, vi isso:

entityManager.createNamedQuery("CarriageRouteEntity.listCarriageDirections");

e eu decidi mover a string CarriageRouteEntity.listCarriageDirections para string constante. Após uma correção rápida, criei algo assim:

@NamedQueries({
        @NamedQuery(name = CarriageRouteEntity.LIST_CARRIAGE_DIRECTIONS, query = "just query ...") })
public class CarriageRouteEntity {
    public static final String LIST_CARRIAGE_DIRECTIONS = "CarriageRouteEntity.listDirections";
    // ...
}

então agora eu chamo assim:

entityManager.createNamedQuery(CarriageRouteEntity.LIST_CARRIAGE_DIRECTIONS);

E aqui comecei a me perguntar onde devo colocar constantes de consultas nomeadas. A classe da entidade é um bom lugar para isso? Talvez eu deva criar uma nova classe com essas constantes como

public class CarriageRouteEntityNamedQuery {
        public static final String LIST_CARRIAGE_DIRECTIONS = "CarriageRouteEntity.listDirections";
}

mas se outro programador tentar criar uma consulta nomeada, ele saberá onde procurar? Quais são suas opiniões? Como organizar essas constantes? Talvez, em vez de criar CarriageRouteEntityNamedQuery class, eu deveria criar enum e adicionar método à entidade CarriageRouteEntity chamada getNamedQuery() , que dirá a outro programador em qual enum ele deve procurar constantes?

    
por pepuch 08.02.2014 / 21:02
fonte

2 respostas

4

Eu fiz as duas abordagens que você mencionou e ambas são igualmente úteis. Dependendo de como sua arquitetura está configurada, há algumas condições que você pode considerar:

1.) Se você tiver menos de 7 ou 8 consultas nomeadas, consideraria colocá-las como constantes na mesma classe que os métodos de acesso a dados se e somente se as consultas nomeadas forem usadas nessa classe.

2.) Se você tiver mais de 8 consultas nomeadas ou tiver várias consultas nomeadas espalhadas em várias classes de entidade que você gostaria de armazenar em um único local, eu definitivamente as colocaria em uma classe separada como constantes. / p>

Certifique-se de colocar suas classes de consulta nomeadas o mais próximo possível das suas classes de entidade.

    
por 09.02.2014 / 02:05
fonte
3

Existe uma razão pela qual você está evitando usar um Enum para isso?

Isto é:

    public enum NamedQueryEnum {
       LIST_CARRIAGE_DIRECTIONS("CarriageRouteEntity.listCarriageDirections"),
       LIST_DESTINATIONS("DestinationEntity.listDestinations");
       // additional query names get added here

       private String queryName;

       private NamedQueryEnum( String queryName) {
          this.queryName= queryName;
       }

      public Query getQuery(EntityManagager entitymanager) {
          return entityManager.createNamedQuery(entityManager.createNamedQuery(queryName));
      }
   }

Então sua ligação seria:

NamedQueryEnum.LIST_CARRIAGE_DIRECTIONS.getQuery(entityManager));
    
por 09.02.2014 / 18:51
fonte