C# 消灭switch的面向映射编程

2022/9/13 1:24:43

本文主要是介绍C# 消灭switch的面向映射编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

原有switch写法,所有分支集中在一个方法中,使得方法过于冗长

    class Calculator01
    {
        public double Num1 { get; set; }
        public double Num2 { get; set; }

        public double Run(string operate)
        {
            switch(operate)
            {
                case "+":
                    return Num1 + Num2;
                case "-":
                    return Num1 - Num2;
                case "*":
                    return Num1 * Num2;
                case "/":
                    if (Num2 == 0)
                    {
                        throw new Exception("除数不能为0");
                    }

                    return Num1 / Num2;
                default:
                    throw new Exception("未知的操作符");
            }
        }
    }

面向映射写法,将分支剥离为独立方法,避免主要方法过于冗长

    class Calculator02
    {
        // 内置委托Action、Func、Predicate的区别:
        // Action可以有多个参数但不可有返回值;
        // Func可以有多个参数且最后一个参数固定是返回值;
        // Predicate只能有1个参数且返回布尔值。  
        private Dictionary<string, Func<double, double, double>> map = new Dictionary<string, Func<double, double, double>>();

        public double Num1 { get; set; }
        public double Num2 { get; set; }        

        public Calculator02()
        {          
            // 注册操作符到方法的映射
            map.Add("+", Add);
            map.Add("-", Sub);
            map.Add("*", Mul);
            map.Add("/", Div);
        }

        public double Run(string operate)
        {
            if (!map.ContainsKey(operate))
                throw new Exception("未知的操作符");

            return map[operate](Num1, Num2);
        }

        private double Add(double num1, double num2)
        {
            return Num1 + Num2;
        }

        private double Sub(double num1, double num2)
        {
            return Num1 - Num2;
        }

        private double Mul(double num1, double num2)
        {
            return Num1 * Num2;
        }

        private double Div(double num1, double num2)
        {
            if (Num2 == 0)
            {
                throw new Exception("除数不能为0");
            }

            return Num1 / Num2;
        }
    }

 



这篇关于C# 消灭switch的面向映射编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程