2009-10-05 14 views
6

Avevo un livello di accesso ai dati che prendeva l'oggetto per parametro e gestiva con l'astrazione il tipo di persistenza richiesto. Nel mio nuovo lavoro, l'architetto sta pensando di implementare l'operazione CRUD (load..save..delete..update) in tutti gli oggetti del modello. Quel metodo avrebbe un oggetto per parametro che gestirà il salvataggio dell'oggetto. Esempio: carico (persistenza IPersistence). Ho qualche dubbio sull'estensibilità e che ogni oggetto modello dovrebbe implementare tutti i metodi di caricamento, salvataggio, cancellazione, aggiornamento.Livello di accesso ai dati o oggetto con i metodi CRUD?

Qual è l'approccio migliore?

risposta

4

Immagino che questa sia l'eterna domanda e entrambi gli approcci hanno i loro pro e contro e molti seguaci che giurano su di loro.

L'approccio repository che sembra favorire (avere un repository/gateway qualunque sia il nome che si chiama) per gestire le operazioni CRUD rende le classi di business attuali più piccole e più snelle, poiché probabilmente contengono solo dati e possibilmente regole di validazione/business.

In questo caso, implementeresti le operazioni CRUD una volta, ma molto probabilmente una volta per ogni tipo di oggetto con cui hai a che fare.

D'altro canto, l'approccio smart business object potrebbe sostenere che l'operazione CRUD su una determinata entità è specifica comunque per quell'entità, quindi il codice per selezionare, aggiornare, eliminare tale entità sarà sempre specifico, quindi potrebbe anche risiedere all'interno di quell'oggetto stesso.

In questo caso, implementeresti le operazioni CRUD una volta per ogni classe di oggetti. In questo caso, non vedo alcun grosso svantaggio rispetto all'approccio del repository.

Io personalmente mi avvicino all'approccio del repository oggi stesso, ma vedo anche benefici nell'approccio "oggetto di business intelligente": entrambi sono validi, e credo che dovrai solo convincere il tuo nuovo architetto della tua posizione o mettersi d'accordo con un approccio diverso.

Marc

+0

Vorrei aggiungere che i casi di base di CRUD possono essere implementati solo una volta in un repository generico (a seconda della lingua), e quindi è solo necessario implementare metodi specializzati per ciascuna entità in futuro. (Questo può interessare anche gli oggetti business intelligenti). –

3

penso che, in entrambi i casi, l'attuazione non dovrebbe essere ripetitivo, ma implementato solo una volta e ha ereditato (per esempio), se necessario.
Le sottoclassi ei relativi metodi sarebbero necessari solo per lavori non standard (come le query personalizzate, con i loro parametri personalizzati).


Ora la domanda è pari al POJO dibattito filosofico. Vorrei cercare di frase che con parole mie ;-):

  1. considerando che il modello è specifico per ogni specifico problema e quindi ogni applicazione
  2. considerato che molti aspetti sono necessari per il modello : la persistenza è un aspetto richiesto per un modello, insieme a convalida, documentazione, componenti e messaggi dell'interfaccia utente, suggerimenti degli utenti, migrazione tra le versioni ...
  3. considerando che il modello da solo è già abbastanza difficile da capire, mantenere e così via da solo, senza tutti gli aspetti da unire
  4. si dedurre che qualsiasi aspetto dovrebbe essere esternalizzato dagli oggetti del modello.

In realtà, abbiamo esteriorizziamo solo le cose che sono complesse (tipicamente, richiedono un po 'di codifica), e continuiamo a cose Pojo che sono molto semplici (tipicamente le dichiarazioni, spesso utilizzando annotazioni).


altro enorme vantaggio di avere alcuna superclasse tecnica per il modello è che il modello può essere utilizzato come il proprio "oggetto di trasferimento dati" per trasportare le informazioni tra i sistemi:

  1. tra strati
  2. tra JVM (tramite serializzazione), ad esempio tra macchine

Se le nostre classi modello avessero superclassi tecniche, non sarebbero utili in contesti così diversi. Ad esempio:

  1. Persistenza su un oggetto modello è spesso utilizzabile solo in qualche strato (nelle scelte architettoniche). Ad esempio, solo il livello aziendale avrebbe accesso al livello dati per persistere.
  2. Durante la migrazione dei dati da una macchina all'altra, ogni macchina può lavorare sul proprio database. Pertanto, gli oggetti del modello possono essere trasferiti liberamente se non portano puntatori al database; ogni server dovrebbe utilizzare il proprio database. Per lo stesso oggetto modello, la variazione è possibile su altri aspetti, che è facilitata se gli aspetti non sono trasportati dallo stesso oggetto.
4

DAL fino in fondo.

Si desidera essere in grado di isolare le transazioni in modo che gli oggetti non debbano essere consapevoli della loro persistenza. In caso contrario, il codice può tendere a un incubo non gestibile in cui gli oggetti possono attivare i round trip del database ed è difficile eseguire il numero di transazioni in un'unica azione atomica.

Ho scoperto questo nel modo più difficile. :)

Problemi correlati