之前的文章利用一等函数(First-class Function)的“可以将过程作为返回值”这一点来实现分步过程,本文介绍一种该性质极其相似另一种用途-获取未来的数据。
(注意:本文旨在介绍一种编程技巧,希望可以给读者一点启发,并非介绍某类问题的最优解,实际使用还需具体问题具体分析)
问题场景
平常在编写一个过程的时候,除了参数以外我们还可能使用一些局部变量/全局变量,例如:
public class Demo {
public String doSomething(int x) {
int y = 0;
for (int i = 1; i <= x; i++) {
y += i;
}
int z = getFromXXX();
for (int i = 1; i <= x; i++) {
z += i;
}
return z + ":" + y;
}
}
但是吧,有时候总会遇到一些特殊情况导致一些数据暂时取不到,例如上面程序中的z
,那么我们可能写成:
public class Demo {
int y = -1;
int x = -1;
public void doSomethingPart1(int x) {
this.x = x;
y = 0;
for (int i = 1; i <= x; i++) {
y += i;
}
}
public String doSomethingPart2(int z) {
for (int i = 1; i <= x; i++) {
z += i;
}
return z + ":" + y;
}
}
这段程序有以下问题:
doSomethingPart1
和doSomethingPart2
并没有强制指定先后执行,它们可以以任意顺序执行;- 引入额外的“全局”变量
x
和y
,随着功能增加,值可能被错误的修改更新;
这里我们的问题是z
暂时取不到/不知道怎么得到z
,但我们知道如何处理z
,那么我们假定未来可以取到z
,然后在那个时候再执行剩余的过程就行了。
获取未来数据的实现
“获取未来的数据”其实就是“把过程延迟到未来执行”:
public class FutureDataDemo {
public Function<Integer, String> doSomething(int x) {
int a = 0;
for (int i = 1; i <= x; i++) {
a += i;
}
int y = a;
return (Integer z) -> {
for (int i = 1; i <= x; i++) {
z += i;
}
return z + ":" + y;
};
}
}
这样既没有引入额外全局变量,也没有定义多个方法,且在表达上达到了和第一个示例中一样的连贯性。
(写在最后:如果内容和你预期的不同,那是我的问题:我是标题党。如果有所收获,那再好不过)