web-dev-qa-db-ja.com

「クリーンコード」:名前付きクエリを整理する方法?

数日前、Robert C. Martinの "Clean Code"の本を読み始めたので、自分のコードをもっと詳しく見るようになりました。私がEclipseを開いた後、私はこれを見ました:

entityManager.createNamedQuery("CarriageRouteEntity.listCarriageDirections");

そして、文字列を移動することにしましたCarriageRouteEntity.listCarriageDirectionsを定数文字列に。簡単な修正の後、私はこのようなものを作成しました:

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

だから今私はそれをこのように呼びます:

entityManager.createNamedQuery(CarriageRouteEntity.LIST_CARRIAGE_DIRECTIONS);

そしてここで、名前付きクエリ定数をどこに置くべきか疑問に思い始めました。エンティティクラスはこれに適していますか?多分私はこれらの定数で新しいクラスを作成する必要があります

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

しかし、別のプログラマが名前付きクエリを作成しようとする場合、彼はそれをどこで見るべきか知っているでしょうか?あなたの意見は何ですか?これらの定数を整理する方法は?多分、CarriageRouteEntityNamedQueryクラスを作成する代わりに、列挙型を作成し、getNamedQuery()というエンティティCarriageRouteEntityにメソッドを追加する必要があります。

5
pepuch

私はあなたが言及したアプローチの両方を実行しました、そして両方とも同じくらい有用です。アーキテクチャの設定方法によっては、考慮すべきいくつかの条件があります。

1.)名前付きクエリが7または8未満の場合、名前付きクエリがそのクラスで使用されている場合に限り、それらをデータアクセスメソッドと同じクラスの定数として配置することを検討します。

2.)名前付きクエリが8つ以上ある場合、または1つの場所に格納する複数のエンティティクラスにまたがる複数の名前付きクエリがある場合は、それらを定数として別のクラスに配置します。

名前付きクエリクラスは、エンティティクラスのできるだけ近くに配置してください。

4
floppsb

これにEnumの使用を避けている理由はありますか?

あれは:

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

その後、あなたの呼び出しは次のようになります:

NamedQueryEnum.LIST_CARRIAGE_DIRECTIONS.getQuery(entityManager));
3
Matthew Flynn