什么是功能分解?

36

功能分解,它有什么用处以及其利弊如何?在哪里有一些使用它的实例?


11
我之所以问这个问题,是因为在SO上还没有答案,并且在http://stackoverflow.com/questions/250044/design-pattern-or-code-smell-denormalised-data-as-a-result-of-functional-decompo/250132#250132上有一些对FD作为设计方法的批评。 - Rob Kam
23
在 Stack Overflow 上,哪里写明了除非在谷歌上搜索结果很少,否则不应该提出问题? - Rob Kam
5个回答

61

功能分解是将复杂的过程分解成更小、更简单的部分的过程。

例如,想象一下使用自动取款机。您可以将该过程分解为以下步骤:

  1. 走到自动取款机前

  2. 插入银行卡

  3. 输入密码

你懂的。

您可以将编程视为同样的方式。想象一下运行自动取款机的软件:

  1. 读取银行卡的代码

  2. 密码验证

  3. 转账处理

每个部分都可以进一步细分。一旦您已经达到了子系统最细致的部分,您就可以考虑如何开始编写这些部分。然后将这些小部分组合成整体。请查看此维基百科文章:

分解(计算机科学)

功能分解的好处在于,一旦开始编码,您正在处理应用程序中可能的最简单的组件。因此,开发和测试这些组件变得更加容易(更不用说您能够更好地设计您的代码和项目以适应您的需求)。

明显的缺点是时间投入。在编码开始之前,对复杂系统进行功能分解需要更多的时间。

个人认为这段时间非常值得。


我想补充一点,函数分解不仅用于将进程分解为其功能,还可用于将整个系统分解为其较小的功能。当正确使用时,函数分解可以是指定系统范围和功能、在不同利益相关者之间进行沟通和达成协议的最快方法之一。通常人们被教导使用类似于WBS的图表,但根据我的经验,分层符号列表同样有效,并且更容易快速起草和编辑。 - CShark

6

这与工作分解结构(WBS),思维导图和自上而下的开发相同,基本上是将一个大问题分解为更小、更易理解的子部分。

优点

  • 允许对编程采取主动的方法(抵制冲动编码)
  • 帮助识别项目中复杂和/或风险较高的区域(在 ATM 示例中,安全性可能是较为复杂的组件)
  • 帮助识别项目的所有组件-项目/代码失败的主要原因(通过 Capers Jones)是缺少某些部分- 直到项目后期才想到的事情(哎呀,我没意识到在发放 $ 前必须检查人的余额)
  • 允许解耦组件以进行更好的编程、共享代码和分配工作

缺点 - 分解没有真正的缺点,但有一些常见的错误

  • 没有分解到足够小的层次,或者分解得过多-每个人都需要确定所需详细了解组件的程度,而不会过度分解(不要将其分解成编程行...)
  • 没有考虑到预先存在的模式/代码模块(重新工作)
  • 没有与客户审核以确保范围正确
  • 在实际编码时未使用分解(就像设计房子然后忘记计划,只开始钉一些木板)

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

2
功能分解有助于在创建功能需求文档之前进行。如果您需要软件来完成某些任务,功能分解可以回答“这个软件必须提供哪些功能”的问题。分解是为了定义细粒度的功能。"我需要软件来测量能源效率"太笼统了。这就是为什么我们要将其分解成更小的部分,直到我们清楚地了解系统需要提供的所有功能。这可以作为检查系统完整性的清单。
功能需求文档(FD)基本上是功能分解的文本表示。从FD直接编码可能对过程化语言来说还可以,但对于面向对象的解决方案来说不够好,因为它没有识别对象。对于可用性规划和测试也不好。
我的观点是,您应该花一些时间创建FD,但不要使用太多时间。咨询每个了解正在跟踪您的系统的流程的人,以找到所需的所有功能。
我在软件设计、开发和销售方面有很多经验,并将功能分解用作开发的第一步。我将其用作合同的基础,以便客户知道他们将得到什么,而我知道我必须提供什么。

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