我制作了这个社区 Wiki,因为有些人可能认为它可以进行辩论,而另一些人可能认为这是一个用词来表达他们真正意思的问题(换句话说,它是否是一个意见问题是一个意见问题)。
SO上有一个关于声明式编程的一般问题,它有一些很好的答案。
但我有点被微软传道者的这篇博文所震撼。
声明式编程的一个优点是您可以指示您想要做什么,但不能指示如何去做。
到目前为止,一切都很好 - 事实上,这与 SO 问题的公认答案完全一致。
但是然后查看有关“服务实现”的部分,
您只需查看几十行 xaml 代码,就可以确定 WCF 服务是如何配置的,以及相应的工作流是如何定义的。
看过一些例子后,让我简要回答一下“不,我不能”。但是,与其轻率地忽略这些东西,不如让我们看看文档。
花了一段时间,但最终现实已经赶上了讽刺......但这不是重点 - 当然,他们并没有认真建议这样做来揭露一些琐碎的事情,比如加法。我也不是在抱怨荒谬的冗长,以及任何人都会用手编写类似的东西的奇怪想法——它看起来更像是编译器的输出,而不是人类可读的语言。
令我困惑的是,这据称是“声明性的”。然而,它的核心是一个赋值语句。
声明式服务在 XAML 中以声明方式定义,并提供另一层抽象。基本上,您通过定义您希望服务做什么而不是如何做来创建服务模型。整个服务可以以声明方式定义,包括操作的实现。
因此,如果我们说三遍声明性或声明性,那就是声明性的。明白了。如果我们说“你想做什么而不是怎么做”这个神奇的短语,那么我们可以忽略在接下来的句子中,我们将指定“操作的实现”,所以我们将准确地说出如何做到这一点。
该页面中的示例是:
<wma:Sequence>
<wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
<wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>
也就是说,整个事情(包括我从 WF 示例中删除的大量垃圾)完全等同于:
void Add(int op1, int op2, out int result1)
{
Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
result1 = op1 + op2;
}
所以 - 一个语句块,按照它们出现的顺序执行,并且有副作用。当然还有用于循环的工作流活动元素(如果 WF 还没有你最喜欢的命令式语句,你可以编写自己的活动)。显然,“以不可读的格式重写代码”与“添加抽象层”是一回事。
重申一下,我抱怨的不是疯狂的难以理解的冗长——事实上,它显然是在服务实现中发生的图灵完备的命令式编程,那么有什么意义呢?在你知道之前,我们将在调试器中逐步完成我们的工作流程,试图找出哪个赋值语句改变了哪个值,或者为什么循环会永远循环下去。
(具有讽刺意味的是,在 C# 版本中,它更具声明性,因为我们没有指定字符串片段应如何连接,从而允许编译器生成对Concat
方法的更少调用。)
那么在 XML 中编写某些东西是否会使其具有声明性(以及可读性较差)?