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逻辑,拆分为若干个方法,再顺序调用。

posted @ 2022-01-08 20:13  老胡Andy  阅读(108)  评论(0编辑  收藏  举报