【发布时间】:2010-12-20 04:08:53
【问题描述】:
我正在为一个简单的工作工具编写我的第一个 DSL。我正在使用构建器模式来设置复杂的父对象,但在构建父对象的子集合时遇到了砖墙。这是一个示例:
用途:
var myMorningCoffee = Coffee.Make.WithCream().WithOuncesToServe(16);
带闭包的示例(我认为这就是它们的名称):
var myMorningCoffee = Coffee.Make.WithCream().PourIn(
x => {
x.ShotOfExpresso.AtTemperature(100);
x.ShotOfExpresso.AtTemperature(100).OfPremiumType();
}
).WithOuncesToServe(16);
示例类(没有子 PourIn() 方法,因为这是我想要弄清楚的。)
public class Coffee
{
private bool _cream;
public Coffee Make { get new Coffee(); }
public Coffee WithCream()
{
_cream = true;
return this;
}
public Coffee WithOuncesToServe(int ounces)
{
_ounces = ounces;
return this;
}
}
因此,在我的工作应用程序中,我可以很好地构建复杂的对象,但我一生都无法弄清楚如何为父对象上的子集合获取 lambda 编码。 (在本例中是 expresso 的镜头(子集合))。
也许我在这里混淆了概念,我不介意直截了当;但是,我真的很喜欢它的阅读方式,并想弄清楚如何让它发挥作用。
谢谢, 山姆
【问题讨论】:
-
老实说;恕我直言,这确实是对DSL的可怕使用。它对我来说很可怕。但我想对每个人来说都是他自己的。
-
那么你的问题是什么?所有这些代码看起来都是专有的,所以我们无法知道其中的任何含义。比如IncludeApps的参数类型是什么?
-
你能贴出 IncludeApps 方法的签名吗?
-
这看起来更像是一个流畅的界面而不是 DSL。
-
我同意,这个样本很烂,我希望它能传达我的意图,但也许不会。我同意“James Black”的观点,即这可能是一个比 DSL 更流畅的界面。关于“IncludeApps”方法的签名,这就是我的观点,我不确定这应该是什么。这是一个不同对象的子集合,所以我想你可以随意提出任何样本。
标签: c# lambda action dsl closures