Passa dati in un costruttore o crea invece metodi virtuali?

1

In un modulo orientato agli oggetti che descrive un database, dovrei passare le strutture dati di descrizione del DB al costruttore nei costruttori delle classi derivate, o dovrei invece creare metodi ("virtuali" che sono dinamici) che creano le strutture dati e chiamano li nel costruttore?

Queste strutture dati sono lunghe (circa 100 array di elementi).

Segue un esempio Python:

class Base:
  def __init__(data_desciption):
    self.data_desciption = data_desciption

vs

class Base:
  def __init__():
    self.data_desciption = self.data_desciption_init()

o in C ++:

 class Base {
   DataDescription data;
 public:
   Base(DataDescription &data_description) {
     data = data_description;
   }
 };

vs

 class Base {
   DataDescription data;
 protected:
   virtual DataDescription &get_data_description() = 0;
 public:
   Base() {
     data = get_data_description();
   }
 };

(probabilmente non ottimizzato per la velocità, ma ora è irrilevante). (Oh, ho dimenticato che i costruttori di C ++ non possono chiamare funzioni pure virtuali, non usate C ++ per molto tempo, ma questo non cambia l'essenza della mia domanda).

In effetti ora sto programmando in Perl.

    
posta porton 28.08.2015 - 19:50
fonte

1 risposta

4

Il passaggio nella struttura dati preverrà un potenziale bug che può verificarsi quando un costruttore di una classe base chiama un metodo astratto definito dalla classe figlia.

Questo potenziale bug si verifica quando la classe figlio ha una variabile membro inizializzata nel costruttore. Quindi, l'implementazione del metodo astratto presuppone che la variabile membro sia stata inizializzata. In molte lingue, il costruttore della classe base viene sempre eseguito all'inizio del costruttore della classe figlio. Ciò significa che la classe base chiama il metodo astratto prima che la classe figlia abbia la possibilità di inizializzare la sua variabile membro.

In Python, questo può essere evitato inizializzando le variabili membro prima di chiamare il costruttore della classe base. Ma devi ancora essere consapevole di questo potenziale problema per aggirare il problema. Non conosco abbastanza Perl per commentare se questo lavoro potrebbe anche essere usato.

    
risposta data 28.08.2015 - 20:21
fonte

Leggi altre domande sui tag