4

本网站所述,

具有(仅)程序凝聚力的模块是支持不同且可能不相关的活动的模块,其中控制从一个活动传递到下一个活动。Page-Jones 给出了一个模块示例(其名称可能类似于“准备假日餐:”

  • 清洁前一餐的餐具
  • 准备烤火鸡
  • 打电话
  • 洗澡
  • 切菜
  • 设置表

现在我的问题是,如果这些活动中的每一个,即打电话,都被提取到它们自己的方法中,但仍然以相同的顺序调用,即

    private void PrepareForHolidayMeal()
    {
    CleanUtensilsfromPreviousMeal();
    PrepareTurkeyforRoasting();
    ...
    SetTable();
    }

这种方法仍然是程序凝聚力的一个例子吗?或者它是否在功能上具有凝聚力,因为它支持执行一项与问题相关的任务的活动,在这种情况下是准备一顿饭?

4

2 回答 2

1

这是一个非常有趣的问题,是的,答案是相对的,取决于我们理解事物的方式 [写在文章中] 以及它们如何与作者的意思相对应。

特别是在程序凝聚力和功能凝聚力之间,存在细微差别:程序凝聚力是包含彼此无关的步骤的东西,即程序没有“目标”,这是可重复的,需要“固定定义”和重复使用。然而,功能内聚基本上是一种功能(可能接受输入并给出输出),它可以用于不同的输入,并且在重用时会产生正确的输出(取决于输入)。

结论,根据您的问题:不,将每个方法放在单独的方法中并以相同的顺序调用它们不会将其从过程更改为功能,除非您的过程成为一个真正具有某些“目标”的函数。

于 2012-11-26T16:57:12.530 回答
1

有充分的理由在您的示例中省略了电话。这是不相关的任务之一。如果您假设电话仍在“...”中,那么整个事情将再次失去凝聚力。否则,您可能会争辩说所有其他活动都是准备一顿饭所必需的。这可能会引发讨论“CleanUtensilsfromPreviousMeal”是否在此处实际上有效,因为此活动可能仅在之前没有清理的情况下是必需的。StackExchange 问题不适合这样的讨论......所以我们需要一个更清晰的例子来让多个软件架构师达成一致的决定。否则,有些人的争论可能与其他人不同。

于 2012-10-17T18:07:10.447 回答