每日代碼 - 6/26 lambda表達式

public class CartViewRender {
    public static CartView renderMyCartView(Cart cart){
        ErrorCodeEnum errorCode = null;
        try {
            cart.source = CartSource.My_Cart;
            CartFlowProccess.proccessMyCart(cart);
        } catch (TradeBaseException e) {
            errorCode = e.getErrorCodeEnum();
        } catch(Exception e){
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return RenderViewHelper.renderMyCartView(cart, errorCode);
    }

    public static CartView renderMobileMyCartView(Cart cart){
        ErrorCodeEnum errorCode = null;
        try {
            CartFlowProccess.proccessMyCart(cart);
        } catch (TradeBaseException e) {
            errorCode = e.getErrorCodeEnum();
        } catch(Exception e){
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return RenderViewHelper.renderMyCartView(cart, errorCode);
    }

    public static CartView renderAddCartView(Cart cart){
        ErrorCodeEnum errorCode = null;
        try {
            cart.source = CartSource.Add_Cart;
            CartFlowProccess.proccessAddCart(cart);
        } catch (TradeBaseException e) {
            errorCode = e.getErrorCodeEnum();
        } catch(Exception e){
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return RenderViewHelper.renderAddCartView(cart, errorCode);
    }

    //...

}

 

這是一段典型的重複代碼示例,前兩個方法基本上是徹底重複的,最後一個方法則是很是的相似。先把前兩個方法改了,這個很是簡單。java

  public static CartView renderMyCartViewFromNoSource(Cart cart)
    {
        ErrorCodeEnum errorCode = null;
        try {
            CartFlowProccess.proccessMyCart(cart);
        } catch (TradeBaseException e) {
            errorCode = e.getErrorCodeEnum();
        } catch(Exception e){
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return RenderViewHelper.renderMyCartView(cart, errorCode);

    }
    public static CartView renderMyCartView(Cart cart){
        cart.source = CartSource.My_Cart;
        return renderMyCartViewFromNoSource(cart);
    }

    public static CartView renderMobileMyCartView(Cart cart){
       return renderMyCartViewFromNoSource(cart);
    }

 

 

比較麻煩的是最後一個方法如何消除重複,在.net的世界中有delegate和lambda表達式,這個問題會比較容易搞定,而java只能用匿名類了。ide

首先觀察第三個方法與前兩個方法的不一樣之處。其實只有兩行代碼不一樣,那麼咱們只要想辦法將它們抽取出來就能夠了。spa

先聲明兩個泛型接口,用於表示兩個變化點:.net

interface Action<T>
{
    void act(T t);
}

interface Func<T1,T2,T3>
{
    T3 execute(T1 t1,T2 t2);
}

 

而後使用這兩個接口建立一個通用方法。code

 

 public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func)
    {
        ErrorCodeEnum errorCode = null;
        Action<Cart> cartAction = null;

        try
        {
            action.act(cart);
        } catch (TradeBaseException e)
        {
            errorCode = e.getErrorCodeEnum();
        } catch (Exception e)
        {
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return func.execute(cart, errorCode);
    }

 

最後改寫最後一個方法的實現,因爲沒有lambda表達式,代碼看上去比較複雜些。blog

 public static CartView renderAddCartView(Cart cart)
    {
        cart.source=CartSource.Add_Cart;

        return renderCartView(cart, new Action<Cart>()
                {
                    @Override
                    public void act(Cart cart)
                    {
                        CartFlowProccess.proccessAddCart(cart);
                    }
                }, new Func<Cart, ErrorCodeEnum, CartView>()
                {
                    @Override
                    public CartView execute(Cart cart, ErrorCodeEnum errorCode)
                    {
                        return RenderViewHelper.renderAddCartView(cart, errorCode);
                    }
                }
        );
    }

 

若是你用了Intellj IDE,它會幫你自動作一些代碼格式化。Java8以後就能支持的更好了。接口

 

最後完整代碼以下:get

public class CartViewRender
{


    public static CartView renderCartView(Cart cart, Action<Cart> action, Func<Cart, ErrorCodeEnum, CartView> func)
    {
        ErrorCodeEnum errorCode = null;
        Action<Cart> cartAction = null;

        try
        {
            action.act(cart);
        } catch (TradeBaseException e)
        {
            errorCode = e.getErrorCodeEnum();
        } catch (Exception e)
        {
            errorCode = ErrorCodeEnum.Cart_Error_System;
        }
        return func.execute(cart, errorCode);
    }


    public static CartView renderMyCartViewFromNoSource(Cart cart)
    {
        return renderCartView(cart, new Action<Cart>()
                {
                    @Override
                    public void act(Cart cart)
                    {
                        CartFlowProccess.proccessMyCart(cart);
                    }
                }, new Func<Cart, ErrorCodeEnum, CartView>()
                {
                    @Override
                    public CartView execute(Cart cart, ErrorCodeEnum errorCode)
                    {
                        return RenderViewHelper.renderMyCartView(cart, errorCode);
                    }
                }
        );
    }

    public static CartView renderMyCartView(Cart cart)
    {
        cart.source = CartSource.My_Cart;
        return renderMyCartViewFromNoSource(cart);
    }

    public static CartView renderMobileMyCartView(Cart cart)
    {
        return renderMyCartViewFromNoSource(cart);
    }

    public static CartView renderAddCartView(Cart cart)
    {
        cart.source=CartSource.Add_Cart;

        return renderCartView(cart, new Action<Cart>()
                {
                    @Override
                    public void act(Cart cart)
                    {
                        CartFlowProccess.proccessAddCart(cart);
                    }
                }, new Func<Cart, ErrorCodeEnum, CartView>()
                {
                    @Override
                    public CartView execute(Cart cart, ErrorCodeEnum errorCode)
                    {
                        return RenderViewHelper.renderAddCartView(cart, errorCode);
                    }
                }
        );
    }

    //...

}
相關文章
相關標籤/搜索