WEB开发网
开发学院软件开发Java 实战 Groovy: 用 curry 过的闭包进行函数式编程 阅读

实战 Groovy: 用 curry 过的闭包进行函数式编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 用闭包进行测试在结束之前,我们来看一下 Groovy 闭包的一个附加用途,实战 Groovy: 用 curry 过的闭包进行函数式编程(10),请考虑一个被建模为具有许多 Employee 的 Company 的应用程序,递归的关系在单个 Employee(团队领导)和许多 Employee(团

用闭包进行测试

在结束之前,我们来看一下 Groovy 闭包的一个附加用途。请考虑一个被建模为具有许多 Employee 的 Company 的应用程序。递归的关系在单个 Employee(团队领导)和许多 Employee(团队成员)之间进一步建立起一对多的聚合。图 1 是这样一个组织的类图。


图 1. Company 应用程序
实战 Groovy: 用 curry 过的闭包进行函数式编程

可以用闭包来表述模型架构上的完整性。例如,在这个例子中,可能想确保每个员工都分配了一个经理。简单的闭包 hasManager 为每个员工表达了这个需求: def hasManager = { employee -> return (employee.manager != null) }。

来自清单 6 的 Functor 类中的 forAll 闭包的局部应用程序能够描述架构的需求:def everyEmployeeHasManager = Functor.forAll.curry(hasManager)。

清单 11 演示了 curry 过的闭包的应用:测试系统架构的完整性。


清单 11. 用于测试架构完整性的闭包
import fp.* 
/** 
 * A company with any number of employees. 
 * Each employee is responsible 
 * to a team leader who, in turn, manages a team of staff. 
 */ 
import java.util.* 
class Employee { 
 @Property id 
  @Property name 
  @Property staff = [ : ] 
  @Property manager = null 
  String toString() { 
    return "Employee: ${id} ${name}" 
  } 
   
  def addToTeam(employee) { 
    staff[employee.id] = employee 
    employee.manager = this 
  } 
 
} 
class Company { 
 @Property name 
  @Property employees = [ : ] 
  def hireEmployee(employee) { 
    employees[employee.id] = employee 
  } 
   
  def displayStaff() { 
    println "Company: ${name}" 
    println "====================" 
    employees.each { entry -> println "   
     ${entry.value}" } 
  } 
   
   
} 
def co = new Company(name : 'Napier') 
def emp1 = new Employee(id : 123, name : 'KenB') 
def emp2 = new Employee(id : 456, name : 'JohnS') 
def emp3 = new Employee(id : 789, name : 'JonK') 
co.hireEmployee(emp1) 
co.hireEmployee(emp2) 
co.hireEmployee(emp3) 
emp3.addToTeam(emp1) 
emp3.addToTeam(emp2) 
co.displayStaff() 
// Architectural closures 
def hasManager = { employee -> return (employee.manager != null) } 
def everyEmployeeHasManager = Functor.forAll.curry(hasManager) 
def staff = new ArrayList(co.employees.values()) 
println "Every employee has a manager?: 
 ${everyEmployeeHasManager.call(staff)}"  // false 

curry 是优秀的

在本文中您已看到了大量闭包,但是希望能激起您对更多闭包的渴望。在学习乘法例子时,curry 过的闭包使得实现计算的函数模式出奇得容易。一旦掌握了这些模式,就可以把它们部署到常见的企业场景中,例如我们在书店例子中把它们应用于业务规则。把闭包应用于函数模式是令人兴奋的,一旦这么做了之后,再把它们应用于面向对象设计模式,就不是什么大事情了。Curry 过的闭包可以用来模拟 Visitor 模式的基本元素,正如在 Library 例子中显示的。它们在软件测试期间执行完整性测试时也会有用,就像用 Company 例子所展示的。

本文中看到的全部例子都是企业系统常见的用例。看到 Groovy 闭包和 curry 方法能够如此流畅地应用于众多编程场景、函数模式和面向对象模式,真是激动人心。Haskell Curry 肯定发现了这个可怕的 groovy!

上一页  5 6 7 8 9 10 

Tags:实战 Groovy curry

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接