【问题标题】:WF, WCF and Declarative Services (or: What does Microsoft mean by "declarative"?)WF、WCF 和声明式服务(或:Microsoft 的“声明式”是什么意思?)
【发布时间】:2009-07-27 11:44:41
【问题描述】:

我创建了这个社区 Wiki,因为有些人可能认为它可以进行辩论,而另一些人可能认为这是一个用词来表达他们真正意思的问题(换句话说,这是一个意见问题,是否是一个意见问题)。

有一个general question on SO about declarative programming,有一些很好的答案。

但我有点被微软布道者的this blog post 抛弃了。

声明式的一个优点 编程是你可以指出 你想做什么,但不是怎么做 去做吧。

到目前为止,一切都很好 - 事实上,这与 SO 问题的公认答案完全一致。

然后查看“服务实现”部分,

你可以 看看几十行xaml 代码,并能够确定如何 WCF 服务的配置以及如何 定义了相应的工作流。

看过一些例子后,让我简要回答一下“不,我不能”。但与其轻率地忽略这些东西,不如让我们look at the docs

花费了一段时间,但最终reality has caught up with satire...但这不是重点——当然,他们并没有认真建议这样做来暴露一些微不足道的东西,比如加法。我也不是在抱怨荒谬的冗长,以及任何人都会手写这样的东西的奇怪想法——它看起来更像是编译器的输出,而不是人类可读的语言。

让我感到困惑的是,这声称是“声明性的”。然而它的核心是一个赋值语句。

There's more here:

定义了声明式服务 在 XAML 中以声明方式提供 另一个抽象层。 基本上,您创建一个模型 通过定义你想要的服务 服务要做而不是怎么做 它。可以定义整个服务 声明式地,包括 执行操作。

所以如果我们说 declarativedeclaratively 三遍,那就是声明性的。明白了。如果我们说“你想做什么而不是怎么做”这个神奇的短语,那么我们可以忽略在下一句中,我们将指定“操作的实现”,所以我们会准确地说出怎么做。

该页面中的示例是:

<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;
}

So - 一个语句块,按照它们出现的顺序执行,并且有副作用。当然还有用于循环的工作流活动元素(如果 WF 还没有你最喜欢的命令式语句,你可以编写自己的活动)。显然,“以不可读的格式重写代码”与“添加抽象层”是一回事。

重申一下,我要抱怨的不是疯狂的难以理解的冗长——事实上,服务实现中发生的显然是图灵完备的命令式编程,那么有什么意义呢?在您知道之前,我们将在调试器中逐步完成我们的工作流程,试图找出哪个赋值语句改变了哪个值,或者为什么循环会永远循环下去。

(具有讽刺意味的是,在 C# 版本中,它更具声明性,因为我们没有指定应如何连接字符串片段,从而允许编译器生成更少的对 Concat 方法的调用。)

那么在 XML 中编写一些东西是否会使其具有声明性(以及可读性较差)?

【问题讨论】:

    标签: wcf workflow-foundation declarative


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • “声明如何组合”——但仅限于 C# 中的方法体“声明”如何实现该方法。并注意“如何”一词的出现,这是声明式编程应该避免的。声明式和命令式之间的界限是什么,因为服务执行的工作流活动通常是命令式步骤(无论多么庞大),因此必须以命令式顺序操作,并由开箱即用的命令式 WF 活动粘合?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多