1. 程式人生 > >使用委託把方法寫得更容易維護

使用委託把方法寫得更容易維護

一、背景介紹

最近在做的專案中使用了CefSharp的ChromiumWebBrowser,需要執行JavaScript程式碼,由於頁面可能會有多個iframe,所以執行JavaScript程式碼的時候需要判斷當前iframe的Url。頁面的Url有時候會多一個引數,所以判斷Url,有時候用string.Equals判斷,有時候用string.StartsWith判斷。

二、普通寫法 

        public void ExecJavascriptEqualsUrl(string expectUrl, string js)
        {
            List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers();
            foreach (long identifier in frameIdentifierList)
            {
                IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier);
                if (frame.Url.Equals(expectUrl))
                {
                    frame.ExecuteJavaScriptAsync(js);
                    break;
                }
            }
        }

        public void ExecJavascriptStartsWithUrl(string expectUrl, string js)
        {
            List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers();
            foreach (long identifier in frameIdentifierList)
            {
                IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier);
                if (frame.Url.StartsWith(expectUrl))
                {
                    frame.ExecuteJavaScriptAsync(js);
                    break;
                }
            }
        }

 這種是一般的寫法,程式碼執行沒有問題,缺點就是程式碼顯得囉嗦,維護起來不方便。

三、委託寫法

委託是可以把方法當做引數來傳遞的,string.Equals和string.StartsWith都是方法,所以能不能把他們當做引數來傳遞?俗話說:“遇到困難就要上,沒有困難,製造困難也要上“!

首先這個方法需要有返回值,所以要用Func委託,然後要有2個輸入引數,所以委託的結構就是Func<string,string,bool>,寫法如下,這樣就把具體的方法實現放在上層的呼叫裡了。  

        public static void ExecJavascript(ChromiumWebBrowser cefWebBrowser, string expectUrl, string js, Func<string, string, bool> checkUrl)
        {
            List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers();
            foreach (long identifier in frameIdentifierList)
            {
                IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier);
                if (checkUrl(frame.Url, expectUrl))
                {
                    frame.ExecuteJavaScriptAsync(js);
                    break;
                }
            }
        }

 上層的方法呼叫程式碼如下:

        public static void ExecJavascriptEqualsUrl(ChromiumWebBrowser cefWebBrowser, string url, string js)
        {
            ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) =>
            {
                if (frameUrl.Equals(expectUrl))
                {
                    return true;
                }
                else
                {
                    return true;
                }
            });
        }

        public static void ExecJavascriptStartsWithUrl(ChromiumWebBrowser cefWebBrowser, string url, string js)
        {
            ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) =>
            {
                if (frameUrl.StartsWith(expectUrl))
                {
                    return true;
                }
                else
                {
                    return true;
                }
            });
        }

四、總結

使用委託的好處,是把變化的東西拿到另外一個地方,不變的東西只要在一個地方進行維護。如果後面再需要增加一個string.Contains方法,只要再增加一個ExecJavascriptContainsUrl方法就可以了,不用多寫重複的邏輯。

委託是不是很好用