1. 程式人生 > 其它 >C#函數語言程式設計示例(二)

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邏輯,拆分為若干個方法,再順序呼叫。