6

我制作了这个社区 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 中编写某些东西是否会使其具有声明性(以及可读性较差)?

4

2 回答 2

3

另一个承认在交换格式以外的其他能力中使用 XML 很浪费时间。

WCF 中的服务“定义”从一开始就是声明性的。但是,将接口定义与服务定义(我的意思是ServiceContractAttribute等)分开是,IMO,一件好事。然而,使用 XML 作为编程语言真的很糟糕。

在查看这些 XML 文档时,我个人觉得纯粹的恐怖攻击是可以解释的。

于 2009-07-27T11:54:26.547 回答
0

Windows Workflow Foundation 的一部分(在 Microsoft 之外)没有太多讨论,可能会为您澄清这一点。

如果您创建一个 Workflow 项目并查看工具箱,您会看到大量可以拖动到设计图面上的“框和线”。您可能会觉得您应该使用这组工具创建您的工作流程。事实并非如此。

您应该编写特定于您的问题域的自定义活动。这些旨在通过各种开箱即用的活动连接起来。这些可能是相当高级的活动——例如“评估保险单”或“记录患者住院时间”。

声明性工作流(或服务)将声明如何将您可用的特定问题活动组合在一起。

于 2009-07-27T12:08:39.810 回答