三行代码  ›  专栏  ›  技术社区  ›  Community wiki

WF、WCF和声明性服务(或者:微软所说的“声明性”是什么意思?)

  •  6
  • Community wiki  · 技术社区  · 2 月前

    我之所以制作这个社区维基,是因为有些人可能认为它是可以辩论的,而另一些人可能认为这是一个用词来表达他们真正意思的问题(换句话说,这是不是一个意见问题,这是一种意见问题)。

    有一个 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中以声明方式提供 另一层抽象。 基本上,您可以创建 通过定义您想要的 要做的服务而不是如何做 它。可以定义整个服务 声明性的,包括 执行操作。

    所以如果我们说 陈述性的 宣言地 三次,这使它成为声明性的。明白了。如果我们说“你想做什么,而不是如何做”这句神奇的短语,那么我们可能会忽略注意到,在下一句话中,我们将指定“操作的实施”,因此我们将确切地说如何做。

    该页面中的示例是:

    <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编写内容是否会使其具有声明性(以及可读性较差)?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Anton Gogolev    14 年前

    另一个认识是,在交换格式之外的其他能力中使用XML耗费大量时间。

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

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

        2
  •  0
  •   John Saunders    14 年前

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

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

    您应该编写特定于您的问题域的自定义活动。这些都是通过各种开箱即用的活动来连接的。这些可能是相当高级别的活动,比如“评估保险单”或“记录患者入住情况”。

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

    推荐文章