我喜欢以功能风格编程。但是我发现将函数作为参数传递有时可以在组件之间创建比使用非函数参数传递创建的更强的耦合。
例如,在下面的(人为的)示例中:A,B和C通过C函数参数的输出类型,C的int参数的类型,以及C&#39函数参数的arity和输入类型。如果A想要将其功能更改为BiFunction,则B和C必须都改变。
public class Functional {
public void A() {
C(i -> String.valueOf(i + 2), 123);
}
public void B() {
C(i -> String.valueOf(i + 1), 123);
}
private String C(Function<Integer, String> f, int a) {
int len = String.valueOf(a).length();
return f.apply(len);
}
}
将此与A和B预先计算函数结果的示例进行对比,然后将String结果和第二个int参数传递给C.这里A,B和C只耦合在两个地方 - 两个C的参数。计算第一个参数的函数可以自由改变。
显然传递函数有它的位置,但是当事情变得更复杂时,似乎这种问题会复合并创建严格的代码。我很乐意听到您用来决定何时以这种方式进行耦合的经验法则与否。
答案 0 :(得分:3)
在您的示例中,我建议遵循Single Responsibility
的原则将出于同样原因改变的事情聚集在一起。 将那些因不同原因而改变的事物分开。
因此,选择以何种方式将A,B与C结合起来取决于他们为什么要改变。
您的示例中出现的另一个原则是Rule of least power
在您的简化示例中,考虑到解决方案的选择,选择能够解决问题的功能最弱的解决方案
函数C
不需要函数作为参数。该功能可以在A
,B
方面调用。
答案 1 :(得分:2)
如果你用一个函数参数替换一个简单的值,你就会做一些严重的错误。函数应该只用更严格的耦合替换某些东西,通常是特定于应用程序的Interface
。