Efficienza di getter / setter con prestazioni del database

0

Al momento sono in fase di refactoring di un mio progetto personale molto vecchio, che utilizzava codice procedurale PHP-in-HTML. Lo sto modernizzando come progetto di apprendimento, usando OOP dove è utile. Capisco le basi di OOP, ma mi chiedo se capisco correttamente in quanto sembrerebbe che il mio vecchio modo di farlo sia stato più veloce in questo caso.

Sulla pagina del profilo di un utente, sono elencate tutte le loro statistiche. È un gioco, quindi ci sono molti campi singoli contenenti statistiche come vincite, perdite ecc.

Ora ho creato una classe User e ho assegnato a ogni stat il suo getter / setter. Una coppia tipica ha questo aspetto:

function getEmoticon() {
    if ($this->emoticon) {
        return $this->emoticon;
    }

    $stmt = $this->conn->prepare('SELECT emoticon FROM profile WHERE id=:userid');
    $stmt->execute(array('userid' => $this->userid));
    $row = $stmt->fetch();

    return $this->emoticon = $row['emoticon'];
}

function setEmoticon($emoticon) {
    $stmt = $this->conn->prepare('UPDATE profile SET emoticon=:emoticon WHERE id= :id');
    $stmt->execute(array('id' => $this->userid, 'emoticon' => $emoticon));
    return $this->emoticon = $emoticon;
}

C'era una sola query SQL "GET * FROM profile" per ottenere tutte le statistiche dell'utente in una singola query. Ora però, sto ricorrendo all'utilizzo del getter per ogni stat, risultante in una query di database per ogni statistica. Nella pagina del profilo significa che è passato da 1 query di database a dozzine.

È questo il modo giusto di fare le cose? Sembra più inefficiente, ma non sono sicuro di come farlo, a meno che non disponga di un metodo di classe User come getAllStats () o qualcosa del genere.

    
posta Roy 31.08.2014 - 15:34
fonte

1 risposta

4

Sì, non farlo.

Un approccio tipico sarebbe avere una funzione LoadUser($user_id) . Restituirà un utente con tutti i suoi attributi caricati dal database. Quindi, carica tutti gli attributi dell'oggetto quando lo crei per la prima volta, non provare a caricare lentamente ogni attributo uno alla volta. Sarà più semplice ed efficiente.

Quando vuoi salvarlo, hai un Save (), o tieni traccia di tutti gli oggetti che sono stati modificati e li salvano tutti in una volta.

Come regola generale, sii diffidente nei confronti di carichi pigri come questo. Trovo che il 90% dei casi sia meglio solo per caricare i dati in primo piano.

    
risposta data 31.08.2014 - 17:11
fonte

Leggi altre domande sui tag