6

私がこのコミュニティ Wiki を作成したのは、議論の余地があると考える人もいれば、言葉を実際に意味するものを使用する問題だと考える人もいるからです (つまり、意見の問題であるかどうかは意見の問題です)。

宣言型プログラミングに関する SO に関する一般的な質問があり、いくつかの優れた回答があります。

しかし、Microsoft のエバンジェリストからのこのブログ投稿には少し衝撃を受けました。

宣言型プログラミングの利点の 1 つは、何をしたいのかを示すことはできますが、その方法を示すことはできないことです。

これまでのところ、とても良いです-実際、SOの質問に対する受け入れられた回答と正確に一致しています。

しかし、「サービスの実装」に関する部分を確認してください。

数十行の xaml コードを見るだけで、WCF サービスがどのように構成され、対応するワークフローがどのように定義されているかを判断できます。

いくつかの例を見て、「いいえ、できません」と簡単に答えさせてください。しかし、このことを軽々しく却下するのではなく、 docs を見てみましょう。

しばらく時間がかかりましたが、ついに現実が風刺に追いつきました...しかし、それは重要ではありません. また、ばかばかしい冗長性や、そのようなものを誰もが手で書くという奇妙な考えについて不平を言っているわけでもありません。人間が読める言語というよりも、コンパイラの出力のように見えます。

私にとっての謎は、これが「宣言的」であると主張されていることです。それでも、その核心は割り当てステートメントです。

ここにもっとあります

宣言型サービスは、XAML で宣言的に定義され、抽象化の別のレイヤーを提供します。基本的に、サービスの実行方法ではなく、サービスに実行させたい内容を定義することによって、サービスのモデルを作成します。操作の実装を含め、サービス全体を宣言的に定義できます。

したがって、宣言的または宣言的に 3 回言うと宣言的なります。ガチャ。そして、「どのように行うかではなく、何をしたいか」という魔法のフレーズを言うと、次の文で、結局「操作の実装」を指定することに注意することを怠ることができます。その方法を具体的に説明します。

そのページの例は次のとおりです。

<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 を使用するのは非常に時間がかかることを、さらにもう 1 つ認めます。

WCF のサービス "定義" は、最初から宣言型でした。ただし、インターフェイス定義をサービス定義から分離することは(これは私が意味するServiceContractAttribute他のことです)、IMO、良いことです。しかし、プログラミング言語として XML を使用するのは本当に最悪です。

個人的には、これらの XML ドキュメントを見ると、説明のつく純粋な恐怖の攻撃を感じます。

于 2009-07-27T11:54:26.547 に答える
0

(Microsoft 以外では) あまり議論されていない Windows Workflow Foundation の一部があり、これを明確にすることができます。

ワークフロー プロジェクトを作成し、ツールボックスを見ると、デザイン サーフェイスにドラッグできる多数の "ボックスとライン" が表示されます。この一連のツールからワークフローを作成するように意図されているという印象を受けるかもしれません。そうではありません。

問題のドメインに固有のカスタム アクティビティを作成する必要があります。これらは、すぐに使用できるさまざまなアクティビティによって接続されることを意図しています。これらは、「保険契約の評価」や「患者滞在の記録」など、かなり高レベルのアクティビティである可能性があります。

宣言型ワークフロー (またはサービス) は、利用可能な問題固有のアクティビティをまとめる方法を宣言します。

于 2009-07-27T12:08:39.810 に答える