web-dev-qa-db-ja.com

意図によるプログラミング、深さ優先、幅優先?

プロシージャ/関数/メソッド間の依存関係の次のグラフがあるとします。

      o
    /   \
  v       e
 / \     / \
r   f   l   w

つまり、関数oは最初に関数vを呼び出し、次に関数eを呼び出します。関数v自体は、最初に関数rを呼び出し、次に関数fを呼び出します。関数e自体が最初に関数lを呼び出し、次に関数wを呼び出します。

Programming by Intentionを使用して、これらの関数をどの順序で定義する必要がありますか?

深さ優先:o、v、r、f、e、l、w

幅優先:o、v、e、r、f、l、w

3
fredoverflow

古いものはすべて新しいものです。エクストリームプログラミングの本を私たちに持ってきた人々は、とりわけ、ソフトウェア開発における一連のベストプラクティスを推進していました。それらの1つは、「インテンショナルプログラミング」と呼ばれていましたが、実際には新しいものではありませんでしたが、何年も前にCOBOLやSmalltalk(通常は「トップダウン」プログラミングと呼ばれます)などの言語で非常に一般的なコーディング手法でした。

インテンショナルプログラミング の紹介から)

インテンショナルプログラミングは、 トップダウンプログラミング の再発見であるように見えます。ここでは、トップレイヤーから始まり、そこから下に向かっていきます。

これは、Pascalおよびその同時代の時代のコードの記述方法でした。メインプロシージャの記述を開始し(言語定義とコンパイラの必要性により、ファイルの最後に配置されることがありました)、プロシージャまたは関数を記述しました。プロシージャまたは関数は、それを呼び出すコードの前に配置されました。

これは、OOが強調する「ボトムアップ設計」モデルとは対照的です。最初にビルディングブロックを構築し、次にそこから構築します。

これを使用してコードに構造フレームワークを配置することは、インテンショナルプログラミングの誤解と誤用になります。言語がそれを定義しない限り(パスカル)、メソッドがどの順序で宣言されているかは関係ありません。読みやすさ(およびプログラマー間の一貫性)はキー。

最新のIDEでは、コードの概要をすばやく簡単に確認できます。 EclipseでF3を押すと、コードのどこに配置されていても、メソッド呼び出しの定義が開きます。この点で、メソッドの構成は重要ではありません。注文がある場合は、次のガイドラインを使用してください。

  1. 言語の制限内でプログラムします。
  2. 言語規則の範囲内でプログラムします。
  3. チームのスタイルの制約内でプログラムします。
  4. 一貫してプログラムします。

トップダウン、ボトムアップ、深さ優先、呼吸優先、またはアルファベット順を注文する場合は、それを実行してください。そしてそれに固執する。

4
user40980

これが実際にプログラミングで意図的に指定されているかどうかはわかりませんが、長所と短所を分析できるかもしれません。

第5世代のプログラミング言語であるプロローグでは、両方の実行形式を使用できるため、疑似コードの観点からはどちらも有効です。

幅優先探索には、トップダウン方式で読み取ることができるという利点があります。関数の抽象化がレベルごとに大きく異なる場合は、1つのレベルをスキップできる可能性があります。幅優先が進むべき道です。

ただし、これを読んでいる人がすべてを読む必要がある場合、またはそれについての想定を避ける必要がある場合は、深さ優先の方が適しています。それはそれが実行されるのと同じ方法でコードを読むことを可能にし、それをより簡単で自然に読むことを可能にします、 ワニの卵の例 ;)について考えてください

最良のオプションは、すべてを深さ優先方式でソートし、内部要素を折りたたむことができるツールを用意することです。多くのコードエディターやFreeMindによって生成されたhtmlでそれを見てきました。これにより、読者は続行する方向を選択できます。幅優先で折りたたんでスクロールするか、深さ優先で展開してスクロールします。

一般に、depth-firstの方がはるかに安全なオプションです。

2
Trylks

私はロバートC.マーティンのステップダウンルールに従います。彼の本の中で クリーンコード 、彼は書いています:

コードをトップダウンの物語のように読んでもらいたいのです。すべての関数の後に、次の抽象化レベルの関数が続くようにして、関数のリストを読みながら、一度に1レベルの抽象化を降順にプログラムを読み取ることができるようにします。私はこれをステップダウンルールと呼んでいます。

コードを読むということは、一度に1レベルの抽象化を下ることになります。あなたの例によれば、コードを読むときの物語は

  1. Oを行うには、VとEを行います
  2. Vを実行するには、RとFを実行します
  3. Eを行うには、LとWを行います
  4. Rがどのように行われるかについての低レベルの詳細は次のとおりです
  5. Fがどのように行われるかについての低レベルの詳細は次のとおりです
  6. Lがどのように行われるかについての低レベルの詳細は次のとおりです
  7. Wがどのように行われるかについての低レベルの詳細は次のとおりです

読者がOを理解したい場合は、知りたい実装の詳細の数に応じて、上記の項目1、2、または3の後で読むのをやめることができる場合があります。

1
Martin Omander