Dilemme de conception de code Java


J'ai un dilemme concernant la conception de mon code.

Tout d'abord, je convertit un VB en système Java. Le programme VB a un module de classe qui est comme une combinaison de POJO et d'accéder à la base de données pour sa logique. J'ai créé une classe similaire en JAVA avec getters et setters. Mon dilemme est que puisque j'ai besoin de copier la structure des codes VB (nous sommes obligés de le faire), je dois également inclure les services de requête dans ma classe JAVA. Mais dans notre cadre, seules les classes de service ont accès à les services de requête.

Je pense à changer ma classe JAVA en classe abstact et à utiliser une classe anonyme à la place.

Échantillon:

public abstract class MyClass {
     private int a;
     private int b;

     public String calculate1() {
          // do processing for variables a and b
          String sql = "" // build sql here
          List<Map<String, Object>> result = query(sql);
     }

     public String calculate2() {
          // do processing for variables a and b
          String anotherSql = "" // build anotherSql
          List<Map<String, Object>> result = query(anotherSql);
     }

     protected abstract List<Map<String, Object>> query(String sql);

     // getters and setters for a and b
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass() {
             @Override
             protected List<Map<String, Object>> query(String sql) {
                 return myQueryService.executeQuery(sql);
             }
          };
     }
}

Quelques points à considérer:

  1. Mon Service est un bean singleton-scope.
  2. J'aime aussi que MyClass soit basé sur une session (1 instance par utilisateur).
  3. Puisque je ne déclarerai pas le MyClass dans mon contexte Spring, il ne peut pas utiliser l'injection de dépendance et ne peut pas utiliser d'autres services. Je vais enregistrer l'instance dans un session et va simplement récupérer l'instance de MyClass.

Aussi à cause de ce dilemme, je suis obligé d'utiliser des requêtes de chaîne et un modèle JDBC. À l'origine, notre framework utilise des objets DAO et Hibernate. Si quelqu'un peut également résoudre le code en utilisant DAO, ce serait mieux. Si j'utiliserai des objets DAO, je devrais utiliser différents objets DAO avec leurs classes de service DAO.

Je ne suis pas tout à fait sûr si c'est un bon design. Je ne sais pas aussi si cela va fonctionner. J'ai été pas en mesure d'exécuter cela dans mon environnement.

J'apprécierais vraiment que quelqu'un puisse m'éclairer.

Merci!

Author: qaxi, 2012-10-27

1 answers

Puisqu'une instance de MyClass ne peut pas fonctionner sans une instance de QueryService, que diriez-vous de simplement passer une référence au service de requête dans le constructeur de MyClass:

public abstract class MyClass {
    private final QueryService queryService;

    public MyClass (QueryService queryService) {
        this.queryService = queryService;
    }

    protected List<Map<String, Object>> query(String sql) {
        return queryService.executeQuery(sql);
    }
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass(myQueryService);
     }
}

Faire le champ d'instance queryService final, et avoir un tel constructeur, exprime clairement cette dépendance dans le code.

 1
Author: Bohemian, 2012-10-27 18:18:23