自顶向下和自底向上编程

40
为什么我们说像C这样的语言是自上而下的,而像Java或C ++这样的OOP语言是自下而上的?这种分类在软件开发中有任何重要性吗?

1
好的。现在我理解了这些方法基本上与“思维方式”(范式)有更多的关系,而不是特定的编程语言。感谢大家的回答。 - buz
1
我们根本没有说过这样的话。你从哪里听来的?这是关于“编程风格”甚至是“分析”的问题,可以是自顶向下或自底向上的方式。但这个话题可以追溯到上世纪70年代。现在我们已经远远超越了那个阶段。关于“自顶向下”的错误观点早在几十年前就被揭穿了。 - user207421
10个回答

74
“自顶向下”方法将问题的高级定义细分为子问题,然后以递归方式进行处理,直到得到明显且易于编码的小块。这通常与“功能分解”编程风格相关,但不一定需要。
在“自底向上”编程中,您可以确定较低级别的工具,将它们合成为一个更大的程序。
实际上,几乎所有编程都是使用多种方法完成的。在面向对象编程中,通常通过识别领域对象(这是一种自顶向下的步骤),并对其进行完善,然后将其重新组合为最终程序-这是一个自底向上的步骤。

1
难怪我讨厌面向对象编程。自上而下的设计实践会导致意想不到的问题。 - Sridhar Sarnobat
2
@SridharSarnobat 抱歉迟到才看到这个评论。总的来说,面向对象编程也不应该从顶层开始练习。而且几乎所有的编程都需要反复修改和重构。这就是为什么弗雷德·布鲁克斯建议:“计划扔掉一个版本,因为你无论如何都会这样做。” - Charlie Martin

30
在自上而下的开发中,您首先从主要函数开始思考需要采取的主要步骤,然后将每个步骤分解为它们的子部分等。
在自下而上的编程中,您考虑基本功能和所需部件并逐步构建它们。您开发角色及其方法,然后将它们联系起来以形成一个连贯的整体。
面向对象编程自然倾向于自下而上,因为您可以开发您的对象,而过程式编程则倾向于自上而下,因为您始终从一个函数开始并逐渐添加到它。

7
我从未听说过“自上而下”和“自下而上”这样的术语,通常用于描述软件系统设计和实现的方法,并适用于任何语言或编程范例。在《On LISP》一书中,Paul Graham略微不同地使用了“自下而上”一词,意为不断将常见功能提取到共享函数中,以便创建新的、更高级别的LISP方言,让您能够按照应用程序域进行编程。这不是术语的常见用法,如今我们称之为“重构”和“特定领域嵌入式语言”(老LISP程序员会嗤之以鼻,认为LISP从上世纪50年代起就能够做到这一点)。

6
我从未听说过将该分类应用于特定语言,而是一种编程范式 - 您首先填写详细信息(即构建完整的实现方法),然后将它们组合在一起(例如从main()方法调用它们),还是从逻辑流程开始,然后充实实现?对于这两种类型的语言,您都可以执行任何一种方式...但我会说通常相反,在当前OOP语言中,您将首先定义接口,形成逻辑结构,仅在之后担心实现,而直接的过程化语言,如C,您需要在调用它们之前实际实现一些方法。

2
你说得完全正确。这个问题有一个错误的陈述。它们只是方法,可以独立于所使用的编程语言进行尊重和实现。随着现代软件的复杂性,这两种方法都被混合使用,很多开发人员甚至没有意识到这一点。你的答案必须被接受,因为它对初学者来说是直截了当的,不会让人感到困惑。 - Billal Begueradj

2

2
在自顶向下的方法中,系统首先被制定,开始时不详细说明任何子系统,然后每个系统及其子系统都被详细定义,直到基础确定为止。
例如,在C程序中,需要在程序顶部声明函数,然后通过主入口详细定义每个子系统/子程序。
在自底向上的方法中,首先从基本层面到抽象层面进行设计。
例如,在c++/java中,从编程特性的基本级别的类开始设计,然后进入程序的主要部分。

1
我相信编程中自上而下和自下而上两种方法的区别在于,自上而下的方法将问题分解成可管理的步骤,而自下而上的方法则是详细说明这些步骤。

1

这更多关乎范式(面向对象,命令式,函数式等),而非语法。

来自 dept-info.labri.fr

自下而上编程是自上而下编程的相反。它指的是一种编程风格,其中一个应用程序是从编程语言的现有原语开始构建的,逐渐构建越来越复杂的功能,直到整个应用程序被编写完为止。

在同一篇文章中:

在诸如 C 或 Java 的语言中,自下而上编程采取从语言的原语或现有抽象数据类型构建抽象数据类型的形式。


-1

大多数过程性或低级语言采用自上而下的方法,如C语言。同样,高级语言如java、c++等采用自下而上的方法。

在自上而下的方法中,所有系统或大型函数都被分解成小的子系统,而在自下而上的方法中,小的子系统被组合在一起开发一个大的最终系统。

例如,递归是自上而下的方法,而迭代是自下而上的方法。


-6

C是一种结构化语言,程序的顺序是从上往下的,从主方法开始。

而面向对象编程则依赖于类和对象数量。在OOP中,程序的流程不是自上而下的方式。


3
不可以。C语言没有方法。面向对象编程中,流程是向下的。自上而下是指设计而不是程序流程。简而言之,不行。 - rlbond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接