提高代码质量系列之二:重构小技巧——if篇

前言:

  if,相信是童鞋们使用的最频繁的关键字了,而且很多时候,我们使用的if都是在无意识的状态下随手而为。键入if,两下回车(我使用了resharper,可以自动编排if的格式),再信手写下我们需要的逻辑,一段可以“正常运行”的代码就被我们实现了。尽管这段逻辑比较复杂,但在那个时间段,我们对这段业务的前后流程已经有了很长时间的思考,所以可以比较轻松的写出来。但问题来了,一段时间之后,我们发现这里需要修正下,更或者是为了提高鲁棒性,需要为某个变量考虑更多的情况——即进一步添加更多的if。然后,看着那大段大段的if else,我们蛋疼之余,也会小小的钦佩,当时我是怎么写出这么牛逼的代码的?

 

  • dictionary代替选择类if语句

if本身没有选择的功能,为了实现这点,有的人是这样写的:

if (orderinfo.State == 1)
{
result = "已预定";
}
else if (orderinfo.State == 2)
{
result = "已售出";
}

else if 。。。

或者

result = orderInfo.State == 0 ? "待确认" : orderInfo.State == 1 ? "执行中" : orderInfo.State == 2 ? "已完成" : orderInfo.State == 3 ? "已解除" : "";

既琐碎,可读性也不高,而且效率还低(当然,这种情况数据量一般不大)

如果用dictionary,

      public Dictionary<int, string> OrderStatedDictionary = new Dictionary<int, string>()
        {
            {0, ""},
            {1, "已预订"},
            {2, "已售出"},
            {3, "待确认"},
        };

调用的时候,用OrderStatedDictionary[]的方式,这样无疑代码会美观很多。

 

  • 避免if的多层嵌套

两段代码比较

 public string GetNowState(int p1, int p2 , int p3)
        {
            if (CheckMethod1(p1))
            {
                if (CheckMethod2(p2))
                {
                    if (CheckMethod3(p3)))
                    {
                        return GetResult1();
                    }
                }
            }
            return "";
        }

 

        public string GetNowState(int p1, int p2, int p3)
        {
            if (!CheckMethod1(p1))
            {
                return "";
            }
            if (!CheckMethod2(p2))
            {
                return "";
            }
            if (CheckMethod3(p3)) )
            {
                return GetResult1();
            }
            return "";
        }
    }

前者有三层的if嵌套,而后者的逻辑着完全是一条线串下来,代码量少无所谓,但一旦行数超过50行了,哪种代码更容易看不用多说。

  • 待续。。。。

  哎~! 本来我总结了很多的,只是前段时间太忙,一直没时间写, 现在刚从上家公司辞职,还要过几天才去新公司报道,才有时间写点东西,结果居然一时想不起来了,只记得这两点了,以后再补充。

也欢迎大家把自己的总结贴一下。

posted @ 2014-02-26 21:34  碎景  阅读(4615)  评论(19编辑  收藏  举报