Sono giunto alla conclusione che CreateDataFile
sta facendo una cosa eseguendo una misurazione rapida e quindi memorizzando i dati, e fare entrambi con lo stesso metodo è più intuitivo per qualcun altro che utilizza questo codice, quindi è necessario effettuare una misurazione e scrivere su un file come chiamate di metodo separate.
Penso che questo sia il tuo problema, in realtà. Il metodo non sta facendo nulla. Esegue due operazioni distinte che coinvolgono l'I / O su dispositivi diversi , entrambi i quali vengono scaricati su altri oggetti:
- Prendi una misura
- Salva quel risultato in un file da qualche parte
Queste sono due diverse operazioni di I / O. In particolare, il primo non muta il file system in alcun modo.
In effetti, dovremmo notare che c'è un passaggio intermedio implicito:
- Prendi una misura
- Serializzare la misurazione in un formato noto
- Salvare la misura serializzata in un file
L'API dovrebbe fornire ciascuna di queste separatamente in una forma. Come fai a sapere che un chiamante non vorrà prendere una misura senza memorizzarla da nessuna parte? Come fai a sapere che non vorranno ottenere una misurazione da un'altra fonte? Come fai a sapere che non vorranno memorizzarlo in un luogo diverso dal dispositivo? Vi sono buone ragioni per disaccoppiare le operazioni. Nel corso di una nuda minimo, ogni singolo pezzo dovrebbe essere disponibile a qualsiasi chiamante. Non dovrei essere costretto a scrivere la misura su un file se il mio caso d'uso non lo richiede.
Ad esempio, è possibile separare le operazioni in questo modo.
IMeasurer
ha un modo per recuperare la misurazione:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Il tipo di misurazione potrebbe essere semplicemente qualcosa di semplice, come un string
o decimal
. Non sto insistendo sul fatto che hai bisogno di un'interfaccia o di una classe per questo, ma rende l'esempio qui più generale.
IFileAccess
ha qualche metodo per salvare i file:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Quindi è necessario un modo per serializzare una misurazione. Incorporalo nella classe o nell'interfaccia che rappresenta una misurazione o utilizza un metodo di utilità:
interface IMeasurement
{
// As part of the type
string Serialize();
}
// Utility method. Makes more sense if the measurement is not a custom type.
public static string SerializeMeasurement(IMeasurement m)
{
return ...
}
Non è chiaro se questa operazione di serializzazione sia stata ancora separata.
Questo tipo di separazione migliora la tua API. Consente al chiamante di decidere di cosa ha bisogno e quando, anziché forzare le idee preconcette su quale I / O deve eseguire. I chiamanti dovrebbero avere il controllo per eseguire qualsiasi operazione valida , che tu ritenga utile o meno.
Una volta che hai implementazioni separate per ogni operazione, il tuo CreateDataFile
metodo diventa solo una scorciatoia per
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
In particolare, il tuo metodo aggiunge pochissimo valore una volta che hai fatto tutto questo. La suddetta riga di codice non è difficile da usare direttamente per i chiamanti e il tuo metodo è puramente per praticità al massimo. Dovrebbe essere ed è qualcosa di facoltativo . E questo è il modo corretto di comportarsi per l'API.
Una volta che tutte le parti rilevanti sono state prese in considerazione e abbiamo riconosciuto che il metodo è solo una comodità, dobbiamo riformulare la tua domanda:
Quale sarebbe il caso d'uso più comune per i tuoi chiamanti?
Se l'intero punto è rendere il caso d'uso tipico di misurare e scrivere sulla stessa lavagna leggermente più conveniente, allora ha perfettamente senso renderlo disponibile Board
direttamente sulla classe:
public class Board : IMeasurer, IFileAccess
{
// Interface methods...
/// <summary>
/// Convenience method to measure and immediate record measurement in
/// default location.
/// </summary>
public void ReadAndSaveMeasurement()
{
this.SaveFile(SerializeMeasurement(this.Measure()));
}
}
Se ciò non migliora la praticità, non mi preoccuperei affatto del metodo.
Questo essere un metodo di convenienza solleva un'altra domanda.
L' IFileAccess
interfaccia dovrebbe conoscere il tipo di misurazione e come serializzarlo? In tal caso, è possibile aggiungere un metodo a IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Ora i chiamanti fanno solo questo:
fileAccess.SaveFile(measurer.Measure());
che è altrettanto breve e probabilmente più chiaro del tuo metodo di praticità come concepito nella domanda.