私は宣言型プログラミングに関して、私がそのコンセプトをどれだけうまく理解しているかを知るために質問があります。私は "宣言的な方法"でJavaでスドクパズルソルバーを作るべきだと述べている課題があります。何を意味するかを調べると、プログラムを記述しているあいまいな定義がたくさんあることがわかったのです。どのように指定するかの代わりに何をしなければならないかを記述してください。周りを見回すと、リストを使ってそれを説明する興味深い例が見つかりました。具体的には、奇数のリストをフィルタリングしました。Javaでの宣言的プログラミング
命令型スタイル(と呼ばれる関数):
List resultList = new List()
foreach element in startlist
do if element % 2 == 1
do add element to resultList
od
od
return returnList
宣言スタイル(呼び出しコンテキスト):
newList = startList.filter(num -> num%2 ==1)
だから、宣言型スタイルで、我々が維持したいが、何の要素に指定されリストの作成方法は指定されていません。これは、リストのAPIに抽象化されます。
私の簡単な質問は:このアプローチは、リストのライブラリがアルゴリズムがそこに移動されているため、宣言的ではないということですか?その場合、「宣言的」という用語は、このライブラリを呼び出すプログラムの部分に適用されます。したがって、プログラムが100%宣言的であることは不可能ではないのです(もちろん、どこかで、処理の仕方を指定するアルゴリズムが必要です)。私がここに間違っていれば私を修正してください。これは宣言的概念の理解の中心にあるためです。
いずれの場合でも、私は自分自身のライブラリ(「命令的な」ロジックをすべて「宣言的」関数プログラミングスタイルで包んでいる)とステップの仕様を含む自分のライブラリの組み合わせとして、これらのライブラリへの呼び出しとして、スドクを解決するために取られました。また、ソルバークラスをさらに宣言的にするために、関数をJavaの引数として渡す方法のラッパーとしてCommandパターンを使用できるとも考えていました。私はすでにこれを試して、OddNumberCommand
のコマンドで、newList = startList.filter(new OddNumberCommand())
の行に沿って何かを試してみました。コマンドをexecute
にして、その要素を引数として引数から取り除いて、その要素が保持されているか、結果リスト。
とにかく、これはまさに私の心が回転する方法であり、正しいか間違った方向に向かうかどうかを確かめるために、このコンセプトをよりよく理解している他の人の助けに向かいたいと思っていました。宣言的なプログラミングを正しく使うことを学ぶことができるように、私が間違っている箇所や私の推論で正しいことを教えてください。宣言型プログラミングの定義から
おかげ
「宣言的」と記述した方が機能的プログラミングスタイルとしてよく説明されています。宣言は他の多くのことを意味します。 「これを実行してからそれを行う」という意味ではなく、「これらの2つの表現は同等」または「これは満足しなければならない制約です」という意味の記述は、宣言的です。あなたの教授が念頭に置いた正確な内容は、あなたが与えた情報を考えれば完全に明確ではありません。 –