应该何时调用另一个函数调用何时使用方法依赖注入

时间:2013-09-27 17:15:07

标签: java function methods module

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

我最初编写代码:

OPTION1

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

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

选项2

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

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

square() {
   // return square.
}

现在我意识到sort,sum和square可以用作utility methods而不是简单的helper方法。

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

OPTION3

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

现在问题:

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

  2. 按照定义的方法应该做一个单一的任务/责任。但somefunction正在做三件事。这些函数叫什么?

2 个答案:

答案 0 :(得分:1)

首先,严格来说,我必须说Java没有功能,只有方法,因为它具有OO性质。

  

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

正如您所说,sortsumsquare方法每个都承担一项责任,因此无需使用单个怪物方法做三个。此外,每个方法都可以在其他方法中重复使用。

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

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

2)按定义的方法应该做一个单一的任务/责任。但有些功能正在做三件事。这些函数叫做什么?

它的任务或责任是:

  • 排序一个数字列表(我猜?)
  • 总和数字
  • 应用总和的square

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

要回答这个问题:这些函数叫什么?没有特定的名称,也没有特殊名称,它们只是方法。 从选项1转到选项3的过程称为Code Refactoring

答案 1 :(得分:0)

回答你的第一个问题:

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

作为我的一位聪明的教授曾经说过,将什么变化与保持不变的东西分开。 如果它们只是一起使用,则不需要单独的方法/功能。

回答你的第二个问题:
Difference between a method and a function

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

希望这有帮助。