1.4.1.3 声明式函数动画

函数式编程能够以声明式风格编写库来解决存在的问题,我们已经看到用 LINQ 处理数据,用WPF 处理用户界面;但在函数式编程中,通常是创建库来解决自己的问域。

我们前面提到过,声明式风格可以不考虑实现的细节,遗漏了一些东西。函数式编程没有任何神秘的力量,能为我们实现困难的部分。设计我们自己的库时,需要实现所有的技术细节;只是实现的细节隐藏在库中(就像 LINQ 隐藏了所有的复杂性一样),这样,我们就能一劳永逸地解决普遍存在的问题。

在第十五章,我们将开发一个动画库,清单 1.6 以声明方式使用这个库创建动画。你不一定完全理解代码,只看一下使用声明式风格带来的好处。在某种意义上,它是类似于 WPF,它描述了动画应该怎么样,而不是如何使用计时器来绘制。

Listing 1.6 Creating functional animation (C#)

var greenCircle = Anims.Circle(

Time.Forever(Brushes.OliveDrab),100.0f.Forever());

var blueCircle = Anims.Circle(

Time.Forever(Brushes.SteelBlue),100.0f.Forever());

var movingPoint =Time.Wiggle * 100.0f.Forever();                                                       [1]

var greenMoving =greenCircle.Translate(movingPoint, 0.0f.Forever());                 [2]

var blueMoving =blueCircle.Translate(0.0f.Forever(), movingPoint);

var animation =Anims.Compose(greenMoving, blueMoving);                                  [3]

我们将在第十五章中详细解释具体内容。你可能已经猜到,这个动画创建两个椭圆:一个绿色的,一个蓝色的。以后,它使用 Translate 方法[2]改变动画中椭圆的位置,使用 Compose 方法[3]把两个椭圆组合成一个动画(用 animation 值表示)。在窗体上渲染此动画,就会得到图 1.1 所示的结果。

图 1.1 右侧的椭圆是从左到右移动,左边的椭圆是从上到下移动。

整个声明式的描述是基于动画值。有一个基本的动画值Time.Wiggle,其值在 -1 到 +1 之间波动;另一个基本构造x.Forever(),创建动画值,总有相同的值。如果把 Wiggle 乘以 100,就得到范围介于-100 到 +100 之间的动画值,这些动画值可以用于指定图形对象,比如两个椭圆的动画。图 1.1 显示了绿色的 X 坐标和蓝色的 Y 坐标值是大约 + 100 的状态。

在清单 1.6 中,我们不必知道任何表现动画值的内容,因为是通过用基本动画值的计算来描述整个动画的。从代码中还可以看到声明式风格的另一个方面,动画原则上是用一个表达式来描述的。为了使代码更具可读性,我们声明了几个局部变量,如果用变量的初始化代码来代替,也一样。

组合

声明式库的一个重要特点,就是能够以组合方式使用。在清单 1.6 所示的动画库中,就能看出来。我们可以用几个基元,如 Time.Wiggle 和 x.Forever() 就能生成多个动画值,如 movingPoint。同样,通过应用操作,如 Translate 或 Anim.Compose,可以把简单的动画图形对象组合起来,形成新的动画。另一个例子是使用 LINQ,可以把一个复杂查询的一部分提取出来,形成单独的查询,实现重用。我们可以构建自己的基元(假设绕行的轨道),并使用它们来构建动画(例如,太阳系)。

在前面,我们学习了声明式编程,这将是我们使用函数语言编程的主要方法。清单 1.6 显示这种风格如何用高级库函数来描述动画。在下一节,我们会将注意力转移到技术性更强,也更有意义的函数式特征:不可变性(immutability)。

1.4.1.3 声明式函数动画

时间: 2024-10-11 04:08:10

1.4.1.3 声明式函数动画的相关文章

一步步学WebSocket(1)声明式WebSocket

本节描述声明式WebSocket编程,可以与后一篇编程式WebSocket作对比学习: 首先上服务端: @ServerEndpoint("/chat") public class DeclarativeServer {     @OnOpen       public void onOpen(Session session) {           System.out.println("Somebody is coming!");      }          

spring声明式事务以及配置

使用spring提供的事务处理机制的好处是程序员可以不用关心事务的切面了,只要配置就好了,可以少写代码. spring声明式事务处理 spring 声明:针对的是程序员,程序员告诉spring容器,哪些方法需要事务,哪些方法不需要事务 事务处理   spring容器来做事务处理 目的:让spring管理事务,开发者不再关注事务 spring声明式事务处理的步骤: 1.搭建环境 2.把dao层和service层的接口和类写完 3.在spring的配置文件中,先导入dataSource 4.测试 5

Ext JS 5的声明式事件监听

原文:Declarative Listeners in Ext JS 5 在前文<在Ext JS 5使用ViewControllers>中,简单的介绍了Ext JS 5的一项重要改进--声明式事件监听.在本文,将深度探讨如何使用声明式事件监听啦简化应用程序的视图并减少自定义组件的样板代码. 注意:文章假设你使用的是Ext JS 5.0.1或更高版本. 什么是声明式事件监听? 所谓的"声明式事件监听",就是指定义在类主体中的监听或在实例的配置对象中使用了listeners配置

C#并行编程-PLINQ:声明式数据并行

原文:C#并行编程-PLINQ:声明式数据并行 背景 通过LINQ可以方便的查询并处理不同的数据源,使用Parallel LINQ (PLINQ)来充分获得并行化所带来的优势. PLINQ不仅实现了完整的LINQ操作符,而且还添加了一些用于执行并行的操作符,与对应的LINQ相比,通过PLINQ可以获得明显的加速,但是具体的加速效果还要取决于具体的场景,不过在并行化的情况下一段会加速. 如果一个查询涉及到大量的计算和内存密集型操作,而且顺序并不重要,那么加速会非常明显,然而,如果顺序很重要,那么加

Spring源码阅读:Spring声明式事务处理和编程式事务处理的设计与实现

之前的学习,了解了Spring事务管理的基础框架(查看).Spring在此基础上又提到了声明式事务管理和编程式事务管理.这里就来看看Spring是如何实现的. Spring声明式事务与EJB事务管理对比 Spring的声明式管理,类似于EJB的CMT,但又有不同.他们的不同之处有: 1)EJB的CMT是与JTA结合使用,而Spring框架的声明式事务管理可以在任何环境下工作.既可以使用全局事务管理,如JTA,也可以使用局部事务管理如JDBCJPA.Hibernate.JDO等. 2)可以在任何类

spring 声明式事务管理在真实的Service和单元测试时的回滚情况,需要注意的问题,jpa为例子

如何测试事务,测试事务回滚情况: 我做了大量的不同的测试: 场景1: Service层中使用注解@Transactional,注解@PersistenceContext     private EntityManager  emt; 写了两个方法 public void insertfail() //插入失败要回滚 { for(int i=0;i<20;i++) { User users=new User(); users.setEmail("[email protected]"

spring 声明式事务原理解读

在Spring中,声明式事务是通过事务属性(transaction attribute)来定义的.事务属性描述了事务策略如何应用到方法上.事务属性包含5个方面: 传播行为 隔离级别 是否只读 事务超时 回滚规则 尽管Spring提供了多种声明式事务的机制,但是所有的方式都依赖这五个参数来控制如何管理事务策略. (上述内容参考<Spring In Action>第三版). 对于声明式事务是使用Spring提供的tx配置命名空间.其中一些声明式事务配置元素依赖于部分Spring的AOP配置元素.

AngularJS应用开发思维之1:声明式界面

这篇博客之前承接上一篇:http://www.cnblogs.com/xuema/p/4335180.html 重写示例:模板.指令和视图 AngularJS最显著的特点是用静态的HTML文档,就可以生成具有动态行为的页面. 还是前面的小时钟示例,我们使用AngularJS模板来重写,示例已经嵌入→_→: 示例地址:http://www.hubwiz.com/course/54f3ba65e564e50cfccbad4b/ HTML文件看起来像普通的HTML,只是其中多了一些特别的标记 (比如:

1.4.3.2 使用 PLINQ 的声明式并行

声明式编程风格提供了另一种写并行程序的方法.我们知道,用声明式写代码,就是进行基元组成.在 LINQ 中,这些基元是查询运算符,比如 where 和 select.使用声明式风格,我们可以很容易替换基元的实现,PLINQ 就是这样做的:我们能够用并行的查询运算符替换标准查询运算符. 清单 1.9 是一个查询,更新虚拟游戏中的所有怪物,并删除上一步中死掉的怪物.[ 并行化的]改变非常简单,因此,我们可以用一个清单展示两个版本. Listing 1.9 Parallelizing data proc