Sıklıkla kendime böyle görünen işlevleri yazarken buluyorum çünkü veri erişimine kolayca takılmama izin veriyorlar ve yine de hangi verilere erişileceğini belirlemek için parametreleri kabul eden bir imza sağlıyorlar.
public static string GetFormattedRate(
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = rate.DollarsPerMonth.ToString("C0");
return formattedRate;
}
Veya
public static string GetFormattedRate(
Func<RateType, string> formatRate,
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = formatRate(rate);
return formattedRate;
}
Sonra böyle bir şey kullanıyorum:
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);
}
Bu yaygın bir uygulama mı? Daha fazla bir şey yapmam gerektiğini hissediyorum
public static string GetFormattedRate(
Func<RateType> getRate())
{
var rate = getRate();
return rate.DollarsPerMonth.ToString("C0");
}
Ama bu çok iyi görünmüyor çünkü her ücret türü için yönteme geçmek için yeni bir işlev yapmak zorunda kalıyordum.
Bazen yapmam gerektiğini hissediyorum
public static string GetFormattedRate(RateType rate)
{
return rate.DollarsPerMonth.ToString("C0");
}
Ancak bu, getirme ve biçim yeniden kullanılabilirliğini ortadan kaldırıyor gibi görünüyor. Ne zaman almak ve biçimlendirmek istersem, biri getirmek için diğeri biçimlendirmek için iki satır yazmak zorundayım.
İşlevsel programlamada eksik olan ne? Bunu yapmanın doğru yolu mu, yoksa bakımı ve kullanımı kolay olan daha iyi bir kalıp var mı?
GetFormattedRate()
?
closures
parametrenin kendisini bir işleve nereye ilettiğinizi kullanmaktır , bu da size bu özel parametreye atıfta bulunan bir işlev verir. Bu "yapılandırılmış" işlev, onu kullanan işleve bir parametre olarak iletilir.