我经常发现自己编写的函数看起来像这样,因为它们使我可以轻松地模拟数据访问,并且仍然提供一个接受参数的签名来确定要访问的数据。
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");
}
但这似乎消除了所有获取和格式的可重用性。每当我想获取和格式化时,我都必须写两行,其中一行用于获取,另一行用于格式化。
我对函数式编程缺少什么?这是正确的方法吗?还是存在既易于维护又易于使用的更好模式?
GetFormattedRate()
,而不是让它接受将格式格式化的速率作为参数的函数呢?
closures
将参数本身传递给函数的位置,这反过来又为您提供了引用该特定参数的函数。该“已配置”功能将作为参数传递给使用它的功能。