Estensione dell'interfaccia

1

Supponiamo di avere un'interfaccia di flusso di input, che definisce un metodo per leggere i dati. Ho anche un'interfaccia cercabile che definisce un metodo per la ricerca. Un modo naturale di definire un file di input è quindi quello di implementare sia il flusso di input che la ricerca.

Voglio costruire un decodificatore di dati dall'interfaccia del flusso di input in modo da poter leggere i dati da un file o da un altro stream. Il problema è che voglio anche implementare la funzionalità di ricerca per il decodificatore di dati, dal momento che voglio essere in grado di passare i singoli record non i byte non elaborati. Questo non è possibile se fornisco solo un flusso di input, che non ha il metodo di ricerca bytewise.

Devo saltare l'interfaccia ricercabile e aggiungere il metodo seek per inserire stream e forzare tutti i flussi almeno a lasciarlo come un nop.

EDIT: il decodificatore non deve cercare se il client non richiede un'operazione di ricerca. Anche lo stream è associato al decodificatore e non può essere modificato dopo l'inizializzazione

    
posta user877329 13.12.2012 - 19:25
fonte

2 risposte

2

Il modo in cui i ragazzi di .NET hanno risolto questo problema è stato introdurre una proprietà IsSeekable che consente di sapere se è possibile cercare un Stream . In caso contrario e si chiama Seek() comunque, si genera un'eccezione. Non è molto polimorfico ma è semplice e funziona abbastanza bene nella pratica. Permette al flusso di essere trasmesso liberamente e ogni metodo può essere ottimizzato per la ricerca, se lo desidera. Lo svantaggio è che qualsiasi metodo che vuole usare Seek() deve prima controllare la proprietà.

Un approccio più orientato agli oggetti sarebbe quello di creare l'interfaccia SeekableInputStream che deriva da Seekable e InputStream . In questo modo una classe che ha bisogno di cercare come il tuo adattatore dati può richiedere quella specifica interfaccia ed essere sicuro che la ricerca funzionerà. Meglio ancora, il compilatore ti avviserà se tenti di inviare un InputStream non valido a tale metodo. Un altro metodo può accettare qualsiasi classe che implementa InputStream , compresi quelli che implementano SeekableInputStream . Lo svantaggio di questo metodo è che se passi il tuo SeekableInputStream attorno a molto, una volta abbassato a InputStream le informazioni sulla sua ricercabilità vengono perse ed è necessario lanciarlo nuovamente su SeekableInputStream se vuoi davvero ottimizzare quando puoi cercare.

    
risposta data 13.12.2012 - 21:37
fonte
1

Penso che questo tipo di problema possa essere facilmente risolto con decorazione dell'oggetto. Nel tuo caso, avrai i tuoi stream, utilizzando la tua interfaccia di streaming e un decoratore di flussi di ricerca, che aggiunge la funzionalità di ricerca richiesta. Puoi quindi decorare i tuoi stream con la funzionalità di ricerca quando necessario.

    
risposta data 13.12.2012 - 19:32
fonte

Leggi altre domande sui tag