Dichiarazione dell'interfaccia - ultima vs cronologia

3

Immagina che ci sia un'interfaccia IPriceProvider che dovrebbe servire a 2 bisogni: storici e recenti. Quindi penso che abbiamo 2 opzioni qui.

Per prima cosa:

PriceInfo GetLatestPrice(string symbol);
PriceInfo GetHistoricalPrice(string symbol, DateTime pointInTime);

Secondo:

PriceInfo GetPrice(string symbol, DateTime pointInTime);

Secondo me il secondo è migliore, perché è più flessibile. Immagina, hai un rapporto che è fin d'ora - quindi chiama questo fornitore di prezzi come questo:

GetPrice("EURUSD", _dateTime.Now);

Quindi, se c'è un compito per mostrare ciò che questo rapporto esatto stava mostrando ieri alle 17:35, imposterò semplicemente _dateTime.Ora fino a quel punto e il mio rapporto funzionerà. Ma nel caso del primo approccio, dove lo chiamo in questo modo:

GetLatestPrice("EURUSD");

Avrò bisogno di una seconda implementazione di IPriceProvider, quindi avrò un problema di cablaggio, dovrò configurare il mio contenitore DI in un modo speciale e così via ...

Mi manca qualcosa? Quali sono i pro e i contro in questi 2 approcci?

Aggiornamento:

La classe Report potrebbe essere simile a questa:

public class Report
{
    private readonly IDateTime _dateTime;

    private readonly IPriceProvider _priceProvider;

    public Report(IDateTime dateTime, IPriceProvider priceProvider)
    {
       _dateTime = dateTime;
       _priceProvider = priceProvider;
    }

    public void Run()
    {
        var latestPrice = _priceProvider.GetPrice("EURUSD", _dateTime.Now);
        // do the report calc here
    }
}
    
posta Max 23.10.2016 - 11:01
fonte

2 risposte

2

A giudicare dalle convenzioni che stai utilizzando, vieni dal mondo C #. Ecco come risolvere questo problema con un argomento facoltativo in C # :

public PriceInfo GetPrice(string symbol, DateTime pointInTime = null)

L'idea è se la chiami solo con la stringa:

GetPrice("EURUSD");

allora pointInTime sarà il suo valore predefinito _dateTime.Now . Se necessario, utilizza un valore di flag come null per segnalare che è necessario chiamare un metodo per ottenere il valore ora. In questo modo quanto sopra sarà lo stesso di:

GetPrice("EURUSD", _dateTime.Now);
    
risposta data 23.10.2016 - 12:24
fonte
1

Penso che in realtà stai mescolando due cose diverse qui. Uno è la definizione di un'interfaccia, l'altro un dettaglio di implementazione del report.

Per quanto riguarda il design dell'interfaccia, vorrei fare il primo approccio anche se eviterei la parola Storico . I requisiti possono cambiare e potresti voler interrogare un prezzo che non è ancora valido. Pertanto definirei l'interfaccia in questo modo:

PriceInfo GetCurrentPrice(string symbol);
PriceInfo GetPriceAt(string symbol, DateTime pointInTime);

Nel rapporto vorrei quindi utilizzare solo GetPriceAt e passare DateTime.Today quando non è specificata un'altra data. Ma come detto sopra questo è un dettaglio di implementazione.

    
risposta data 23.10.2016 - 20:32
fonte

Leggi altre domande sui tag