欢迎来到天天文库
浏览记录
ID:34781248
大小:56.50 KB
页数:6页
时间:2019-03-10
《游戏开发:每个人都应该懂点函数式编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一个问题 假设现在我们需要开发一个绘制数学函数平面图像(一元)的工具库,可以提供绘制各种函数图形的功能,比如直线f(x)=ax+b、抛物线f(x)=ax²+bx+c或者三角函数f(x)=asinx+b等等。那么怎么设计公开接口呢?由于每种行数的系数(a、b、c等)不同,并且函数构造也不同。正常情况下我们很难提供一个统一的接口。所以会出现类似下面这样的公开方法://绘制直线函数图像publicvoidDrawLine(doublea,doubleb){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1
2、){PointFp=newPointF(x,a*x+b);points.Add(p);}//将points点连接起来}//绘制抛物线图像publicvoidDrawParabola(doublea,doubleb,doublec){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1){PointFp=newPointF(x,a*Math.Pow(x,2)+b*x+c);points.Add(p);}//将points点连接起来}...DrawLine(3,4);//绘制直线DrawParabola(1
3、,2,3);//绘制抛物线 如果像上面这种方式着手的话,绘制N种不同函数就需要定义N个接口。很明显不可能这样去做。 (注,如果采用虚方法的方式,要绘制N种不同函数图像就需要定义N个类,每个类中都需要重写生成points的算法) 如果我们换一种方式去思考,既然是给函数绘制图像,为什么要将它们的系数作为参数传递而不直接将函数作为参数传给接口呢?是的,没错,要绘制什么函数图像,那么我们直接将该函数作为参数传递给接口。由于C#中委托就是对方法(函数,这里姑且不讨论两者的区别)的一个封装,那么C#中使用委托实现如下:publicdelegatedoubleFunction2BeDraw
4、ed(doublex);//绘制函数图像publicvoidDrawFunction(Function2BeDrawedfunc){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1){PointFp=newPointF(x,func(x));points.Add(p);}//将points点连接起来}...Function2BeDrawedfunc=(Function2BeDrawed)((x)=>{return3*x+4;});//创建直线函数DrawFunction(func);//绘制系数为3
5、、4的直线Function2BeDrawedfunc2=(Function2BeDrawed)((x)=>{return1*Math.Pow(x,2)+2*x+3;});//创建抛物线函数DrawFunction(func2);//绘制系数为1、2、3的抛物线Function2BeDrawedfunc3=(Function2BeDrawed)((x)=>{return3*Math.Sin(x)+4;});//创建正弦函数DrawFunction(func3);//绘制系数为3、4的正弦函数图像 如上。将函数(委托封装)作为参数直接传递给接口,那么接口就可以统一。至于到底绘制的是什
6、么函数,完全由我们在接口外部自己确定。 将函数看作和普通类型一样,可以对它赋值、存储、作为参数传递甚至作为返回值返回,这种思想是函数式编程中最重要的宗旨之一。 注:上面代码中,如果觉得创建委托对象的代码比较繁杂,我们可以自己再定义一个函数接收a、b两个参数,返回一个直线函数,这样一来,创建委托的代码就不用重复编写。 函数式编程中的函数 在函数式编程中,我们将函数也当作一种类型,和其他普通类型(int,string)一样,函数类型可以赋值、存储、作为参数传递甚至可以作为另外一个函数的返回值。下面分别以C#和F#为例简要说明: 注:F#是.NET平台中的一种以函数式编程范式为
7、侧重点的编程语言。举例中的代码非常简单,没学过F#的人也能轻松看懂。F#入门看这里: 定义: 在C#中,我们定义一个整型变量如下: intx=1; 在F#中,我们定义一个函数如下: letfuncxy=x+y 赋值: 在C#中,我们将一个整型变量赋值给另外一个变量: intx=1; inty=x; 在F#中,我们照样可以将函数赋值给一个变量: letfunc=funxy->x+y//lambda表达式 letfunc2=func 存储: 在
此文档下载收益归作者所有