2012-04-22 18 views
2

私は宣言型プログラミングに関して、私がそのコンセプトをどれだけうまく理解しているかを知るために質問があります。私は "宣言的な方法"で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にして、その要素を引数として引数から取り除いて、その要素が保持されているか、結果リスト。

とにかく、これはまさに私の心が回転する方法であり、正しいか間違った方向に向かうかどうかを確かめるために、このコンセプトをよりよく理解している他の人の助けに向かいたいと思っていました。宣言的なプログラミングを正しく使うことを学ぶことができるように、私が間違っている箇所や私の推論で正しいことを教えてください。宣言型プログラミングの定義から

おかげ

+3

「宣言的」と記述した方が機能的プログラミングスタイルとしてよく説明されています。宣言は他の多くのことを意味します。 「これを実行してからそれを行う」という意味ではなく、「これらの2つの表現は同等」または「これは満足しなければならない制約です」という意味の記述は、宣言的です。あなたの教授が念頭に置いた正確な内容は、あなたが与えた情報を考えれば完全に明確ではありません。 –

答えて

4

は、あなたの例では、宣言型プログラミングより関数型プログラミングです。実際の宣言型プログラミングでは、より多くの結果指向が得られます。リストを自分のために変えるのではなく、リスト内の興味深い要素をどうするかを指定します。 Jessのようなルールエンジンは、宣言型プログラミングシステムの例です(私はJessの著者です)。

あなたの簡単な質問に答えてください:はい。すべての機能的または宣言的プログラミングシステムは、プログラムが実行されている実際のコンピュータ上で実装されなければならないランタイムシステムを含む。実際のコンピュータは常にノイマンの必須のマシンなので、そのランタイムシステムを命令的に書く必要があります。したがって、これはプログラムとハードウェアの間の抽象レイヤーです。

+0

宣言的なプログラムの中核には必ず不可欠な要素があることを明確にしてくれてありがとう。私の場合、教師は外部ライブラリの使用を禁止していますので、ステップバイステップの手順を含む独自のエンジンを作成し、宣言的なスドクソルバーで提供する機能を使用する必要があります。 – Warkst

1

:宣言型言語の

特徴:関係が構成要素の面で直接 を指定しているシステムに基づいて計算の

  1. モデル入力データの
  2. 計算する方法ではなく、計算する方法を指定する関係 を記述する定義または式のセットで構成されています。
  3. 変数の非破壊的な割り当て。
  4. 使用されるデータ構造の明示的な表現。
  5. 実行順序は関係ありません(副作用なし )。
  6. 式/定義を値として使用できます。
  7. プログラマは制御を行わなくなりました。

宣言的プログラムは、ロジック(目的の目標または結果)とコントロール(定義した目標を達成する方法)を定義しません。宣言的言語は目標指向または目標指向であると言います。

私は、数独ケースでは、インタフェースがクラス間のコントラクトとして使用されると考えています。この方法で、モデルを破ることなく実装を変更できます。コメンターが言ったように、2つは、いくつかの点で類似しているが