Ich bin zu dem Schluss gekommen, dass CreateDataFile
eine Sache darin besteht, eine schnelle Messung durchzuführen und die Daten dann zu speichern. Beides in derselben Methode zu tun, ist für jemanden, der diesen Code verwendet, intuitiver, als eine Messung durchzuführen und in eine Datei zu schreiben als separate Methodenaufrufe.
Ich denke, das ist eigentlich dein Problem. Die Methode macht nicht eine Sache. Es werden zwei unterschiedliche Vorgänge ausgeführt, bei denen E / A-Vorgänge für verschiedene Geräte ausgeführt werden. Beide Vorgänge werden auf andere Objekte heruntergeladen:
- Messung abrufen
- Speichern Sie das Ergebnis in einer Datei
Dies sind zwei verschiedene E / A-Operationen. Insbesondere verändert der erste Befehl das Dateisystem in keiner Weise.
In der Tat sollten wir beachten, dass es einen impliziten mittleren Schritt gibt:
- Messung abrufen
- Serialisieren Sie die Messung in ein bekanntes Format
- Speichern Sie die serialisierte Messung in einer Datei
Ihre API sollte diese in irgendeiner Form separat bereitstellen. Woher wissen Sie, dass ein Anrufer keine Messung durchführen möchte, ohne sie irgendwo zu speichern? Woher wissen Sie, dass sie keine Messung von einer anderen Quelle erhalten möchten? Woher wissen Sie, dass sie es nicht an einem anderen Ort als dem Gerät aufbewahren möchten? Es gibt gute Gründe, die Operationen zu entkoppeln. Bei einem bloßen Minimum, sollte jedes einzelne Stück sein verfügbar zu jedem Anrufer. Ich sollte nicht gezwungen sein, die Messung in eine Datei zu schreiben, wenn mein Anwendungsfall dies nicht erfordert.
Beispielsweise können Sie die Vorgänge wie folgt trennen.
IMeasurer
hat eine Möglichkeit, die Messung abzurufen:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Ihr Messtyp könnte einfach etwas Einfaches sein, wie ein string
oder decimal
. Ich bestehe nicht darauf, dass Sie eine Schnittstelle oder Klasse dafür benötigen, aber das Beispiel hier wird dadurch allgemeiner.
IFileAccess
hat eine Methode zum Speichern von Dateien:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Dann brauchen Sie eine Möglichkeit, eine Messung zu serialisieren. Integrieren Sie dies in die Klasse oder Schnittstelle, die eine Messung darstellt, oder verwenden Sie eine Dienstprogrammmethode:
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 ...
}
Es ist nicht klar, ob Sie diese Serialisierungsoperation noch getrennt haben.
Diese Art der Trennung verbessert Ihre API. Auf diese Weise kann der Anrufer entscheiden, was er wann benötigt, anstatt Ihre vorgefassten Vorstellungen über die Ausführung der E / A zu erzwingen. Anrufer sollten die Kontrolle haben, um eine gültige Operation auszuführen , unabhängig davon, ob Sie dies für nützlich halten oder nicht.
Sobald Sie für jede Operation eine eigene Implementierung haben, ist Ihre CreateDataFile
Methode nur noch eine Abkürzung für
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
Bemerkenswert ist, dass Ihre Methode nur einen geringen Mehrwert bietet, wenn Sie dies alles erledigt haben. Die obige Codezeile ist für Ihre Anrufer nicht schwer direkt zu verwenden, und Ihre Methode dient höchstens der Bequemlichkeit. Es sollte und ist etwas optionales . Und das ist die richtige Art und Weise, wie sich die API verhält.
Sobald alle relevanten Teile herausgerechnet wurden und wir festgestellt haben, dass die Methode nur eine Annehmlichkeit ist, müssen wir Ihre Frage umformulieren:
Was wäre der häufigste Anwendungsfall für Ihre Anrufer?
Wenn es darum geht, den typischen Anwendungsfall des Messens und Beschreibens derselben Tafel ein wenig komfortabler zu gestalten, ist es durchaus sinnvoll, sie direkt in der Board
Klasse verfügbar zu machen :
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()));
}
}
Wenn dies den Komfort nicht verbessert, würde ich mich überhaupt nicht um die Methode kümmern.
Dies ist eine bequeme Methode, die eine weitere Frage aufwirft.
Sollte die IFileAccess
Schnittstelle über den Messtyp Bescheid wissen und wissen, wie er serialisiert werden kann? In diesem Fall können Sie eine Methode hinzufügen, um IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Jetzt machen die Anrufer einfach Folgendes:
fileAccess.SaveFile(measurer.Measure());
Das ist genauso kurz und wahrscheinlich klarer als Ihre Bequemlichkeitsmethode, wie in der Frage gedacht.