通常,C语言使用自上而下的方法,而C ++使用自下而上的方法。是否有必要遵循这些方法?我可以在C中采用自下而上的方法吗?如果是这样......怎么样?
答案 0 :(得分:7)
如果它甚至是真的,这是关于C和C ++程序员的陈述,而不是关于语言的陈述。
可能的情况是,C ++程序员更有可能将他们的程序视为小型可重用组件的集合。然后他们倾向于自下而上的设计。
可能的情况是,C程序员更有可能将他们的程序视为一项重大任务,他们将这些任务细分为更小,更容易的任务。然后他们倾向于自上而下的设计。
或者可能没有这样的趋势。两种语言都不妨碍任何一种方法。例如,假设我想编写一些分析某些数据并打印报告的代码。这是C中自上而下的方法:
# first version of the code (doesn't compile)
raw_data = read_the_data();
processed_data = perform_the_analysis(raw_data);
report = prepare_report(processed_data);
puts(report);
对于自下而上的C方法,我可能会首先编写一些非常通用,可重用的代码来解析存储的数据格式,因为我知道我将要加载数据。同样地,我会编写一些代码,这些代码以各种方式对解析后的数据形式进行操作,这些代码通常在数据的性质上很有用。然后我会编写使用这些工具的代码来分析我的特定应用程序所需的数据,编写构建我想要的报告的代码,然后将它们全部拉出来。
在C ++中我会做同样的事情,在这两种情况下,除了我不会设计数据结构和操作它们的函数之外,我将设计将数据封装在一起的类以及相关的基本操作数据,然后是与这些类一起使用的非成员函数。
你可以用任何方式得到相当类似的代码。测试的另一个方面是测试 - 如果你自下而上构建,那么一旦你编写了任何代码,你就会编写一些有用的东西,你可以进行有用的测试。可以在没有任何组件的情况下测试自上而下的框架,使用合适的假组件,但我常常不确定测试的真实程度。
我不知道C ++程序员比C程序员更加或更少地担心要尽快采取一些具体措施。你所做的权衡是考虑大局而不是思考你现在可以在合理的工作中实现的东西,以及如何让两者相遇。还要考虑解决手头的问题,而不是考虑如何解决涉及问题涉及的问题的问题。那些不是语言问题。
答案 1 :(得分:1)
没有理由将自己限制在自上而下或自下而上的任何一种语言中。
在实践中,您结合了不同的方法,例如:
在结合所有不同方法时,还要考虑其他良好实践,例如设计模式。
答案 2 :(得分:1)
这些术语通常指的是设计而不是编码。一旦你创建了你的设计,你可以从底部,顶部或中间开始,如果你选择,或者在一个团队中,同时完成所有这些。实现方向本身的选择不应影响代码的性质。
自下而上将涉及定义可能在组成最终应用程序时有用的元素;这通常是创建特定于域的库代码时要执行的操作;您将在库中封装所有特定于域的知识,但任何特定应用程序可能只使用其中的一部分。如果您可能使用域实现多个项目,或者甚至将库本身作为产品进行销售,那么这样做很有效,但对于一次性使用则不那么有用,因为您最终可能会设计和实现从未使用过的组件。
即使采用自上而下的设计,您也希望自下而上实施,以便更高级别的组件具备所需的全部内容,以便使用已经过单元测试的组件进行即时集成测试。这只是意味着首先实现没有未定义依赖关系的组件,然后是依赖于那些组件的组件。要做到这一点,您仍然需要一个从上到下的设计,以便知道要实现什么。另一方面,在自顶向下的实现方法中,您可以自上而下地设计。在大型项目的实践中,您可能会在垂直切片(增量开发)中进行设计和实现,可以反复进行自顶向下或自底向上(或两者)。
也许您可以通过这种方式来思考这些方法:自下而上就像购买工具包,包括您可能永远不会使用或甚至不知道如何使用的工具。自上而下就像购买工具一样;它具有成本效益,但工具可能非常专业,而且只有在投资新工具之前,您才有能力完成类似于以前工作的工作;所以新工作需要更长时间。
答案 3 :(得分:0)
如果你愿意,可以用C语言进行客观编程,用很多结构和联合来制作很多函数和指向函数的指针。
自上而下和自下而上的方法是什么意思?