多くの場合、データアクセスを簡単にモックでき、アクセスするデータを決定するパラメーターを受け入れる署名を提供するため、このような関数を作成していることに気付きます。
public static string GetFormattedRate(
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = rate.DollarsPerMonth.ToString("C0");
return formattedRate;
}
または
public static string GetFormattedRate(
Func<RateType, string> formatRate,
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = formatRate(rate);
return formattedRate;
}
次に、私はそれを次のように使用します:
using FormatterModule;
public static Main()
{
var getRate = GetRateFunc(connectionStr);
var formattedRate = GetFormattedRate(getRate, rateType);
// or alternatively
var formattedRate = GetFormattedRate(getRate, FormatterModule.FormatRate, rateKey);
System.PrintLn(formattedRate);
}
これは一般的な習慣ですか?もっともっとやるべきだと思う
public static string GetFormattedRate(
Func<RateType> getRate())
{
var rate = getRate();
return rate.DollarsPerMonth.ToString("C0");
}
しかし、レートタイプごとにメソッドに渡す新しい関数を作成する必要があるため、これはあまりうまく機能しないようです。
時々やるべきだと思う
public static string GetFormattedRate(RateType rate)
{
return rate.DollarsPerMonth.ToString("C0");
}
しかし、それはフェッチとフォーマットの再利用性を奪うようです。フェッチしてフォーマットしたいときはいつでも、フェッチ用とフォーマット用の2行を書く必要があります。
関数型プログラミングについて何が欠けていますか?これはそれを行う正しい方法ですか、それとも保守と使用が簡単なより良いパターンがありますか?
GetFormattedRate()
?
closures
、パラメーター自体を関数に渡す場所を利用することです。これにより、その特定のパラメーターを参照する関数が返されます。この「構成された」関数は、それを使用する関数にパラメーターとして渡されます。