Come può una classe di raccolta istanziare molti oggetti con una chiamata al database?

0

Ho un baseClass dove non voglio i setter pubblici. Ho un metodo load($id) che recupererà i dati per quell'oggetto dal db.

Ho utilizzato metodi di classi statiche come getBy($property,$values) per restituire più oggetti di classe utilizzando una singola chiamata al database. Ma alcune persone dicono che i metodi statici non sono OOP.

Quindi ora sto provando a creare un baseClassCollection che possa fare la stessa cosa. Ma non può, perché non può accedere ai setter protetti. Non voglio che tutti siano in grado di impostare i dati dell'oggetto. Ma sembra che sia una proposta tutto o niente. Non posso dare solo l'accesso alla classe raccolta ai setter.

Ho visto una soluzione che utilizza debug_backtrace() , ma sembra inelegante. Mi sto avvicinando solo a rendere pubblici i setter.

Ci sono altre soluzioni? O dovrei anche cercare altre soluzioni?

    
posta Buttle Butkus 03.11.2013 - 00:31
fonte

2 risposte

1

La tua classe Dominio (diciamo una classe Book) si carica dal DB? Preferirei evitarlo, perché in questo modo mischia il modello di dominio con il codice di persistenza.

Tuttavia, alla tua domanda: quello che ho visto in alcuni framework in Java è che definiscono un'interfaccia pubblica (nel tuo caso la definizione di getter), e la classe di implementazione ha solo, diciamo, l'accessibilità del pacchetto. Il ricevitore dell'istanza vede solo l'interfaccia e quindi può accedere solo ai getter, mentre il creatore ha il pieno controllo su di esso. Ciò richiede di avere diversi pacchetti con visibilità diversa, che è probabilmente difficile da mantenere.

Un altro modo potrebbe essere (se non si sta sviluppando un framework) per rendere pubblici i setter, ma definire una regola generale di progettazione come "I setter possono essere usati solo dai DAO". Deve essere possibile definire e comunicare una regola così semplice al tuo team per farlo funzionare a lungo termine.

    
risposta data 03.11.2013 - 11:48
fonte
1
  • I metodi statici non sono automaticamente non-OOP. Se migliorano l'incapsulamento o il valore di riutilizzo, probabilmente stanno bene. In generale, l'interfaccia di una classe include tutte le routine che lavorano insieme per svolgere il lavoro di quella classe, anche se sono statiche o non membri. Scott Myers ha scritto un DDJ articolo sui non membri, ad esempio.

  • Diverse lingue hanno diversi livelli di supporto per le restrizioni di accesso. In C ++, puoi utilizzare l' nome del costruttore dell'idioma , ma crea i membri statici della costruzione ( es. static baseClass newClass(...) ) privato. Quindi nessuno può creare istanze di baseClass . Quindi imposta baseClassCollection a friend di baseClass e baseClassCollection sarà in grado di creare baseClass istanze dal database utilizzando il costruttore indicato.

risposta data 03.11.2013 - 03:43
fonte

Leggi altre domande sui tag