Utilizzo degli stream come parametri del metodo e / o tipi di ritorno

4

Quindi diciamo che ho un'interfaccia 'Transformer' che può trasformare un tipo di file in un altro. Diciamo che desidero anche utilizzare gli stream per fornire i dati al Transformer. Qual è l'approccio che viene considerato "best practice";

public InputStream transform(InputStream data);

o

public void transform(InputStream originalData, OutputStream newData);

Anche se il primo metodo sembra essere leggermente più conciso per me (cioè, si ottiene un inputstream che si può consumare immediatamente) sembra violare l'intero principio 'creatore di un flusso dovrebbe essere colui che lo chiude'.

Il secondo metodo, pur avendo bisogno di un po 'più di lavoro sulla parte del client per gestire l'outputstream, sembra che potrebbe essere più utile in alcuni casi (cioè passare un ServletOutputStream come argomento' newData ') e il client il codice gestirà tutte le operazioni di apertura / chiusura dei flussi.

Mi sto appoggiando al secondo metodo, ma ho visto entrambi utilizzati in varie API che ho incontrato e mi chiedo se ci siano situazioni in cui uno sarebbe preferibile rispetto all'altro?

    
posta goodsquishy 03.03.2014 - 17:09
fonte

2 risposte

2

Restituzione di un input Steam consente di eseguire il calcolo su base continuativa man mano che i dati vengono letti, potenzialmente anche in un thread separato. È equivalente a un pipe della riga di comando di Unix. Se l'elaborazione impiega un tempo significativo per il completamento, questo nasconde efficacemente il tempo di elaborazione all'utente distribuendolo (o spostandolo in un altro core) e restituendo i risultati un po 'alla volta. Puoi facilmente costruire più fasi di trasformazione.

Quando si passa un flusso di output, è come usare il vecchio prompt dei dos pre-windows: bene se tutto ciò che si sta facendo è inviare i dati direttamente all'utente, ma se non lo si dovrà memorizzare temporaneamente da qualche parte (o un file o un ByteArrayOutputStream) prima di continuare l'elaborazione. Ciò introdurrà ritardi prima che venga prodotto qualsiasi output, rende più vantaggioso l'uso di più core e utilizza risorse inutilmente.

Inoltre, dichiari che esiste una regola generale che l'apertura di uno stream dovrebbe chiuderla, ma non penso che questa sia la regola completa. Credo che la regola che il sistema di I / O java sia costruito è meglio che "l'apripista di un flusso dovrebbe essere responsabile della sua chiusura, a meno che non sia successivamente avvolto in un altro oggetto che fornisce anche un metodo vicino, nel qual caso l'apri dovrebbe chiama invece quel metodo, che dovrebbe quindi chiudere il flusso originale per conto dell'apertore. " Questo è quello che fai, ad esempio, quando usi un BufferedInputStream.

Tutto ciò suggerisce che il primo dovrebbe essere generalmente preferito, ma vale la pena notare che per molte trasformazioni complesse, quest'ultimo è molto più facile da implementare (supponendo che non si desideri utilizzare più thread). In alcuni casi questo può essere a favore del primo, ma si noti che se si preferisce una soluzione multithread, il codice in quest'ultimo stile può essere adattato all'interfaccia precedente inserendo il proprio thread e utilizzando una coppia di stream Piped * per la comunicazione. Quindi direi che, oltre a casi molto semplici, il primo è il migliore, ma quest'ultimo potrebbe essere accettabile e più semplice se si ha un caso semplice e / o non si vuole essere coinvolti con i thread.

    
risposta data 21.11.2014 - 13:35
fonte
1

In generale, l'utilizzo di parametri di output è considerato una cattiva pratica. Dopotutto, il valore restituito è inteso come il risultato del calcolo eseguito dalla funzione. I parametri dovrebbero essere gli input per quel calcolo ed esportare il risultato attraverso un parametro è solo semanticamente sbagliato.

Ho trovato una risposta più dettagliata su StackOverflow . La domanda riguarda c # ma la risposta vale anche per altri linguaggi di programmazione.

Se desideri una risposta più specifica al tuo problema, pubblica il corpo dei tuoi metodi.

    
risposta data 22.10.2014 - 09:01
fonte

Leggi altre domande sui tag