考虑一个代码,我需要找到数组中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;
}
现在问题:
看起来选项3是最好的,但是很多时候我们发现一个函数调用另一个。选项2优于选项3有什么优势?
按照定义的方法应该做一个单一的任务/责任。但somefunction
正在做三件事。这些函数叫什么?
答案 0 :(得分:1)
首先,严格来说,我必须说Java没有功能,只有方法,因为它具有OO性质。
1)看起来选项3是最好的,但是很多次我们发现一个函数调用另一个。选项2优于选项3有什么优势?
正如您所说,sort
,sum
和square
方法每个都承担一项责任,因此无需使用单个怪物方法做三个。此外,每个方法都可以在其他方法中重复使用。
选项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
(不要过于拘泥于术语,恕我直言。)
希望这有帮助。