一段糟糕透顶的海鸥seagulls程序
鸟群合并conjoin则变成了一个更大的鸟群,繁殖breed则增加了鸟群的数量,增加的数量就是它们繁殖出来的海鸥的数量
//Flock 群 var Flock = function(n){ //海鸥seagulls this.seagulls = n; } //结队conjoin Flock.prototype.conjoin = function(other) { this.seagulls += other.seagulls; return this; }; //繁殖breed Flock.prototype.breed = function(other) { this.seagulls = this.seagulls * other.seagulls; return this; }; var flock_a = new Flock(4); //{ seagulls : 4 } var flock_b = new Flock(2); //{ seagulls : 2 } var flock_c = new Flock(0); //{ seagulls : 0 } //注意flock_a a群鸟在结对繁殖的过程中不断变化 var result = flock_a.conjoin(flock_c).breed(flock_b).conjoin(flock_a.breed(flock_b)).seagulls; //运行结果 ==>>32 而不是16
函数式写法对海鸥seagulls程序改写
//鸟群结队conjoin var conjoin = function(flock_x, flock_y){ return flock_x + flock_y; } //鸟群繁殖breed var breed = function(flock_x, flock_y){ return flock_x * flock_y; } //鸟群a var flock_a = 4; //鸟群b var flock_b = 2; //鸟群c var flock_c = 0; var result = conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b)); console.log(result); //==>16
缺点:函数嵌套conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b))既长又TMD臭,一眼看不出什么东东来!!!
但仔细一看,函数"conjoin"与"breed"方法无非做了“加法”与“乘法”的运算,将“加法”修改为“add”,“乘法”修改为“multiply”于是有如下代码
//鸟群结队conjoin var add = function(x, y){ return x + y; } //鸟群繁殖breed ['mʌltɪplaɪ] var multiply = function(x, y){ return x * y; } //鸟群a var flock_a = 4; //鸟群b var flock_b = 2; //鸟群c var flock_c = 0; var result = add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b)); console.log(result); //==>16
在改之前,看一些经典数学公式
// 结合律(assosiative) add(add(x, y), z) == add(x, add(y, z)); // 交换律(commutative) add(x, y) == add(y, x); // 同一律(identity) add(x, 0) == x; // 分配律(distributive) multiply(x, add(y,z)) == add(multiply(x, y), multiply(x, z));
应用上述公式简化海鸥程序
//原始代码 add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b)); //应用同一律 add(flock_a,flock_c) ==>> flock_a add(multiply(flock_a,flock_b), multiply(flock_a, flock_b));//(a*b)+(a*b) // 分配律(distributive (a*b)+(a*b) <<==>> b* (a+a) multiply(flock_b, add(flock_a, flock_a))
于是最终代码就很nice了
//鸟群结队conjoin var add = function(x, y){ return x+ y; } //鸟群繁殖breed ['mʌltɪplaɪ] var multiply = function(x, y){ return x* y; } //鸟群a var flock_a = 4; //鸟群b var flock_b = 2; //鸟群c var flock_c = 0; var result = multiply(flock_a, add(flock_b, flock_b)); console.log(result); //==>16
资料来源