Często zdarza mi się pisać funkcje, które wyglądają tak, ponieważ pozwalają mi łatwo kpić z dostępu do danych i nadal dostarczają podpis, który akceptuje parametry określające, do których danych mam dostęp.
public static string GetFormattedRate(
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = rate.DollarsPerMonth.ToString("C0");
return formattedRate;
}
Lub
public static string GetFormattedRate(
Func<RateType, string> formatRate,
Func<string, RateType>> getRate,
string rateKey)
{
var rate = getRate(rateKey);
var formattedRate = formatRate(rate);
return formattedRate;
}
Potem używam czegoś takiego:
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);
}
Czy to powszechna praktyka? Czuję, że powinienem robić coś więcej
public static string GetFormattedRate(
Func<RateType> getRate())
{
var rate = getRate();
return rate.DollarsPerMonth.ToString("C0");
}
Ale to nie wydaje się działać zbyt dobrze, ponieważ musiałbym stworzyć nową funkcję, aby przejść do metody dla każdego rodzaju stawki.
Czasami czuję, że powinienem to robić
public static string GetFormattedRate(RateType rate)
{
return rate.DollarsPerMonth.ToString("C0");
}
Ale wydaje się, że to zabiera ponowne pobieranie i formatowanie. Ilekroć chcę pobrać i sformatować, muszę napisać dwa wiersze, jeden do pobrania, a drugi do sformatowania.
Czego brakuje mi w programowaniu funkcjonalnym? Czy to właściwy sposób, aby to zrobić, czy jest lepszy wzór, który jest jednocześnie łatwy w utrzymaniu i użyciu?
GetFormattedRate()
jest zaakceptować szybkość do sformatowania jako parametru, w przeciwieństwie do akceptowania funkcji, która zwraca stawkę do sformatowania jako parametru?
closures
gdzie przekazujesz sam parametr do funkcji, co w zamian daje ci funkcję odnoszącą się do tego konkretnego parametru. Ta „skonfigurowana” funkcja byłaby przekazywana jako parametr do funkcji, która jej używa.