私がこのコミュニティ 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 で何かを記述すると、それは宣言的になります (可読性が低下するだけでなく) でしょうか?