函数式编程感悟是声明式编程,与命令式编程相对,其典型应用为SQL语句。为了清晰描述这个问题,我作了以下的场景比较:算法
咱们知道SQL Server 由数据文件和检索引擎组成,当用户客户端须要检索一个学生,名字为tom时,怎将Sql语句“select id, name from student where name ='tom'”传递个检索引擎便可。咱们修改table student, 增长一个age字段,这时咱们检索age大于18的学生,则只需将sql语句“select id, name from student where age>18”传递给检索引擎便可。sql
假设咱们的学生信息不是存放在SQL Server中,而是存在一个文本文件中,咱们要手动开发一个学生信息检索引擎供客户端使用。express
当用户客户端须要检索一个学生,咱们在引擎中定义方法:编程
public List<Student>GetStudentByName(string name){分布式
//...函数式编程
}函数
而后客户端再调用;咱们修改 student, 增长一个age字段,这时咱们检索age大于18的学生,怎须要在引擎新加一个方法:spa
public List<Student>GetStudentGreaterAge(int age){索引
//...接口
}
比较两个事例,发现主要区别是,在引擎学生信息变化时,sql引擎没有变化,而咱们写的学生信息检索引擎的变化了,增长了一个接口。从而说明在应对变化是函数式编程更有优点。
下面咱们利用Lambda expression实现函数式编程引擎:
在引擎中定义以下方法:
public List<Student> GetStudents(Expression<Func<Student, Boolean>>){
//...
}
这样咱们能够将查询条件经过lambda表达式传递,屏蔽了查询接口的变化。
在这里我强调的是接口变化,而不是实现变化。也许有人会问,给student增长一个字段age后,那么方法GetStudents(Expression<Func<Student, Boolean>>)是须要改变来从文本中获取age字段的,这是确定的。但咱们也可由在不改变此方法来实现这一变化,及经过一点的规则将age动态解析到GetStudents(Expression<Func<Student, Boolean>>)方法中。
总结: