自顶向下和自底向上编程

Posted

技术标签:

【中文标题】自顶向下和自底向上编程【英文标题】:Top down and Bottom up programming 【发布时间】:2009-05-19 05:14:08 【问题描述】:

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

【问题讨论】:

OK。所以现在我明白这些方法基本上与“思维方式”(范式)有关,而不是特定语言。谢谢大家的回答。 【参考方案1】:

“自上而下”的方法对问题进行高级定义并将其细分为子问题,然后您递归地执行这些子问题,直到得到明显且易于编码的部分。这通常与编程的“功能分解”风格相关,但并非必须如此。

在“自下而上”编程中,您可以确定可以组合成更大程序的较低级别的工具。

实际上,几乎所有编程都是通过多种方法组合完成的。在面向对象编程中,您通常通过识别领域对象(这是一个自上而下的步骤)并细化这些对象来细分问题,然后将它们重新组合到最终的程序中——自下而上的步骤。

【讨论】:

难怪我讨厌 OO。自上而下的设计在实践中会导致无法预料的问题。 @SridharSarnobat 很抱歉花了这么长时间才发现这条评论。现在,也就是说,一般来说,无论如何都不应该自上而下地练习 OO。几乎所有的编程都将涉及返回和返工。这就是为什么 Fred ***s 建议“计划扔掉一个。无论如何你都会的。”【参考方案2】:

在自顶向下开发中,您从主要功能开始,然后考虑需要采取的主要步骤,然后将这些步骤中的每一个分解为子部分,依此类推。

在自下而上编程中,您会考虑基本功能和您将需要的部分并构建它们。您开发演员和他们的方法,然后将它们联系在一起以形成一个连贯的整体。

当您开发对象时,OOP 自然倾向于自下而上,而当您从一个功能开始并慢慢添加时,过程编程倾向于自顶向下。

【讨论】:

【参考方案3】:

我从未听说过以这种方式使用“自上而下”和“自下而上”的术语。

这些术语通常用于描述一种方法如何设计和实现软件系统,因此适用于任何语言或编程范式。

在“On LISP”中,Paul Graham 使用术语“自下而上”略有不同,表示不断将常用功能提取到共享函数中,以便最终创建一种新的、更高级别的 LISP 方言,让您可以按照以下方式进行编程您的应用程序域。这不是该术语的常见用法。如今,我们将其称为“重构”和“特定领域的嵌入式语言”(老 LISP 程序员会嘲笑 LISP 自 1950 年代以来就能够做到这一点)。

【讨论】:

【参考方案4】:

我从来没有听说过这种分类适用于特定的语言,而是一种编程范式 - 您是否首先填写详细信息(即构建完整的实现方法)然后将它们放在一起(例如从它们中调用它们 main() 方法),还是从逻辑流程开始,然后充实实现?

你真的可以用两种类型的语言来做......但我想说这通常是相反的,在当前的 OOP 语言中,你将首先定义接口,形成逻辑结构,然后才担心实现,而像 C 这样的直接过程语言,您需要在调用它们之前实际实现一些方法。

【讨论】:

你是绝对正确的。这个问题有一个错误的陈述。它们只是可以独立于使用的编程语言来尊重和实施的方法。由于现代软件的复杂性,这两种方法是混合使用的,许多开发人员甚至在没有意识到的情况下同时使用它们。您的答案必须是被接受的答案,因为它简单明了,不会让初学者感到困惑。【参考方案5】:

这个***页面解释得很好http://en.wikipedia.org/wiki/Top-down#Programming

【讨论】:

【参考方案6】:

在自上而下的方法中,首先制定系统,但在开始时不详细说明任何子系统,然后详细定义每个系统及其子系统,直到将其指定到基础。

e.g.- 在 C 程序中,需要在程序顶部声明函数,然后通过主入口对每个子系统/子例程进行详细定义。

在自下而上的先设计方法中,从基础层开始到抽象层完成。

例如-在c++/java中,从编程特性的基础级别开始从类开始设计,然后进入程序的主体部分。

【讨论】:

【参考方案7】:

更多的是关于范式(面向对象、命令式、函数式等)而不是语法。

来自dept-info.labri.fr

自下而上的编程与自上而下的编程相反。它 指一种构建应用程序的编程风格 从编程语言的现有原语开始,以及 逐渐构建越来越复杂的特征,直到 所有应用程序都已编写完毕。

稍后在同一篇文章中:

在诸如 C 或 Java 之类的语言中,自底向上编程的形式是 从语言的原语构造抽象数据类型或 来自现有的抽象数据类型。

【讨论】:

【参考方案8】:

我确实认为自上而下的方法和自下而上的编程方法之间的区别在于,自上而下的方法将问题分解为可管理的步骤,而自下而上的方法实际上是对这些步骤的详细说明。

【讨论】:

【参考方案9】:

大多数过程或低级语言遵循 C 语言等自上而下的方法。类似地,java、c++ 等高级语言遵循自下而上的方法。

在自顶向下的方法中,所有系统或大功能被分解成小子系统,而在自底向上的方法中,小子系统组合在一起形成一个大的和最终的系统。

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

【讨论】:

【参考方案10】:

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

而 OOP 取决于类和对象的数量。 OOP 中的程序流程不是自顶向下的方法

【讨论】:

C 没有方法。在 OOP 中流量向下。自上而下是指设计,而不是程序流程。简而言之,没有。

以上是关于自顶向下和自底向上编程的主要内容,如果未能解决你的问题,请参考以下文章

自顶向下归并排序和自底向上的归并排序

干货好文!自底向上——知识图谱构建技术初探

自底向上的归并排序算法

算法——归并排序(自顶向下自底向上)

动态规划-自底向上的 0-1 背包问题

集成测试的中庸之道