Devo davvero vedere un dibattito onesto e ponderato sui meriti del paradigma di progettazione di applicazioni aziendali attualmente accettato .
Non sono convinto che dovrebbero esistere oggetti entità.
Per oggetti entità intendo le cose tipiche che tendiamo a costruire per le nostre applicazioni, come "Persona", "Account", "Ordine", ecc.
La mia attuale filosofia progettuale è questa:
- Tutti gli accessi al database devono essere effettuati tramite procedure memorizzate.
- Ogni volta che sono necessari dati, chiamare una procedura memorizzata e scorrere su un SqlDataReader o sulle righe in una DataTable
(Nota: ho anche creato applicazioni enterprise con Java EE, gente Java si prega di sostituire l'equivalente per i miei esempi .NET)
Non sono anti-OO. Scrivo molte classi per scopi diversi, non solo entità. Devo ammettere che gran parte delle classi che scrivo sono classi di supporto statiche.
Non sto costruendo giocattoli. Sto parlando di applicazioni transazionali di grandi volumi distribuite su più macchine. Applicazioni Web, servizi Windows, servizi Web, interazione b2b, il nome.
Ho usato OR Mapper. Ne ho scritti alcuni. Ho usato lo stack Java EE, CSLA e alcuni altri equivalenti. Non solo le ho utilizzate, ma ho sviluppato e mantenuto attivamente queste applicazioni in ambienti di produzione.
Sono giunto alla conclusione battaglia-testato che oggetti entità sono sempre nel nostro modo, e la nostra vita sarebbe così molto più facile senza di loro.
Considera questo semplice esempio: ricevi una chiamata di supporto su una determinata pagina della tua applicazione che non funziona correttamente, forse uno dei campi non viene persistito come dovrebbe essere. Con il mio modello, lo sviluppatore assegnato per trovare il problema apre esattamente 3 file . Un ASPX, un ASPX.CS e un file SQL con la procedura memorizzata. Il problema, che potrebbe essere un parametro mancante alla chiamata della procedura memorizzata, richiede alcuni minuti per essere risolto. Ma con qualsiasi modello di entità, invaderai inevitabilmente il debugger, inizierai a sfogliare il codice e potresti finire con 15-20 file aperti in Visual Studio. Quando scendi in fondo alla pila, ti sei dimenticato da dove hai iniziato. Possiamo solo tenere così tante cose in testa contemporaneamente. Il software è incredibilmente complesso senza aggiungere livelli inutili.
La complessità dello sviluppo e la risoluzione dei problemi sono solo un aspetto della mia lamentela.
Ora parliamo di scalabilità.
Gli sviluppatori si rendono conto che ogni volta che scrivono o modificano qualsiasi codice che interagisce con il database, devono fare un'analisi approfondita dell'impatto esatto sul database? E non solo la copia di sviluppo, intendo un mimico della produzione, quindi puoi vedere che la colonna aggiuntiva che ora richiedi per il tuo oggetto ha invalidato il piano di query corrente e che un rapporto in esecuzione in 1 secondo ora richiederà 2 minuti, solo perché hai aggiunto una singola colonna all'elenco di selezione? E risulta che l'indice di cui hai bisogno ora è così grande che il DBA dovrà modificare il layout fisico dei tuoi file?
Se lasci che le persone si allontanino troppo dall'archivio di dati fisici con un'astrazione, creeranno il caos con un'applicazione che deve essere ridimensionata.
Non sono un fanatico. Posso essere convinto se sbaglio, e forse lo sono, dal momento che c'è una forte spinta verso Linq verso Sql, ADO.NET EF, Hibernate, Java EE, ecc. Ti prego di pensare attraverso le tue risposte, se mi manca qualcosa che voglio davvero sapere di cosa si tratta e perché dovrei cambiare il mio modo di pensare.
[Modificare]
Sembra che questa domanda sia improvvisamente di nuovo attiva, quindi ora che abbiamo la nuova funzione di commento ho commentato direttamente diverse risposte. Grazie per le risposte, penso che questa sia una discussione salutare.
Probabilmente avrei dovuto essere più chiaro che sto parlando di applicazioni aziendali. Non posso davvero commentare, per esempio, un gioco in esecuzione sul desktop di qualcuno o un'app mobile.
Una cosa che devo mettere qui in alto in risposta a diverse risposte simili: l'ortogonalità e la separazione delle preoccupazioni sono spesso citate come ragioni per andare entità / ORM. Le procedure memorizzate, per me, sono il miglior esempio di separazione delle preoccupazioni a cui posso pensare. Se si proibisce qualsiasi altro accesso al database, tranne che attraverso le procedure memorizzate, si potrebbe teoricamente riprogettare l'intero modello di dati e non violare alcun codice, purché si mantengano gli input e gli output delle procedure memorizzate. Sono un perfetto esempio di programmazione per contratto (solo se si evita "seleziona *" e si documentano i set di risultati).
Chiedi a qualcuno che è stato nel settore da molto tempo e ha lavorato con applicazioni di lunga durata: quanti strati di applicazioni e interfaccia utente sono andati e venuti mentre un database ha vissuto? Quanto è difficile ottimizzare e riformattare un database quando vi sono 4 o 5 diversi livelli di persistenza che generano SQL per ottenere i dati? Non puoi cambiare nulla! Gli ORM o qualsiasi codice che genera SQL bloccano il database in pietra .