0

x考虑一个代码,我需要在其中找到数组中最大元素之和的平方。(这不是哪个数据结构的问题,所以请不要发布推荐堆等的回复)。

我最初对其进行编码:

选项1

singleFunction {
   // code to sort
   // code to sum
   // code to sqaure
   return;
}

很快,我意识到我可以利用辅助函数并将它们分解为函数。

选项 2

getFinalAnswer() {
   // sort;
   return sumAndSquare();
}

sumAndSqaure() {
   // sum
   return square();
}

square() {
   // return square.
}

现在我意识到排序、求和和平方可以用作utility methods而不是简单的helper方法。

现在我将功能分解为 3 个函数 (1) sort (2) sum x (3) square()

选项3

someFunction(int[] arr, int x) {
    sort(arr);   
    b = sumOfLastXElements(arr, x);
    c = sqaure(b);
    return c;
}

现在提问:

  1. 看起来选项 3 是最好的,但很多时候我们发现一个函数调用另一个函数。选项 2 比选项 3 有什么优势?

  2. 根据定义,方法应该执行单个任务/职责。但somefunction正在做 3 件不同的事情。这些函数叫什么?

4

2 回答 2

1

首先,严格来说,我必须说 Java 没有函数,只有方法,因为它的 OO 特性。

1) 看起来选项 3 是最好的,但很多时候我们发现一个函数调用另一个函数。选项 2 比选项 3 有什么优势?

正如您所说,sort,sumsquare方法各有一个责任,因此没有必要有一个单一的怪物方法来完成这三个。此外,每一个都可以稍后在其他方法中重复使用。

选项 2 有一种sumAndSquare方法,可能是可重用的,也可能是不可重用的。这在很大程度上取决于您的需求。如果您的代码中有很多这样的方法(我的意思是在不同的方法中至少有 10 次),那么您是否需要这种方法的事实会被注意到:

long theSum = sum(array);
long theSquare = square(theSum);

2)根据定义,方法应该执行单个任务/职责。但是 somefunction 正在做 3 件不同的事情。这些函数叫什么?

它的任务或责任是:

  • 对数字列表进行排序(我猜?)
  • 对大数求和
  • 应用square总和

因此,该方法正在按预期完成任务。IMO 您甚至可以将其拆分sumOfLastXElements为两种方法:int[] findLastXElements(array)long sum(array).

回答这个问题:这些函数叫什么?没有特定或特殊的名称,它们只是方法。但是从选项 1 到选项 3 的过程称为代码重构

于 2013-09-27T17:25:37.497 回答
0

回答你的第一个问题:

第二个有更多的开销,因为每个函数/方法都必须被实例化。选项 2 具有更大的灵活性,如果您要一直使用这些单独的部分,可能值得您花时间。但是,如果它们仅在代码中一起使用,请考虑将它们组合在一起。

正如我的一位睿智教授曾经说过的那样,将变化与保持不变分开。如果它们仅一起使用,则无需具有单独的方法/功能。

回答你的第二个问题:
方法和函数之间的区别

(不要太拘泥于术语,恕我直言。)

希望这可以帮助。

于 2013-09-27T17:24:41.013 回答