Я часто нахожу себя пишущим функции, которые выглядят так, потому что они позволяют мне легко смоделировать доступ к данным, и все же предоставляют подпись, которая принимает параметры, определяющие, к каким данным обращаться.
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
где вы передаете сам параметр в функцию, которая, в свою очередь, дает вам функцию, ссылающуюся на этот конкретный параметр. Эта «настроенная» функция будет передана в качестве параметра функции, которая ее использует.