zoukankan      html  css  js  c++  java
  • 测试中的代码分享~将可以合并的方法去合并Func不赖

    在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象!

    原来的代码:

            /// <summary>
            /// 单数累加
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            static int AddOpreation(int a, int b)
            {
                int sum = 0;
                for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
                {
                    sum += i;
                }
                return sum;
            }
            /// <summary>
            /// 乘方累加
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            static int AddInvolutionOpreation(int a, int b)
            {
                int sum = 0;
                for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
                {
                    sum += i * i;
                }
                return sum;
            }

    可以看到这两个方法的方法体基本相同 ,只是在累加时第一个是原数累加,第二个方法是原数的乘方作累加,对于上面的代码,我们可以进行再次抽象,将不相同

    的代码逻辑提出来,我们知道.net 3.5有了Action和Func两个委托,事实上,这两个委托是微软为我们封装好的,原来就是因为它们常用,所以,人家直接给封装好了,这一点,是值得我们去学习的,有人说,微软的东西升级快,但我要说的是,它的升级不是语言本身的升级,而是为了让开发人员更方便的使用它,让开发人员

    的代码写出来更可读,让代码的艺术性更强,这是我想说的。

    下面是把变化的部分抽象之后的结果,看代码:

            /// <summary>
            /// 按着某种方法进行累加
            /// </summary>
            /// <param name="func"></param>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            static int BothIntegerOpreation(Func<int, int> func, int a, int b)
            {
                int sum = 0;
                for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
                {
                    sum += func(i);
                }
                return sum;
            }

    而在调用的时间,我们将具体的实现逻辑以参数的形式传递进来,有人说,委托用不到,但我想说,那是你对委托还不够了解!

                Func<int, int> funcAdd = (a) => { return a; };//以变量的形式定义委托的实例逻辑
                int res1 = BothIntegerOpreation(funcAdd, 1, 3);
                int res2 = BothIntegerOpreation((a) => { return a * a; }, 1, 3);//直接在方法调用时写逻辑
                Console.WriteLine(res1.ToString() + res2.ToString());

    结果如下:

  • 相关阅读:
    Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
    Codeforces Round #598 (Div. 3) F Equalizing Two Strings(构造题)
    codeforces round # 384 div2 B Chloe and the sequence 神奇二进制找规律题
    codeforces round #384 div2 C Vladik and fractions(构造)
    线段树板子
    Codeforces Round #616 (Div. 2) D (找规律题)
    codeforces round #616 div2 A (Even but not even)水题
    2017的计划清单
    回顾2016,我的简单总结
    关于ubuntu下sublime text 3 的安装和中文配置问题
  • 原文地址:https://www.cnblogs.com/lori/p/3342614.html
Copyright © 2011-2022 走看看