Come posso evitare le proprietà ridondanti degli oggetti quando si utilizza un database?

1

Sto scrivendo applicazioni in C ++ usando un database sqlite. Supponiamo che io abbia un semplice sistema utente con un database utente.

Classe utente

class User {
    private:
        void LoadFromDatabase(uint32_t id);
    public:
        std::string name;
        uint32_t age;
        void SayHello();
        void SetAge(uint32_t age);
};

Tabella utenti

+-------+-----+
| Name  | Age |
+-------+-----+
| Billy |  22 |
| Bob   |  44 |
+-------+-----+

Quando ottengo i dati dal database, mi piace memorizzare le cose negli oggetti riga, quindi è molto facile capire cosa c'è nella riga (altrimenti è un puntatore a un array di caratteri e dovresti sapere qual è l'indice di ogni colonna ). È qui che entra in gioco il problema della ridondanza.

Riga utente

class UserRow {
    public:
        std::string name;
        uint32_t age;
};

Quindi ora ho ripetuto le proprietà della classe tra due classi. Questo è ovviamente un esempio banale, ma a volte le righe hanno 10 o più colonne. Una soluzione sarebbe sbarazzarsi di UserRow e passare attorno a User , ma il database non dovrebbe sapere nulla su User e essere come più stupido possibile. Un'altra soluzione potrebbe essere avere User.properties che è = a UserRow , ma che lo rende meno accessibile.

Quale sarebbe il modo migliore per evitare questi campi / classi duplicati?

    
posta ICU_ 30.08.2018 - 22:50
fonte

2 risposte

5

Guarda questo approccio:

class User {
    private:
        UserRow userRow;
        void LoadFromDatabase(uint32_t id); // init userRow
    public:
        std::string GetName(){return userRow.name;}
         // implement setName in an analogous manner
        uint32_t getAge(){return userRow.age;}
         // setAge ...
        void SayHello();
        void SetAge(uint32_t age);
};

Il vantaggio è che il codice per UserRow può essere creato da qualche generatore in modo standard, semplicemente utilizzando i meta dati da un database. UserRow diventa quindi il tuo livello di accesso ai dati (DAL), User , tuttavia, è una classe del tuo livello di dominio.

Moerover, dovresti considerare di spostare LoadFromDatabase in un'altra posizione, come in una classe di repository, per rendere la classe User persistente-ignorante.

    
risposta data 31.08.2018 - 00:33
fonte
1

Si potrebbe dire che gli oggetti Utente in realtà sono oggetti riga, poiché hanno già le stesse informazioni. Come hai fatto ora, hai creato solo un livello di astrazione non necessario che non fornisce nulla di utile.

    
risposta data 30.08.2018 - 23:52
fonte

Leggi altre domande sui tag