2012-11-10 106 views
3

採用自頂向下的方式,建議將功能設置得小一些,只需執行單個任務主要功能包含哪些內容?

等等。我不知道主要做什麼?只是調用其他功能或我們想要的一切?

謝謝。

+0

我沒有任何專業知識,但我認爲有人應該通過'main'來了解你的程序的功能。 – chris

回答

1

自頂向下的方法從高層次的系統或設計開始,然後進入低層次的系統或設計或開發。自上而下的方法首先關注整體系統或項目的抽象。最後它着重於細節設計或開發。 在這種方法中,第一個程序員必須編寫主函數的代碼。在主要功能中,它們將調用其他子功能。最後,他們將爲每個子函數編寫代碼。

5

這個想法是將任務分成邏輯抽象。

在這裏,我將用一個廚房烹飪的例子來說明這個概念。假設你想準備一些美味的晚餐和一些菜餚。你的精神的清單可能會與主要步驟開始:

  • 去超市購物的成分
  • 處理前的成分
  • 庫克食品
  • 即成食品
  • 乾淨的盤子

因此,這些功能將會在您的main()

然後每一步,你打破它一點點:(請注意,下面列出的子步驟是什麼各自的主要職能是從他們自己的函數定義中調用)

  • 去超市配料購物:
    • 做一個購物清單
    • 訪問雜貨店
    • 收集食材配料
    • 收費
    • 返回首頁
  • 程序前成份:
    • 蔬菜洗淨
    • 砍肉
    • 剁碎的生薑,丁香...
  • 庫克食品
    • 準備盆&鍋
    • 添加食用油竈具上
    • 打開
    • 庫克肉,鍋菜炒熟
  • 提供食物:
    • 套板
    • 鴻溝食物進入部分
    • 呼叫其他人來吃飯
    • 吃晚飯
  • 乾淨的盤子:
    • 洗碗用洗滌劑
    • 涮菜水
    • 認沽碗碟從

然後對於每個子步驟中,你仍然可以讓事情變得更細粒度代表獨立的邏輯操作,我們只檢查第2個功能main()爲簡潔:

  • 去超市購物了配料:
    • 做一個購物清單:
      • 打開冰箱
      • 檢查冰箱
      • 的內容
      • 寫下哪些配料在冰箱裏運行不足。
      • 關閉冰箱
    • 訪問雜貨店:
    • 收集配料:
      • 打開冰箱
      • 認沽冷凍蔬菜在購物車
      • 關閉冰箱
      • 將鮮肉在購物車
    • 收費配料:
    • 返回首頁:
  • 程序前成份:
    • 蔬菜洗淨:
      • 打開冰箱
      • 從冰箱中取出蔬菜
      • 關閉冰箱
      • 沖洗蔬菜水龍頭下
    • 砍肉:
    • 剁碎的生薑,丁香...

現在請注意兩件事:

  1. 通過將主要任務分解爲更小的子任務,現在有一個非常合理的「自上而下」樹狀結構到您的程序的方法。當你看到main時,你可以立即看到整個計劃是什麼,而不必準確理解每個步驟的實現方式。但是通過檢查單個功能,您可以立即瞭解每個功能如何完成其​​任務......等等。
  2. 現在,您可以在多個地方重新使用封裝到函數中的任何抽象邏輯(例如,在加粗中列出的打開/關閉冰箱操作)。當你需要打開冰箱時,你可以直接調用「openFridge」,而不是每次都要重新編碼。 (您可以在技術上覆制和粘貼代碼,但這會導致一種稱爲代碼克隆的反模式:如果您需要更改如何打開冰箱,則必須在處處進行,而不是僅限於1個功能)
+0

這是一個愚蠢的例子,但希望這有助於爲你解決問題=) –

0

自上而下的方法不是嚴格意義上的函數和任務,而更像是算法世界的過於簡化的方法。

通常是自上而下的方法,它是在介紹圖靈理論和算法之後出現的一個主題,讓學生理解實際意義,它也是一種更簡單的替代方法,可用於更復雜和演變的方法,如涉及數學和算法的算法,它通常是大學和計算機科學課程的一部分。

你也可以注意到,說到自頂向下的方法,沒有語言出現,它是一個從任何語言或任何類型的實現中抽象出來的主題,它只是關於解決問題的一般步驟和算法。

關於C++,真正通用的術語,main()函數的作用基本上是啓動應用程序的主線程並管理argcargv值。

1

在Top Down方法中,您從一個高級設計開始。因此,您首先將您的想法提取到main()函數中(如果您使用C或類似語言)。 例如,如果我想計算Fibonacci數,在自上而下的方法,我將開始與

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()函數開始,然後根據您的調用順序被委派給程序中的其他函數。

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; 
} 

每個功能做了一些工作,也許調用等功能,但通過閱讀爲主,你瞭解該計劃的總體流程。 「它得到一個圖像文件路徑,檢查它是否是一個有效的文件,讀取其原始圖像數據,將其寫入輸出文件,然後關閉它。」

真正的程序比這個更復雜,但這意味着你有更多的函數應該以同樣的方式閱讀,因爲程序的複雜性值得深入和廣泛的層次。

相關問題