3

トップダウンアプローチでは、単一のタスクを実行するために関数を小さくすることをお勧めします。

それで。メインが何をしているのかわかりませんか?他の関数または必要なすべてを呼び出すだけですか?

ありがとう。

4

5 に答える 5

5

アイデアは、タスクを論理的な抽象化に分離することです。

ここでは、キッチンでの調理例を使ってコンセプトを説明します。あなたがいくつかの料理でおいしい夕食を準備したいとします。あなたのメンタルチェックリストはおそらく主要なステップから始まります:

  • 食材を買うために食料品の買い物に行く
  • 材料の前処理
  • 食べ物を調理する
  • 食べ物を出す
  • きれいな皿

したがって、これらはあなたに入る機能になりますmain()

次に、各ステップについて、もう少し詳しく説明します。(以下にリストされているサブステップは、各メイン関数が独自の関数定義内から呼び出すものであることに注意してください)。

  • 食材を買うために食料品の買い物に行く:
    • ショッピングリストを作成する
    • 食料品店に行く
    • 材料を集める
    • 材料の支払い
    • 帰宅
  • 前処理成分:
    • 野菜を洗う
    • 肉を切り刻む
    • 生姜、クローブを切り刻む...
  • 食べ物を調理する
    • 鍋とフライパンを準備します
    • 食用油を追加します
    • ストーブをオンにします
    • 完了するまで鍋で野菜と肉を調理します
  • 食べ物を出す:
    • セットプレート
    • 食べ物を分けて
    • 他の人に夕食を呼ぶ
    • 晩ご飯を食べる
  • きれいな皿:
    • 食器を洗剤で洗う
    • 食器を水ですすぐ
    • お皿を片付けなさい

次に、サブステップごとに、個別の論理アクションを表すために物事をよりきめ細かくすることができます。main()簡潔にするために、最初の2つの関数を調べます。

  • 食材を買うために食料品の買い物に行く:
    • ショッピングリストを作成する:
      • オープン冷蔵庫
      • 冷蔵庫の中身を調べる
      • どの材料が冷蔵庫で不足しているのかを書き留めます。
      • 冷蔵庫を閉める
    • 食料品店にアクセス:
    • 材料を集める:
      • オープン冷蔵庫
      • 冷凍野菜をショッピングカートに入れます
      • 冷蔵庫を閉める
      • ショッピングカートに新鮮な肉を入れます
    • 材料の支払い:
    • 帰宅:
  • 前処理成分:
    • 野菜を洗う:
      • オープン冷蔵庫
      • 冷蔵庫から野菜を取り出す
      • 冷蔵庫を閉める
      • タップの下で野菜をすすぐ
    • 肉を切り刻む:
    • 生姜、クローブを切り刻む...

ここで、2つのことに注意してください。

  1. 主要なタスクをより小さなサブタスクに分割することにより、プログラムのアプローチに非常に論理的な「トップダウン」ツリーのような構造ができました。メインを見ると、各ステップがどのように実装されているかを正確に理解していなくても、全体的な計画が何であるかをすぐに確認できます。しかし、個々の関数を調べることで、各関数がそのタスクをどのように実行するかをすぐに理解できます...など。
  2. 関数にカプセル化された抽象化されたロジック(たとえば、太字でリストされている冷蔵庫の開閉アクション)を複数の場所で再利用できるようになりました。冷蔵庫を開ける必要があるときは、毎回正確にその方法を再コーディングする代わりに、「openFridge」を呼び出すことができます。(技術的にはコードをコピーして貼り付けることができますが、それはコードのクローン作成と呼ばれるアンチパターンを引き起こします。冷蔵庫を開く方法を変更する必要がある場合は、1つの関数だけでなく、どこでもそれを行う必要があります)
于 2012-11-10T06:45:28.217 に答える
1

トップダウンアプローチは、高レベルのシステムまたは設計から始まり、次に低レベルのシステムまたは設計または開発に進みます。トップダウンアプローチは、最初にシステム全体またはプロジェクト全体の要約に焦点を合わせます。最後に、それは詳細設計または開発に焦点を合わせます。このアプローチでは、最初のプログラマーはmain関数のコードを作成する必要があります。メイン関数では、他のサブ関数を呼び出します。最後に、各サブ関数のコードを記述します。

于 2012-11-10T06:45:18.390 に答える
1

トップダウンアプローチでは、高レベルの設計から始めます。したがって、最初にアイデアをmain()関数に抽出します(Cまたは同様の言語を使用している場合)。たとえば、フィボナッチ数を計算する場合、トップダウンアプローチでは次のように開始します

int main()
{
    int *numbers;
    int n = getCountOfNumbers(); // get the count of numbers to be generated
    generateFibonacci(numbers, n); // generate numbers
    processFibonacci(numbers); // display the numbers
    return 0;
}

これにより、プログラムで行うことの抽象的な実装が設定されます。次に、関数getCountOfNumbers()、generateFibonacci()、およびprocessFibonacci()を実装して、ロジックとアルゴリズムを表します。

したがって、main()関数を使用すると、プログラムの高レベルの編成を表すことができます。さらに、これはほとんどのプログラミング言語の開始点であるため、制御フローはmain()関数から始まり、呼び出しシーケンスに応じてプログラム内の他の関数に委任されます。

于 2012-11-10T06:54:55.530 に答える
0

トップダウンアプローチは、厳密に言えば関数やタスクに関するものではなく、アルゴリズムの世界への過度に単純化されたアプローチのようなものです。

通常、トップダウンアプローチは、チューリング理論とアルゴリズムの紹介の直後に出てくるトピックであり、学生に実際的な意味を理解させるだけです。また、これは、以下を含むような、より複雑で進化したアプローチのはるかに簡単な代替手段です。数学+アルゴリズムは、通常、大学やコンピュータサイエンスのクラス向けのものです。

また、言語が入らないトップダウンアプローチについて話すと、それはあらゆる言語またはあらゆる種類の実装からそれ自体を抽象化するトピックであり、問​​題解決アプローチを備えた一般的な手順とアルゴリズムに関するものであることに気付くでしょう。

C ++に関しては、実際には一般的な用語で、main()関数の役割は基本的にアプリケーションのメインスレッドを開始し、値argcargv値を管理することです。

于 2012-11-10T06:53:12.850 に答える
0

main() をプログラム全体の青写真と考えるのが好きです。高レベルの「説明的な」方法で他の関数を呼び出します。本当にこれは、関数がどのように読み取られるべきかを説明しています。

たとえば、ユーザーが画像を選択してサムネイルに縮小できるようにするプログラムは、次のようになります。

// Pseudo-code
int main() {
    string path = getImagePath();
    checkImageValidity(path);
    imageData imgData = new imageData();
    imgData = readImageData(path);
    writeImageData("../thumb.png", imgData, imageType.PNG);
    fileClose(fp);
    return 0;
}

各関数はいくつかの作業を行い、おそらく他の関数を呼び出しますが、メインを読むことで、プログラムの大まかな流れを理解できます。「画像ファイルのパスを取得し、それが有効なファイルであることを確認し、未加工の画像データを読み取り、出力ファイルに書き込み、それを閉じます。」

実際のプログラムはこれよりも複雑になりますが、それは、プログラムの複雑さがメリットとなる深さと幅のレベルと同じように、同じように読み取る関数がもっとあることを意味します。

于 2012-11-10T06:59:20.767 に答える