zoukankan      html  css  js  c++  java
  • 使用委托把方法写得更容易维护

    一、背景介绍

    最近在做的项目中使用了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方法就可以了,不用多写重复的逻辑。

    委托是不是很好用呢。

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/lhking/p/11359038.html
Copyright © 2011-2022 走看看