【发布时间】:2014-04-08 14:20:58
【问题描述】:
在 C# 中,我有以下代码:
public class SomeKindaWorker
{
public double Work(Strategy strat)
{
int i = 4;
// some code ...
var s = strat.Step1(i);
// some more code ...
var d = strat.Step2(s);
// yet more code ...
return d;
}
}
这是一段代码,它可以通过使用提供的策略object 填充部分实现来完成某种工作。注意:通常策略对象不包含状态;它们只是多态地提供各个步骤的实现。
策略类如下所示:
public abstract class Strategy
{
public abstract string Step1(int i);
public abstract double Step2(string s);
}
public class StrategyA : Strategy
{
public override string Step1(int i) { return "whatever"; }
public override double Step2(string s) { return 0.0; }
}
public class StrategyB : Strategy
{
public override string Step1(int i) { return "something else"; }
public override double Step2(string s) { return 4.5; }
}
观察:在 C# 中可以通过使用 lambda 实现相同的效果(并完全摆脱策略对象),但这种实现的好处是扩展类有自己的Step1 和 Step2 一起实现。
问题:这个想法在 F# 中的惯用实现是什么?
想法:
我可以将单独的阶跃函数注入到 Work 函数中,类似于观察中的想法。
我还可以创建一个收集两个函数的类型,并通过以下方式传递该类型的 值:
type Strategy = { Step1: int -> string; Step2: string -> double }
let strategyA = { Step1 = (fun i -> "whatever"); Step2 = fun s -> 0.0 }
let strategyB = { Step1 = (fun i -> "something else"); Step2 = fun s -> 4.5 }
这似乎与我想要实现的目标最接近:它将实施步骤紧密结合在一起,以便可以将它们作为一组进行检查。但是这个想法(创建一个只包含函数值的类型)在函数范式中是惯用的吗?还有其他想法吗?
【问题讨论】:
标签: f# functional-programming strategy-pattern