"Pulisci codice": come organizzare le interrogazioni con nome?

5

Pochi giorni fa ho iniziato a leggere il libro "Clean Code" di Robert C. Martin e mi ha incoraggiato a dare un'occhiata più dettagliata al mio codice. Dopo aver aperto Eclipse, ho visto questo:

entityManager.createNamedQuery("CarriageRouteEntity.listCarriageDirections");

e ho deciso di spostare stringa CarriageRouteEntity.listCarriageDirections in stringa costante. Dopo la correzione rapida ho creato qualcosa di simile a questo:

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

così ora lo chiamo in questo modo:

entityManager.createNamedQuery(CarriageRouteEntity.LIST_CARRIAGE_DIRECTIONS);

E qui ho iniziato a chiedermi dove dovrei inserire le costanti di query denominate. La classe di entità è un buon posto per questo? Forse dovrei creare una nuova classe con queste costanti come

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

ma se un altro programmatore proverà a creare una query con nome saprà dove guardarlo? Quali sono le tue opinioni? Come organizzare queste costanti? Forse invece di creare CarriageRouteEntityNamedQuery class dovrei creare enum e aggiungere il metodo all'entità CarriageRouteEntity chiamata getNamedQuery() che dirà a un altro programmatore in cui enum dovrebbe cercare le costanti?

    
posta pepuch 08.02.2014 - 21:02
fonte

2 risposte

4

Ho seguito entrambi gli approcci che hai menzionato ed entrambi sono ugualmente utili. A seconda della configurazione della tua architettura, ci sono alcune condizioni che potresti voler considerare:

1.) Se hai meno di 7 o 8 query denominate, prenderei in considerazione la possibilità di inserirle come costanti nella stessa classe dei metodi di accesso ai dati se e solo se le query denominate sono utilizzate in quella classe.

2.) Se hai più di 8 query denominate o se hai più query con nome distribuite su più classi di entità che desideri archiviare in una singola posizione, inserirò sicuramente quelle in una classe separata come costanti.

Assicurati di posizionare le tue classi di query nominate il più vicino possibile alle tue classi di entità.

    
risposta data 09.02.2014 - 02:05
fonte
3

C'è una ragione per cui stai evitando di usare un Enum per questo?

Cioè:

    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));
      }
   }

Quindi la tua chiamata sarebbe:

NamedQueryEnum.LIST_CARRIAGE_DIRECTIONS.getQuery(entityManager));
    
risposta data 09.02.2014 - 18:51
fonte

Leggi altre domande sui tag