通过不直接处理它的中间方法传递相同的变量
Passing the same variable through intermediate methods which don't directly process it
我经常发现自己将一个变量传递到一个方法中,在这个方法中它没有被直接使用,而是传递给另一个方法进行进一步处理。我也不知道这种做法是否有名称。我可以用示例代码更好地解释它:
static void main() {
int a = method1(var1, var2, var3)
}
int method1(int var1, int var2, int var3) {
var4 = some_function_of(var1, var2)
return method2(var3, var4)
}
int method2(int var 3, int var4) {
return some_other_function_of(var3, var4)
}
这种情况可以扩展,其中相同的变量 (var3) 通过甚至更长的方法链传递。我认为这可能是一种不好的做法,因为在我的示例中 method1 是某种不操纵 var3 的中间体。在性能、设计 and/or 可读性方面是否有更好的做法?
至少对于面向对象的语言,答案是:
- 您肯定希望避免此类代码 - 因为您努力将参数列表减少到绝对最小值;目标是 零.
- 如果您发现您的 class 应该提供各种方法,这些方法都需要 "same" 参数;而不是使该参数成为您 class 中的一个字段的候选者。
在非 OO 语言中,我认为您必须在具有 更多 函数和 参数列表长度 之间务实地取得平衡。在您的示例中,
static void main() {
int var4 = some_function_of(var1, var2)
int a = method2(var3, var4)
}
避免使用 method1 ... 可以避免将 var3 传递给第一个方法。而且你还在"single layer of abstraction"原则的规则之内。
这并不少见,也不一定是坏习惯。它可能会影响您提到的所有三个指标:
性能:向函数调用添加另一个参数可能会导致性能下降,但并非总是如此。这取决于语言、compiler/interpreter 和平台。例如,C++ 的优化编译器将尽量避免复制变量,即使它是按值传递的(有时它会完全消除函数调用)。但是通过多个函数传递一个值 可能 如果编译器不能很好地遵循路径,就会搞乱编译器的优化。不过,我希望由此对性能造成的影响很小。
设计:根据您的语言范式(面向对象、函数式等...),这可能表明您的设计可以改进,也许可以通过将数据封装在结构中或 class 以便只传递一个参数(一个 class 实例指针)并且每个函数只访问它需要的 class 成员。
可读性:这不应该使单个函数更难阅读,因为它们不应该关心参数来自哪里,而且很明显参数正在传递给另一个函数。不过,这可能会使理解整个程序变得更加困难,因为如果值在被触及之前通过一长串调用传递,则很难跟踪值的来源。
一般来说,最好尽量减少参数列表(出于所有这些原因)并将数据 "closer" 保留给需要它的代码。如果你做了那些事情,这种情况应该不会弹出太多,当它出现时,不太可能是由于设计不当造成的。
我经常发现自己将一个变量传递到一个方法中,在这个方法中它没有被直接使用,而是传递给另一个方法进行进一步处理。我也不知道这种做法是否有名称。我可以用示例代码更好地解释它:
static void main() {
int a = method1(var1, var2, var3)
}
int method1(int var1, int var2, int var3) {
var4 = some_function_of(var1, var2)
return method2(var3, var4)
}
int method2(int var 3, int var4) {
return some_other_function_of(var3, var4)
}
这种情况可以扩展,其中相同的变量 (var3) 通过甚至更长的方法链传递。我认为这可能是一种不好的做法,因为在我的示例中 method1 是某种不操纵 var3 的中间体。在性能、设计 and/or 可读性方面是否有更好的做法?
至少对于面向对象的语言,答案是:
- 您肯定希望避免此类代码 - 因为您努力将参数列表减少到绝对最小值;目标是 零.
- 如果您发现您的 class 应该提供各种方法,这些方法都需要 "same" 参数;而不是使该参数成为您 class 中的一个字段的候选者。
在非 OO 语言中,我认为您必须在具有 更多 函数和 参数列表长度 之间务实地取得平衡。在您的示例中,
static void main() {
int var4 = some_function_of(var1, var2)
int a = method2(var3, var4)
}
避免使用 method1 ... 可以避免将 var3 传递给第一个方法。而且你还在"single layer of abstraction"原则的规则之内。
这并不少见,也不一定是坏习惯。它可能会影响您提到的所有三个指标:
性能:向函数调用添加另一个参数可能会导致性能下降,但并非总是如此。这取决于语言、compiler/interpreter 和平台。例如,C++ 的优化编译器将尽量避免复制变量,即使它是按值传递的(有时它会完全消除函数调用)。但是通过多个函数传递一个值 可能 如果编译器不能很好地遵循路径,就会搞乱编译器的优化。不过,我希望由此对性能造成的影响很小。
设计:根据您的语言范式(面向对象、函数式等...),这可能表明您的设计可以改进,也许可以通过将数据封装在结构中或 class 以便只传递一个参数(一个 class 实例指针)并且每个函数只访问它需要的 class 成员。
可读性:这不应该使单个函数更难阅读,因为它们不应该关心参数来自哪里,而且很明显参数正在传递给另一个函数。不过,这可能会使理解整个程序变得更加困难,因为如果值在被触及之前通过一长串调用传递,则很难跟踪值的来源。
一般来说,最好尽量减少参数列表(出于所有这些原因)并将数据 "closer" 保留给需要它的代码。如果你做了那些事情,这种情况应该不会弹出太多,当它出现时,不太可能是由于设计不当造成的。