Metodi di refactoring per accedere a un database

0

Ho molte classi che recuperano oggetti di database. Ho implementato i loro metodi come statici, in modo che possano essere chiamati così:

class xxxDB {
   public static method1(Connection dbcon) {
      //...
      method2(dbcon, ...);
   }
   public static method2(Connection dbcon, ....) {
      //...
   }
   // Other specific methods for xxx
}

Mi piace la soluzione dei metodi statici, ma è necessario passare tutto il tempo intorno all'oggetto Connection a tutti i metodi, e non lo trovo particolarmente chiaro o elegante. Quindi ho valutato diverse opzioni per il refactoring (e ho scartato l'uso di JPA, perché non sono sicuro di come implementarlo nel mio specifico database strano). Uno è quello di evitare statiche e utilizzare una variabile di istanza immutabile in ciascuna delle classi:

class xxxDB {
   private final Connection dbcon;

   public xxxDB(Connection dbcon) {
      this.dbcon = dbcon;
   }

   public static method1() {
      //...
      method2(...);
   }
   // Other specific methods for xxx
}

Ma questo crea un sacco di codice duplicato. Per ogni classe, e ne ho parecchi, devo duplicare l'istanza e il costruttore. La mia idea sarebbe quella di avere una super classe che possa essere estesa da tutti gli altri:

class superDB {
   private final Connection dbcon;

   private superDB(){}

   public superDB(Connection dbcon) {
      this.dbcon = dbcon;
   }
}

Ma questo mi costringe ancora a ripetere questo codice in ogni classe:

   public xxxDB(Connection dbcon) {
      this.dbcon = dbcon; // or super(dbcon);
   }

Le mie domande sono:

  1. È davvero una buona idea rifattorizzare i metodi static che accedono al database?
  2. C'è un modo / schema per le mie classi di ereditare il "costruttore di un arg" della super classe? Qualcosa come:

.

class superDB {
   private final Connection dbcon;

   private superDB(){}

   public superDB(Connection dbcon) {
      this.dbcon = dbcon;
   }
}

class xxxDB extends superDB {
   // no need to add duplicated code to call the super
   public static method1() {
      //...
   }
   // Other specific methods for xxx
}
    
posta user1156544 05.04.2018 - 15:56
fonte

1 risposta

1

Perché vuoi mantenere l'accesso statico? Se vai con istanze delle classi figlie potresti creare una super classe con un getter e setter per la connessione:

class superDB {
   protected Connection dbcon;

   public getDbcon() {
      return this.dbcon;
   }

   public setDbcon(Connection dbcon) {
      this.dbcon = dbcon;
   }
}

Le classi figlio ereditano dalla super classe e quando si istanziano i propri figli è possibile impostare la connessione tramite setDbcon.

Per mantenere il tuo accesso pigro puoi creare un singleton che fornisca le diverse istanze delle tue classi di db. Il tuo metodo di init singleton potrebbe assomigliare a questo:

superDB[] cons;
public init(Connection dbCon){
 this.cons = new superDB[2];
 this.cons[0] = new XXX();
 this.cons[1] = new YYY();

 foreach(superDB db in this.cons){
   db.setDbcon(dbCon);
 }
}
    
risposta data 05.04.2018 - 20:58
fonte

Leggi altre domande sui tag