Perché costruire modelli di dati in un linguaggio dinamico?

7

Sfondo

Questa domanda nasce da una discussione architettonica che avevamo al lavoro.

Per il progetto corrente stiamo usando Python e un database orientato agli oggetti. Esistono servizi di input che consumiamo e determinate interfacce che ci aspettiamo forniscano l'output.

Qualcuno del nostro team ha iniziato a progettare un modello di dati e la mia domanda era: perché?

Un oggetto solo per dati in Python può anche essere rappresentato da un dict (ci sono molte domande su questo sito). Non disponiamo di un database relazionale con colonne che devono essere mappate su entrambi gli oggetti. Allo stesso tempo, c'è un costo per un modello di dati in quanto dovrà sempre essere mantenuto. Quando le interfacce cambiano (IMHO) diventa semplicemente un'altra dipendenza che deve essere soddisfatta, ma a differenza dei linguaggi tipizzati staticamente non impone nulla.

Domanda:

Il modo in cui mi sembra che quando ci si trova in un ambiente in cui tutto sia dinamico, è logico che le interfacce definiscano implicitamente il proprio modello di dati piuttosto che mantenere una sorta di classi che definiscono un modello. Ci sono mai buone ragioni per il contrario?

Modifica

Nei commenti e nelle risposte le persone sembrano concentrarsi su due aree: la mappatura e la rappresentazione del database e la convalida del modello di dati.

Mi scuso per non essere più esplicito riguardo al DB, ma in questo ambiente che abbiamo di fronte abbiamo un DB orientato agli oggetti che memorizza i BLOB in una rappresentazione tipo file system. Non esiste alcuna mappatura per SQL e nessun ORM di alcun genere di cui parlare. Però capisco l'argomento. Ad esempio, i modelli di Django richiedono una sottoclasse per far funzionare ORM. In questo caso, rendere le classi modello ha perfettamente senso perché il DB è effettivamente un archivio dati tipizzato statico e non "dinamico". Ma questo non è lo scenario della domanda, perché non è un puro ambiente tipizzato dinamicamente.

Per quanto riguarda i validatori: sì. Uno dovrà creare validatori che controllino i campi presenti e che siano del tipo giusto. Nei linguaggi tipizzati staticamente il modello lo fa implicitamente (quando state codificando C ++ / Java non potete attaccare l'utente 'std :: string' a dove dovrebbe essere una classe User). Ma in Python, una classe modello non impone nulla. Se sto costruendo validatori che controllano comunque la presenza di attributi, questo non rende le classi, i dettati, i generatori, ecc. Funzionalmente intercambiabili? E se sì, la soluzione non dovrebbe essere uno con meno codice? I validatori in generale mi sembrano un argomento a favore di non costruire classi di modelli di dati piuttosto che il contrario. Mi sbaglio in questo?

    
posta MrFox 28.02.2013 - 20:50
fonte

2 risposte

6

Anche in un linguaggio dinamico i principi del Domain Driven Design possono ancora essere applicati. Se tutto quello che stai facendo è passare dei dizionari, hai un modello Anemico dove i tuoi oggetti sono dati puri e altri oggetti funzionano su di loro.

Il tempo necessario per creare un modello di oggetto avanzato e incorporare la logica nel modello offre l'opportunità al tuo modello di essere più espressivo e rappresentativo del dominio che stai modellando.

    
risposta data 28.02.2013 - 21:58
fonte
2

Quando ho lavorato contro Mongo, abbiamo dei dizionari indietro. In alcune parti del codice lo abbiamo convertito in un oggetto reale. In altri posti abbiamo tenuto un dizionario. Nella maggior parte dei casi, gli oggetti erano solo per comodità, quindi potremmo dire customer.name invece di customer["name"] . In questi casi abbiamo usato un dizionario punteggiato (una classe che sovrascrive __getattr__ ).

Ci sono stati casi in cui il modello di dominio ha "visto" i dati in modo diverso. In questi casi abbiamo creato oggetti con la struttura che volevamo e abbiamo mappato loro i nostri oggetti dati. Può fare un'enorme differenza nella leggibilità di eseguire questa mappatura una volta in primo piano piuttosto che sparsi in tutto il codice.

Un altro posto in cui un oggetto reale era utile quando convalidava lo schema. Ci sono alcuni involucri Mongo là fuori che ti permetteranno di definire i controlli quando raccogli e conservi i documenti. Questo è utile per mantenere coerente lo "schema" di fronte all'errore dell'utente. Possono fornire valori predefiniti per attributi mancanti, convertire date in stringhe e cose di quella natura. Esistono librerie simili per lavorare con JSON restituito da un'applicazione Web.

    
risposta data 28.02.2013 - 21:35
fonte

Leggi altre domande sui tag