C#函数式编程示例(二)
前一篇介绍了C#函数式的基础 - delegate, Func, Action等。 这里在前一篇的基础上再做些扩展。
项目中经常能看到如下的代码:
if(prod.stock)
{
prod.quantity++;
}
if(prod.quantity > 10)
{
//do something
}
if(prod.quantity > 100)
{
//do something
}
重复的if语句,难以阅读,不能复用。 让我们使用FP的思想、基于上一篇改造这段代码:
定义SetValue和pipe代理,分别定义通用方法和顺序操作函数。
delegate void SetValue<T>(T t);
delegate void Pipe<T>(params SetValue<T>[] t);
接下来在实现中定义若干个具体的SetValue实现
SetValue<Product> setProdQty = (p) => p.quantity = 100;
SetValue<Product> setProdStock = (p) => p.stock = true;
SetValue<Product> setProdCnt = (p) => p.count = 5;
再实现pipe方法,并调用该方法,传入SetXXX作为参数
Pipe<Product> pipe = (setFuncs) => {
setFuncs.ToList().ForEach(func=>func(prod));
};
pipe(setProdQty, setProdStock, setProdCnt);
目前SetXXX的值依赖全局,最后再改进一下,代码如下:
这里的T t作为值,给到SetValue使用
delegate void PipeValue<T>(T t, params SetValue<T>[] func);
调用时传入prod,供SetXXX使用。
PipeValue<Product> pipe2 = (prodValue, setFuncs) => {
setFuncs.ToList().ForEach(func=>func(prodValue));
};
pipe2(prod, setProdQty, setProdStock, setProdCnt);
至此,我们把原先的一大段if逻辑,拆分为若干个方法,再顺序调用。