在自上而下的方法中,建议将函数缩小到只做一个Task。
所以。不知道main是干什么的?只是调用其他功能或我们想要的一切?
谢谢。
这个想法是将任务分成逻辑抽象。
在这里,我将使用厨房烹饪的例子来说明这个概念。假设你想准备一顿美味的晚餐,里面有一些菜。您的心理清单可能会从主要步骤开始:
因此,这些成为您的功能main()
然后,对于每个步骤,您将其进一步分解:(请注意,下面列出的子步骤是每个主要函数将从它们自己的函数定义中调用的内容)
然后对于每个子步骤,您仍然可以使事情更细粒度以表示单独的逻辑操作,main()
为简洁起见,我们将只检查前 2 个函数:
现在注意两件事:
在自上而下的方法中,您从高级设计开始。因此,您首先将您的想法提取到 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() 函数开始,然后根据您的调用顺序委托给程序中的其他函数。
自上而下的方法从高级系统或设计开始,然后进入低级系统或设计或开发。自上而下的方法首先关注整个系统或项目的抽象。最后,它侧重于细节设计或开发。在这种方法中,首先程序员必须为 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;
}
每个函数都做一些工作,可能还会调用其他函数,但是通过阅读 main,您可以了解程序的一般流程。“它获取一个图像文件路径,检查它是否是一个有效文件,读取其原始图像数据,将其写入输出文件,然后关闭它。”
真正的程序会比这个更复杂,但这只是意味着你有更多的函数应该以相同的方式读取,与程序的复杂性优点一样多的深度和广度。
自上而下的方法并不是严格意义上的功能和任务,它更像是算法世界的一种过度简化的方法。
通常,自上而下的方法是在介绍图灵理论和算法之后立即出现的主题,以让学生了解实际含义,并且它也是更复杂和进化的方法(例如涉及的方法)的更简单的替代方案数学+算法,这通常是大学和计算机科学课的东西。
您还可以注意到,谈到自上而下的方法时,没有任何语言出现,它是一个从任何语言或任何类型的实现中抽象出来的主题,它只是关于具有解决问题方法的通用步骤和算法。
关于 C++,用真正的通用术语来说,函数的作用main()
基本上是为应用程序启动主线程并管理argc
和argv
值。