Diversi modelli per una entità

3

Uso un pattern MVC tradizionale per i miei progetti web:

  • Controllori: gestisci i passaggi degli scenari caso d'uso (puoi chiamare la logica aziendale in modelli o servizi)

  • Visualizzazioni: presentazione

  • Modelli ......

Colpisco un muro con il modello che mi impedisce di abbracciare correttamente l'orientamento dell'oggetto. Ho forse l'assunto sbagliato che un'entità dovrebbe avere un solo modello.

Ad esempio, nel mio progetto di sito web corrente ho un'entità "immagine". Quindi ho un modello per rappresentare una riga nella tabella 'immagine' del database: recupero il record nel costruttore del modello, che popola piacevolmente le proprietà di classe corrispondenti. Posso quindi utilizzare l'istanza nel mio codice. Nizza.

Il problema è il contrario, quando devo ricevere dati da un modulo per l'archiviazione del database. I dati grezzi dalla forma richiedono un po 'di elaborazione aziendale e prevedono l'accoppiamento tra dati e logica per il riutilizzo, quindi una classe è appropriata. Il problema è che se uso lo stesso modello di cui sopra, quello per ottenere i dati dal database, le cose diventano davvero brutte con un sacco di costruttori condizionali.

È una delle cose giuste da fare, creerebbe semplicemente una classe modello separata per ottenere dati nel database, e non rimanere bloccata con una singola classe di modello per l'immagine? Qual è la buona pratica in questo caso?

    
posta Robert Brax 07.03.2017 - 22:46
fonte

2 risposte

0

Il tuo problema è molto comune tra le applicazioni che non sono minuscole. Prima o poi potresti iniziare a richiedere rappresentazioni diverse della stessa entità, per qualsiasi motivo, che si tratti di prestazioni o semplicemente di soddisfare meglio il tuo livello di business logic.

Avere modelli diversi per una singola entità non è una cattiva idea, se è questo che risolve il problema.

Di solito implemento uno spesso strato CUD (Crea, Aggiorna, Elimina) per convalidare correttamente le mie entità, questo spesso strato consiste nella convalida delle regole aziendali, delle proprietà dell'oggetto, delle relazioni, ma se un oggetto supera l'intero livello di scrittura allora sono sono sicuro che il modello sia valido. Con questo in mente, quindi, utilizzo un livello molto sottile per le letture che è molto veloce, perché è ridotto a zero di tutte le trasformazioni che sarebbero state altrimenti necessarie.

Per rendere le applicazioni più flessibili possibile senza implementare un sovraccarico, mi piace atomizzare le mie query di lettura in modo che restituiscano solo le chiavi primarie delle entità e quindi utilizzino un altro livello, puoi chiamarlo ModelCreators , che ha metodi accettare id dal livello atomizzato e usare quei modelli di costrutti.

In pratica, potrebbe essere simile a questo:

package Users.Devices.Atomized;

// pseudo-Java code
final class UsersDevicesQuery {

    public List<int> findDevicesForUser(final int userId) {
        // logic to filter out ids of user's devices
    }
}

package Users.Devices.ModelCreators;

final class WithPushTokenQuery {

    public List<WithPushToken> loadModels(final List<int> ids) {
        // logic to return models
    }
}

Questo approccio mi ha dimostrato di essere abbastanza buono, perché mantiene classi e metodi molto coesi e tuttavia molto dinamici - se decidi di cambiare la struttura del tuo modello puoi farlo senza toccare la logica di query e / o se vuoi per cambiare la logica di interrogazione è possibile farlo senza alterare le classi utilizzate per costruire i modelli.

    
risposta data 07.03.2017 - 23:07
fonte
0

È un'ottima decisione dividere in più classi (modelli). In Domain Driven Design devi fare questo: in ogni Contesto Limitato esiste un modello diverso (classe se vuoi), anche se si sovrappongono un po '.

Inoltre, in CQRS, dividi persino il lato Scrittura dal lato Lettura in modelli Write (Command) e Read (Query). In questo modo i tuoi modelli diventano più chiari / puliti e puoi ottimizzare quasi all'infinito il lato di lettura dell'applicazione.

Come altri hanno già detto, MVC non è adatto per la modellazione di domini complessi, in quanto si tratta più di un'architettura dell'interfaccia utente.

    
risposta data 08.03.2017 - 22:33
fonte

Leggi altre domande sui tag