responsabilità per l'archiviazione

7

Un collega e io stavamo discutendo su dove mettere la responsabilità di un oggetto di memorizzare se stesso sul disco nel nostro formato di file. Ci sono fondamentalmente due scelte:

  1. object.store (file)
  2. fileformatWriter.store (oggetto)

Il primo attribuisce la responsabilità della serializzazione sul disco all'oggetto stesso. Questo è simile all'approccio usato da pickle python.

Il secondo raggruppa la responsabilità di rappresentazione su un oggetto writer formato file. L'oggetto dati è solo un semplice contenitore di dati (eventualmente con metodi aggiuntivi non rilevanti per la memorizzazione).

Abbiamo concordato la seconda metodologia, perché centralizza la logica di scrittura dai dati generici. Abbiamo anche casi di oggetti che implementano una logica complessa che ha bisogno di memorizzare informazioni mentre la logica è in corso. In questi casi, l'oggetto fileformatwriter può essere passato e utilizzato come delegato, chiamando su di esso le operazioni di archiviazione. Con il primo modello, l'oggetto logico complesso accetta invece il file raw e implementa la logica di scrittura stessa.

Il primo metodo, tuttavia, ha il vantaggio che l'oggetto sa come scrivere e leggere se stesso da qualsiasi file che lo contiene, il che può anche essere conveniente.

Mi piacerebbe sentire la tua opinione prima di iniziare un refactoring piuttosto complesso.

    
posta Stefano Borini 24.02.2011 - 10:32
fonte

7 risposte

5

Preferirò la seconda opzione come segue principio di responsabilità singola , vale a dire che un oggetto dovrebbe fare solo una cosa e fare bene. Seguendo il protocollo SRP nel tuo caso assicurerai che vi sia un accoppiamento lento tra la tua funzionalità principale e il meccanismo di persistenza, in questo modo puoi modificare le specifiche del meccanismo di persistenza, ad es. puoi mantenere il tuo oggetto come XML invece del formato di file specifico, fornire la crittografia o archiviare l'oggetto su un server invece che sul tuo computer locale.

    
risposta data 24.02.2011 - 10:46
fonte
2

Definirei sicuramente il livello di persistenza dall'oggetto. Sembra logico che lo strato di persistenza debba essere intercambiabile (file locale, cloud, cache distribuita, database).

D'altra parte, se utilizzi la lingua con ereditarietà multipla, puoi utilizzare pattern di mixaggio , per aggiungere quel livello di persistenza all'oggetto, preservando così l'interfaccia object.store() , disaccoppiando la persistenza.

    
risposta data 24.02.2011 - 12:32
fonte
1

Dipende davvero dalla struttura e dalle funzioni dello storage.

Se ad esempio il tuo spazio di archiviazione è stupido e tutto ciò che devi fare è scrivere una singola istanza in un file separato, ci sono due compiti a portata di mano. Poiché non è possibile memorizzare "oggetto" su qualsiasi supporto, è necessario (1) serializzarlo e quindi (2) scrivere byte opachi sul file.

Il primo compito è la responsabilità dell'oggetto. Il secondo compito è la responsabilità dello storage. Quindi nei tuoi termini è qualcosa di simile a

fileformatWriter.store(object.serialize())

o qualcosa del genere. Il caricamento dell'archivio dall'archiviazione è più complicato, poiché è necessario determinare il tipo di oggetto che stava esaminando il numero di byte, questo passerei a un metodo factory class. Qualcosa come

object = Object.parse(fileformatReader.load())

Questo implica che le serializzazioni di oggetti diversi giocano secondo le stesse regole, quindi non c'è mai un'ambiguità.

    
risposta data 24.02.2011 - 12:34
fonte
0

L'archiviazione è una funzione fondamentale dell'oggetto o sta memorizzando gli oggetti come una funzione fondamentale di (parte) del sistema? Se il primo, ha gli oggetti si memorizzano. Se quest'ultimo, ha il sistema di memorizzare gli oggetti.

    
risposta data 24.02.2011 - 12:52
fonte
0

Secondo me, dipende dalla complessità dell'intera applicazione. Nei casi in cui:

  • Hai più oggetti che devono essere scritti nello stesso file
  • Il tuo oggetto da scrivere è già abbastanza complesso
  • Probabilmente avrai bisogno di più formati diversi per scrivere un oggetto in.

Quindi suggerisco la seconda opzione di creare un secondo oggetto.

Ma ci sono sicuramente momenti in cui la prima opzione manterrà le cose semplici nel codice. Mi piace anche che un oggetto sappia scrivere da solo. Quindi in genere inizio con questa opzione come scelta principale a meno che qualche altro fattore non mi porti alla seconda opzione (che finisce per essere una situazione comune).

    
risposta data 24.02.2011 - 12:56
fonte
0

Puoi creare il metodo write (OutputStream) in cui l'oggetto si memorizza su quel flusso, che non dipenderai da qualche particolare oggetto di memorizzazione dei file e allo stesso tempo quando vuoi salvare l'oggetto sul disco non hai bisogno di sapere nulla su quell'oggetto Ma dipende da come userete questo oggetto dopo e chi ripristinerà l'oggetto.

    
risposta data 24.02.2011 - 14:02
fonte
0

Sono d'accordo con il Principio di Responsabilità Unica su questo: un oggetto non dovrebbe preoccuparsi delle azioni al di fuori della sua funzione diretta. Se stessimo progettando un modello di serializzazione da zero (in un modello OO), creerei un Serializer e un SerializerOverride (i nomi possono variare).

class Serializer {
   // Constructor
   public Serializer(StorageMedium sm);

   public boolean writeObject(Object o);
   public Object readObject();
   // other write/read methods if required
}

interface SerializerOverride {
   public bytes[] serialize();
   public Object deserialize();
}

Un'implementazione di writeObject potrebbe essere simile a:

public boolean writeObject(Object o) {
   if (o instanceof SerializerOverride) {
      writeToStorage(((SerializerOverride)o).serialize)
   }
   else {
      // Serialize normally
   }
}

In questo modo se l'oggetto ha bisogno di fare qualcosa da sé, può farlo. La maggior parte delle volte però non lo faranno e questo tipo di design consente inoltre all'oggetto di ignorare completamente la serializzazione e concentrarsi su ciò che è stato realmente progettato per fare.

    
risposta data 24.02.2011 - 15:58
fonte

Leggi altre domande sui tag