Istanziazione di oggetti multipli

1

Sto cercando di capire come funziona la programmazione orientata agli oggetti in quanto riguarda lo sviluppo web (in particolare PHP).

Comprendo l'ereditarietà e l'astrazione ecc. e conosco tutte le "parole d'ordine" come l'incapsulamento e il singolo scopo e perché dovrei fare tutto questo.

Ma la mia conoscenza non è sufficiente con la creazione di oggetti che si riferiscono ai dati che ho nel mio database, creando un singolo oggetto che un rappresentante di una singola entità ha senso, ma quali sono le migliori pratiche quando si creano 100, 1.000 o 10.000 oggetti dello stesso tipo.

per esempio, quando provo a visualizzare un elenco degli elementi, idealmente vorrei essere coerente con gli oggetti che uso, ma dove esattamente dovrei eseguire la query / ottenere i dati per popolare gli oggetti come in esecuzione 10.000 query sembrano sprecate.

Ad esempio, diciamo che ho un database di gatti e voglio un elenco di tutti i gatti neri, ho bisogno di impostare un FactoryObject che raccoglie i dati necessari per ogni gatto dal mio database, quindi passa quello dati in ogni singolo CatObject e restituisce i risultati in un array / oggetto - o dovrei passare ogni CatObject del suo identificatore e lasciarlo popolarlo in una query separata.

    
posta Ricky Baby 03.07.2013 - 13:03
fonte

2 risposte

1

Creare 100, 1 000 o 10 000 oggetti simili non è di per sé un problema (a meno che l'oggetto stesso non sia enorme). Se ti ritrovi a creare migliaia e migliaia di oggetti, chiediti se è davvero necessario.

Se stai caricando Cat oggetti, uno per gatto memorizzato nel database, devi caricare tutti i 500.000 gatti, ad esempio? Perché? Non è possibile visualizzarli sullo schermo: non sarebbe particolarmente utile. Se hai bisogno di elaborarli, precarichi tutto il modo migliore per farlo?

Quando hai bisogno di un elenco di gatti neri, non carichi tutti i gatti disponibili. Quello che devi fare è limitare, a livello di database (ad esempio con where [color] = @color ), i risultati che ottieni e costruisci oggetti corrispondenti solo a gatti neri.

In effetti, questo può essere fatto in una fabbrica che conterrà un metodo che prende un colore specifico e restituisce i gatti di questo colore.

Effettuare una query per gatto, d'altra parte, è un approccio terribile. Meno domande fai, meglio è. Ecco perché il tuo suggerimento di utilizzare una fabbrica è stata una buona idea.

    
risposta data 03.07.2013 - 14:04
fonte
0

Ciò di cui hai bisogno è la mappatura relazionale degli oggetti. Hai menzionato che hai già una classe Cat che crea oggetti che rappresentano una riga nella tabella del database. Che dire di una classe CatList che rappresenta un elenco di Cat s?

Ecco un breve esempio di come concettualmente può funzionare:

$catList = new CatList();
$catList->readObjects();
$cats = $catList->getObjects();

Nel metodo readObjects, fai una query che carica tutti i gatti ( SELECT * FROM cat ) o gatti con determinate limitazioni ( SELECT * FROM cat WHERE xy = ? o SELECT * FROM cat LIMIT 30 ).

Per ciascuna delle righe lette si crea un oggetto Cat. Ma nel costruttore hai la possibilità di dare un ID (e lasciare che Cat carichi i dati) o i dati (e saltare il passaggio di caricamento).

In questo modo hai solo una query per tutti gli oggetti Cat di cui hai bisogno. Se si desidera solo un elenco di gatti neri, è possibile effettuare le seguenti operazioni:

$catList = new CatList();
$catList->addCondition('color = ?', 'black');
$catList->readObjects();
$cats = $catList->getObjects();

All'interno di CatList la query viene generata dinamicamente in base alle possibili condizioni. Dato che non cambierai molto spesso l'elenco dei gatti, puoi memorizzare nella cache l'array risultante $cats in un file tramite serializzazione. In caso di necessità, è necessario semplicemente unserializzare la matrice e quindi utilizzare gli oggetti Cat memorizzati. Se cambi qualcosa nella tabella cat, ricreerai la cache.

Risultato: problema risolto.

    
risposta data 29.07.2013 - 22:49
fonte

Leggi altre domande sui tag