判断object是list或者string_写C#逻辑判断,不要只知道ifelse 和switch

那天看到一篇文章《写 JS 逻辑判断,不要只知道用 if-else 和 switch》,感觉写的非常好,然后就想到这些想法同样也适用于C#,于是就有了今天这篇文章0278cb1ac6b6283db884cdfabc6f29c3.png

其实无论是JS还是C#,更或者Java,Python...,当遇到有很多逻辑判断的时候,我们第一想到的可能就算if-else或者switch。当条件很多时,我们就会发现一个方法中大概有数不清的if-else或者switch(数不清有点夸张…大家懂得…ab62d18c771b6e23bdc4d2e996e84225.png),总之呢看起来非常头疼,那么如何写出更优雅的代码来代替if-else或者switch呢?

比如下面一段代码:

 private void jumpIfElse(string status)        {            if(status == "1")            {                sendLog("processing");                jumpTo("IndexPage");            }            else if(status == "2" || status == "3")            {                sendLog("fail");                jumpTo("FailPage");            }            else if(status == "4")            {                sendLog("success");                jumpTo("SuccessPage");            }            else if(status == "5")            {                sendLog("success");                jumpTo("SuccessPage");            }            else            {                sendLog("other");                jumpTo("Index");            }        }

可以看到上述代码逻辑就是根据不同的状态值产生日志和页面跳转,这段代码用switch重写如下:

 private void jumpSwitch(string status)        {            switch (status)            {                case "1":                    sendLog("processing");                    jumpTo("IndexPage");                    break;                case "2":                case "3":                    sendLog("fail");                    jumpTo("FailPage");                    break;                case "4":                    sendLog("success");                    jumpTo("SuccessPage");                    break;                case "5":                    sendLog("cancel");                    jumpTo("CancelPage");                    break;                default:                    sendLog("other");                    jumpTo("Index");                    break;            }        }

看起来比if-else好一些,那么有没有更简洁的方式呢4764a2532d98b85a9ed183d9b977985e.png,请看下面:

private string [] generateStr(string status)        {            Dictionary<string, string[]> dictionary = new Dictionary<string, string[]>();            dictionary.Add("1", "processing,IndexPage".Split(','));            dictionary.Add("2", "fail,FailPage".Split(','));            dictionary.Add("3", "fail,FailPage".Split(','));            dictionary.Add("4", "success,SuccessPage".Split(','));            dictionary.Add("5", "cancel,CancelPage".Split(','));            dictionary.Add("0", "other,Index".Split(','));            return dictionary[status];        }        private void jump(string status)        {            sendLog(generateStr(status)[0]);            jumpTo(generateStr(status)[1]);        }

上面的代码看起来是不是舒服很多呢d89d030320539fdec1cabf8dd71e4560.png?将判断条件作为字典的key值,处理逻辑作为字典的value值,每次只需要维护字典部分即可,特别适用于处理单项条件判断逻辑嘻嘻。

现在我们要升级问题难度了哦,这个方法中不仅要判断状态,还要验证身份:

  private void jumper(string status,string identity)        {            if (identity == "guest")            {                if (status == "1")                {                    doSomething();                }                else if (status == "2" || status == "3")                {                    doSomething();                }                else if (status == "4")                {                    doSomething();                }                else if (status == "5")                {                    doSomething();                }                else                {                    doSomething();                }            }            else if (identity == "admin")            {                if (status == "1")                {                    doSomething();                }                else if (status == "2" || status == "3")                {                    doSomething();                }                else if (status == "4")                {                    doSomething();                }                else if (status == "5")                {                    doSomething();                }                else                {                    doSomething();                }            }        }

从上面的例子可以看出,每加一层判断,代码就要加一倍,可想而知,要是一直这样加下去....额额额e302f14736ec0e81ce56518b39e8f7b1.png,我相信你一定不想读这样的代码。

那么有没有什么干净利索的方式呢4764a2532d98b85a9ed183d9b977985e.png,没错那就是用反射,字典的value值传方法名。

     private string generateStr(string status,string identity)        {            Dictionary<string, string> dictionary = new Dictionary<string, string>();            dictionary.Add("guest_1", "doSomething");//doSomething是方法名            dictionary.Add("guest_2", "doSomething");            dictionary.Add("guest_3", "doSomething");            dictionary.Add("guest_4", "doSomething");            dictionary.Add("guest_5", "doSomething");            dictionary.Add("admin_1", "doSomething");            dictionary.Add("admin_2", "doSomething");            dictionary.Add("admin_3", "doSomething");            dictionary.Add("admin_4", "doSomething");            dictionary.Add("admin_5", "doSomething");            dictionary.Add("0", "doSomething");            return dictionary[identity_status];        }       public void jump(string status, string identity)        {            string methodName = generateStr(identity + "_" + status);            Type type = Type.GetType("ClassName");      // 通过类名获取同名类(替换自己的类名)            Object obj = System.Activator.CreateInstance(type);       // 创建实例            MethodInfo method = type.GetMethod(methodName, new Type[] { });      // 获取方法信息            object[] parameters = null;            method.Invoke(obj, parameters);                           // 调用方法,参数为空        }

上述代码的核心是将两个判断条件拼接成字符串作为字典的key值,然后执行的方法名作为字典的value值,然后用反射去调用方法。每次增加判断条件或者处理逻辑,只需要修改字典部分即可,是不是看着舒服了许多,而且也不容易出错7dc66f008c3a787edb8cf891436f67ce.png

本文主要主要提到了:

  1. if-esle

  2. switch

  3. 单一判断,存储到字典中

  4. 多重判断,将条件拼接字符串作为字典的key值,将方法名作为字典的value值,然后用反射调用方法。

当然还有很多其他方式,比如可以使用工厂模式+策略模式去重构if-else和switch过多的情况,这里也只是给大家一个思路。

不一定不用if-else就不好,适合自己的代码就是最好的代码2522241d5b804b5cceba73e0df2ca2cc.png

题外话02bc6268f02ac3832059f37c99d85536.png:本来想多写一点,可是有点累,先到这了e37dcf9a772db9f32156b57870e5ba2b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值