Esiste un oggetto in grado di salvare se stesso in preda database di coesione della classe?

StackOverflow https://stackoverflow.com/questions/4378098

Domanda

Parlando in termini di progettazione orientata agli oggetti, pensi a dare una funzionalità di per sé il risparmio in data-base a un oggetto spoglie la coesione della classe?

Immaginate:

Product p = new Product() 
          {
           Name = "Joy Rider", 
           Price = 100, 
           Currency = "USD"
          };

Pensi di salvare questo prodotto p sul database è meglio essere fatto in questo modo:

 p.Save();

o in un qualcosa di modo simile a questo:

 ProductServices.SaveProduct(p);

Cosa ne pensi?

È stato utile?

Soluzione

Non interferisce con il principio singola responsabilità. Lo scopo della Classe prodotto nel tuo esempio è quello di rappresentare un prodotto e le operazioni sul prodotto in questione. Interagire con il database non è una parte fondamentale della responsabilità di classe.

Avere la classe ProductServices aumenta la manutenibilità del codice. Supponiamo che la logica per il salvataggio di oggetti nel database era quello di cambiare (che può) vuoi cambiare ogni classe di entità nel vostro sistema?

Altri suggerimenti

Un oggetto che si può salvare nel database violerebbe SRP (principio responsabilità singolo).

La persistenza è una responsabilità da sola e dovrebbe essere gestita da classi dedicate.

Questo sarebbe oltre ad avere scarsa coesione -. I membri che hanno a che fare con la persistenza non hanno alcuna relazione con quelli che non lo fanno e non sarebbe stato utilizzato in quei metodi della classe che non si occupano di persistenza

In termini di Object Oriented design solo allora non c'è niente di sbagliato con il metodo Save essere parte di prodotto . Sarebbe effettivamente essere il metodo preferito nel mondo Object Oriented Design. E da un punto di vista OO puro che non vorresti che spezzato perché è più funzionale di oggetti.

Tuttavia, se si crede nel principio di inversione di dipendenza che dice moduli di alto livello non dovrebbe dipendere moduli di basso livello; poi un metodo Save sarebbe appropriato, ma si dovrebbe prendere un tipo di connessione astratta come parametro. Questo darebbe un modello di oggetto piacevole che include un metodo Save, ma non avrebbe alcun conoscenza del tipo di connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top