Credo che la domanda sia più se il tuo algoritmo debba essere statico o stateless piuttosto che se il metodo debba essere statico o meno. Credo che sia meglio evitare i metodi statici in questo caso.
Nel tuo esempio la tua interfaccia ITradeDataProvider
implica la definizione di un metodo di istanza, non di uno statico. I metodi statici non sono ereditabili e pertanto ciò influirebbe sul design polimorfico del metodo GetTradeData
se lo facessi.
La domanda più pertinente è, quindi, il merito di passare i dati contestuali nel costruttore (statefull) o in un parametro del metodo di istanza (stateless).
Riutilizzabilità
Un aspetto che potresti considerare è che dovresti riuscire a riutilizzare ITradeDataProvider
. Se pensi al tuo ITradeDataProvider
come a un modello di strategia semplicemente incapsulando un algoritmo per gestire uno stream, e in particolare se hai effettivamente bisogno di elaborare più flussi contemporaneamente o con una certa frequenza, allora ha più senso passare questi dettagli contestuali in un parametro di metodo. In questo modo puoi riutilizzare più volte la stessa istanza di strategia.
ITradeDataProvider strategy = new DefaultTradeDataProvider();
for(Stream stream : getMyTradeDataStreams()) {
IEnumerable<string> tradeData = strategy.getTradeData(stream);
}
Quale potrebbe essere il punto di creare più istanze di DefaultTradeDataProvider
se tutti sono semplicemente in procinto di eseguire un algoritmo nello stream fornito? Un'istanza è più che sufficiente qui.
In questo caso l'implementazione di ITradeDataProvider
è senza stato e ci assicuriamo di passare qualsiasi stato di cui abbia bisogno per fare il suo lavoro.
Co-locazione di spazio e tempo
Un aspetto interessante del modello qui è che i dati contestuali e l'algoritmo di strategia sono probabilmente collocati nel tempo e nello spazio. Cioè, quando ricevi il flusso di dati, è nello stesso posto in cui probabilmente lo userai pure.
Vantaggi di apolidia e multi-threading
Un oggetto stateless è in genere più riutilizzabile e non ti devi preoccupare dei problemi multi-threading se riesci a condividerli con altri componenti che potrebbero essere in esecuzione in altri thread.
Con un oggetto stateless probabilmente puoi semplicemente creare un'istanza singleton del tuo algoritmo e riutilizzarla in modo sicuro ogni volta.
Statefull Closure
Tuttavia, le cose cambiano un po 'quando si vuole creare una chiusura statica, cioè quando si intende pacchettizzare dati e funzionalità e magari utilizzarla in un secondo momento e / o in un altro posto.
In tal caso potrebbe essere conveniente impacchettare lo stato all'interno della chiusura.
ITradeDataProvider provider = new DefaultTradeDataProvider(stream);
someOtherService.withProvider(provider);
incapsulamento
Ora someOtherService
non deve preoccuparsi di trasmettere dettagli contestuali al provider. Il provider include già questi dettagli. Verrà utilizzato da someService
in un altro luogo e momento diverso da quello da cui è stato originariamente creato. Questo è conveniente perché someOtherService
potrebbe non avere nemmeno accesso a stream
, che è incapsulato in qualche altro luogo a cui non può raggiungere (cioè l'implementazione del provider). Il someOtherService
non interessa nemmeno se l'origine dei dati è un stream
o qualcosa di diverso. Questa è la sola responsabilità della chiusura.
Quindi questo potrebbe essere un modo conveniente per incapsulare stato e comportamento e condividerlo con altri oggetti.
Complessità dello stato di conservazione
In questo caso, devi trattare responsabilmente lo stato. Significa che il provider potrebbe non essere condivisibile tra più thread e probabilmente sarebbe necessario creare nuove istanze di esso per thread, altrimenti dovresti forzarlo a renderlo thread-safe se vuoi condividerlo in modo sicuro con altri thread.
Nel caso dello stream di esempio della tua domanda originale, che cosa dovrebbe accadere una volta che hai consumato il flusso una volta? Puoi ancora invocare correttamente getTradeData()
e consumare di nuovo lo stream?
E così, come puoi vedere, l'impacchettamento dello stato ha implicazioni più complesse.