私はCreateDataFile
、簡単な測定を行ってからデータを保存することで1つのことを行うという結論に達しました。同じ方法で両方を行うことは、このコードを使用して測定を行ってファイルに書き込む必要がある他の人にとってより直感的です個別のメソッド呼び出しとして。
これは実際あなたの問題だと思います。メソッドは1つのことを実行していません。異なるデバイスへのI / Oを伴う2つの異なる操作を実行しています。どちらも他のオブジェクトにオフロードしています。
- 測定値を取得する
- その結果をどこかのファイルに保存します
これらは2つの異なるI / O操作です。特に、最初のものはファイルシステムを変更しません。
実際、暗黙の中間ステップがあることに注意する必要があります。
- 測定値を取得する
- 測定値を既知の形式にシリアル化します
- シリアル化された測定値をファイルに保存します
APIは、これらのそれぞれを何らかの形で個別に提供する必要があります。発信者がどこにでも保存せずに測定を行いたくないことをどのように知っていますか?他のソースから測定値を取得することを望まないことをどのように確認しますか?デバイス以外の場所に保存したくないことをどのように確認しますか?操作を分離する正当な理由があります。で裸の最小、各個々のピースがあるべきである利用可能なすべての呼び出し元へ。私のユースケースがそれを要求しない場合、測定値をファイルに書き込むことを強制されるべきではありません。
例として、このように操作を分離できます。
IMeasurer
測定値を取得する方法があります:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
あなたの測定タイプは、string
またはのような単純なものかもしれませんdecimal
。インターフェースやクラスが必要だと主張しているわけではありませんが、ここでは例をより一般的にしています。
IFileAccess
ファイルを保存する方法がいくつかあります:
interface IFileAccess
{
void SaveFile(string fileContents);
}
次に、測定値をシリアル化する方法が必要です。それを測定を表すクラスまたはインターフェースに組み込むか、ユーティリティメソッドを用意します。
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 ...
}
このシリアル化操作がまだ分離されているかどうかは明らかではありません。
このような分離により、APIが向上します。I / Oを実行することについて先入観を持たせるのではなく、発信者が必要なものとタイミングを決定できるようにします。呼び出し側は、あなたがそれが有用であると思うかどうかにかかわらず、有効な操作を実行するためのコントロールを持っているべきです。
操作ごとに個別の実装を作成すると、CreateDataFile
メソッドは次の短縮形になります。
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
特に、これらすべてを行った後は、メソッドはほとんど価値を追加しません。上記のコード行は、呼び出し元が直接使用することは難しくなく、メソッドはせいぜい利便性のためだけです。これはオプションである必要があります。そして、それはAPIが振る舞う正しい方法です。
すべての関連する部分が考慮され、メソッドが単なる便利であることを確認したら、質問を言い換える必要があります。
発信者の最も一般的なユースケースは何ですか?
全体のポイントが、同じボードからの測定と同じボードへの書き込みの典型的なユースケースをわずかに便利にすることである場合、Board
クラスで直接利用できるようにすることは完全に理にかなっています。
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()));
}
}
これで利便性が改善されない場合は、この方法をまったく気にしません。
これは便利な方法であるため、もう1つ質問があります。
IFileAccess
インターフェイスは測定タイプとシリアル化の方法を知っている必要がありますか?その場合、次のメソッドを追加できますIFileAccess
。
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
今、発信者はこれを行うだけです:
fileAccess.SaveFile(measurer.Measure());
これは、質問で考えた便利な方法と同じくらい短く、おそらくより明確です。