回答
自頂向下的方法從高層次的系統或設計開始,然後進入低層次的系統或設計或開發。自上而下的方法首先關注整體系統或項目的抽象。最後它着重於細節設計或開發。 在這種方法中,第一個程序員必須編寫主函數的代碼。在主要功能中,它們將調用其他子功能。最後,他們將爲每個子函數編寫代碼。
這個想法是將任務分成邏輯抽象。
在這裏,我將用一個廚房烹飪的例子來說明這個概念。假設你想準備一些美味的晚餐和一些菜餚。你的精神的清單可能會與主要步驟開始:
- 去超市購物的成分
- 處理前的成分
- 庫克食品
- 即成食品
- 乾淨的盤子
因此,這些功能將會在您的main()
然後每一步,你打破它一點點:(請注意,下面列出的子步驟是什麼各自的主要職能是從他們自己的函數定義中調用)
- 去超市配料購物:
- 做一個購物清單
- 訪問雜貨店
- 收集食材配料
- 收費
- 返回首頁
- 程序前成份:
- 蔬菜洗淨
- 砍肉
- 剁碎的生薑,丁香...
- 庫克食品
- 準備盆&鍋
- 添加食用油竈具上
- 打開
- 庫克肉,鍋菜炒熟
- 提供食物:
- 套板
- 鴻溝食物進入部分
- 呼叫其他人來吃飯
- 吃晚飯
- 乾淨的盤子:
- 洗碗用洗滌劑
- 涮菜水
- 認沽碗碟從
然後對於每個子步驟中,你仍然可以讓事情變得更細粒度代表獨立的邏輯操作,我們只檢查第2個功能main()
爲簡潔:
- 去超市購物了配料:
- 做一個購物清單:
- 打開冰箱
- 檢查冰箱 的內容
- 寫下哪些配料在冰箱裏運行不足。
- 關閉冰箱
- 訪問雜貨店:
- 收集配料:
- 打開冰箱
- 認沽冷凍蔬菜在購物車
- 關閉冰箱
- 將鮮肉在購物車
- 收費配料:
- 返回首頁:
- 做一個購物清單:
- 程序前成份:
- 蔬菜洗淨:
- 打開冰箱
- 從冰箱中取出蔬菜 種
- 關閉冰箱
- 沖洗蔬菜水龍頭下
- 砍肉:
- 剁碎的生薑,丁香...
- 蔬菜洗淨:
現在請注意兩件事:
- 通過將主要任務分解爲更小的子任務,現在有一個非常合理的「自上而下」樹狀結構到您的程序的方法。當你看到main時,你可以立即看到整個計劃是什麼,而不必準確理解每個步驟的實現方式。但是通過檢查單個功能,您可以立即瞭解每個功能如何完成其任務......等等。
- 現在,您可以在多個地方重新使用封裝到函數中的任何抽象邏輯(例如,在加粗中列出的打開/關閉冰箱操作)。當你需要打開冰箱時,你可以直接調用「openFridge」,而不是每次都要重新編碼。 (您可以在技術上覆制和粘貼代碼,但這會導致一種稱爲代碼克隆的反模式:如果您需要更改如何打開冰箱,則必須在處處進行,而不是僅限於1個功能)
這是一個愚蠢的例子,但希望這有助於爲你解決問題=) –
自上而下的方法不是嚴格意義上的函數和任務,而更像是算法世界的過於簡化的方法。
通常是自上而下的方法,它是在介紹圖靈理論和算法之後出現的一個主題,讓學生理解實際意義,它也是一種更簡單的替代方法,可用於更復雜和演變的方法,如涉及數學和算法的算法,它通常是大學和計算機科學課程的一部分。
你也可以注意到,說到自頂向下的方法,沒有語言出現,它是一個從任何語言或任何類型的實現中抽象出來的主題,它只是關於解決問題的一般步驟和算法。
關於C++,真正通用的術語,main()
函數的作用基本上是啓動應用程序的主線程並管理argc
和argv
值。
在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()函數開始,然後根據您的調用順序被委派給程序中的其他函數。
我喜歡將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;
}
每個功能做了一些工作,也許調用等功能,但通過閱讀爲主,你瞭解該計劃的總體流程。 「它得到一個圖像文件路徑,檢查它是否是一個有效的文件,讀取其原始圖像數據,將其寫入輸出文件,然後關閉它。」
真正的程序比這個更復雜,但這意味着你有更多的函數應該以同樣的方式閱讀,因爲程序的複雜性值得深入和廣泛的層次。
- 1. 要包含哪些功能org.junit
- 2. Firebase/Android:需要包含哪些內容才能使用AdMob包
- 3. 存儲庫應包含哪些內容?
- 4. OSGI庫中可包含哪些內容
- 5. 會話對象包含哪些內容?
- 6. CanExecute中應該包含哪些內容?
- 7. MEF 2包含哪些內容?
- 8. php5引入了哪些主要功能?
- 9. 要在NetBeans中使用JSTL標籤包含哪些內容?
- 10. ActionbarSherlock 4.0部署:需要包含哪些內容?
- 11. 在Android中使用GoogleHeaders時需要包含哪些內容?
- 12. 哪些R版本包含哪些基本功能
- 13. 「包含的do ... end」塊中不應包含哪些內容?
- 14. Qt ::需要在配置中包含哪些內容才能使用dbus?
- 15. 主要功能在哪裏?
- 16. 如何知道軟件包包含哪些功能?
- 17. Ruby On Rails:它包含哪些主要組件(寶石)?
- 18. 要包含哪些文件夾?
- 19. C++要包含哪些文件和庫?
- 20. 界面的幫助字符串應包含哪些內容?
- 21. 事件/審計記錄應包含哪些內容?
- 22. 應用程序日誌應該包含哪些內容?
- 23. TFS中的「構建」包含哪些內容?
- 24. tcp代理會話詳細信息包含哪些內容?
- 25. NetBeans Java項目的.gitignore文件應該包含哪些內容?
- 26. git回購中應包含哪些內容?
- 27. RESTful API的根資源應該包含哪些內容?
- 28. Ruby on Rails中的控制器類應包含哪些內容?
- 29. 這個ZPL代碼中不應包含哪些內容?
- 30. Java服務器jre 8包含哪些內容? (什麼不是?)
我沒有任何專業知識,但我認爲有人應該通過'main'來了解你的程序的功能。 – chris