什么是功能分解?

时间:2009-06-03 23:45:50

标签: language-agnostic

功能分解,它有什么用处,有什么优点/缺点?哪些有关如何使用的实例?

5 个答案:

答案 0 :(得分:62)

功能分解是指采用复杂过程并将其分解为更小,更简单的部分的过程。

例如,考虑使用ATM。您可以将流程分解为:

  1. 走到ATM

  2. 插入银行卡

  3. 输入您的图钉

  4. 好吧......你明白了。

    您可以考虑以相同的方式编程。想想运行该ATM的软件:

    1. 读卡代码

    2. 个人识别码验证

    3. 转移处理

    4. 每一项都可以进一步细分。一旦到达子系统中分解最多的部分,就可以考虑如何开始编写这些部分。然后,您将这些小部件组成更大的整体。看看这篇维基百科文章:

      Decomposition (programming)

      功能分解的好处是,一旦开始编码,您就可以使用可以为您的应用程序使用的最简单的组件。因此,开发和测试这些组件变得更加容易(更不用说您能够更好地构建代码和项目以满足您的需求)。

      明显的缺点是时间投资。要在复杂系统上执行功能分解,在编码开始之前需要花费大量时间。

      就个人而言,我认为这段时间非常值得。

答案 1 :(得分:6)

它与WorkBreakDown Structures(WBS),mindMapping和自上而下的开发相同 - 基本上将一个大问题分解为更小,更易于理解的子部分。

赞成

  • 允许采用主动的编程方法(重新考虑代码的冲动)
  • 有助于识别项目的复杂和/或风险区域(在ATM示例中,安全性可能是更复杂的组件)
  • 帮助识别项目的所有组成部分 - 项目/代码失败的第一个原因(通过Capers Jones)缺少部分 - 直到项目后期才想到的事情(哎呀,我没有意识到我必须检查在发放$)之前,该人的余额
  • 允许组件解耦,以便更好地编程,共享代码和分配工作

缺点 - 在进行分解时没有真正的CONS,但是有一些常见的错误

  • 没有分解得足够远或分解到很远 - 每个人都需要确定快乐的细节水平,以便为他们提供对组件的洞察力而不会过度使用它(不要分解为代码的编程行。 。)
  • 未考虑预先存在的模式/代码模块(返工)
  • 未与客户一起审核以确保范围正确
  • 在实际编码时没有使用故障(比如设计房子而不是忘记计划,只是开始将一些电路板钉在一起)

答案 2 :(得分:3)

这是一个例子:你的C编译器。

首先是预处理器:它处理#include#define以及所有宏。你给它一个文件名和一些选项,它返回一个非常长的字符串。我们称这个函数为preprocess(filename)

然后是词法分析器。它需要一个字符串并将其分解为令牌。称之为lex(string)。解析器获取令牌并将其转换为树,称之为parse(tokens)。然后是一个将树转换为DAG块的函数,称之为dag(tree)。调用代码发射器emit(dag),它接受​​一个块的DAG并吐出汇编器。

然后编译器:

emit(dag(parse(lex(preprocess(filename)))));

我们将一个难以理解的大函数(compile函数)分解为一堆较小的,易于理解的函数。您不必将其作为管道执行,您可以将程序编写为:

process_data(parse_input(), parse_config())

这更典型;编译器是相当深入的程序,大多数程序比较广泛。

答案 3 :(得分:3)

功能分解是一种根据需要执行的任务而不是数据关系将复杂问题分解为更简单的问题的方法。这个术语通常与较旧的面向过程的设计有关。

A short description about the difference between procedure-oriented and object-oriented design.

答案 4 :(得分:2)

在创建功能需求文档之前,功能分解很有用。如果你需要软件,功能分解会回答“这个软件必须提供什么功能”的问题。需要分解来定义细粒度函数。 “我需要用于能效测量的软件”太笼统了。这就是为什么我们将其分解为更小的部分,直到我们清楚地理解系统需要提供的所有功能。这可以在以后用作系统完整性的核对表。

功能需求文档(FD)基本上是功能分解的文本表示。直接从FD编码可能适用于过程语言,但对于面向对象的解决方案来说,它不够好,因为它不能识别对象。对可用性规划和测试都没有好处。

我的意见是你应该花一些时间来创建一个FD,但不要太多时间使用它。请咨询每个了解您正在使用系统进行操作的人员,以找到所需的所有功能。

我在软件设计,开发和销售方面有很多经验,我使用功能分解作为开发的第一步。我用它作为合同的基础,所以客户知道他们会得到什么,我知道我必须提供什么。