zoukankan      html  css  js  c++  java
  • .Net/C# -- 几种常用的代码重构手法

    重构的好处不多叙述了,大家都明白,好的代码不仅可读性强,重用性强,而且可维护性高。书上论述的非常详细,我挑选几种最常用的重构方法,并用C#语言做示例,总结一下,学习一下!

    1:提取函数

    原始代码为:

    static void Main(string[] args)
            {
                User user = new User();
    
                user.name = "张三";
    
                user.age = 12;
    
                PrintOwing(user);
    
                Console.ReadKey();
            }
            public static void PrintOwing(User user) 
            {
                PrintDetail();
    
                Console.WriteLine("姓名:" + user.name);
                
                Console.WriteLine("年龄:" + user.age);
            }
            private static void PrintDetail() { }

    重构为:

    static void Main(string[] args)
            {
                User user = new User();
    
                user.name = "张三";
    
                user.age = 12;
    
                PrintOwing(user);
    
                Console.ReadKey();
            }
            public static void PrintOwing(User user)
            {
                PrintBanner();
                PrintUserInfo(user);
            }
            public static void PrintUserInfo(User user)
            {
                Console.WriteLine("姓名:" + user.name);
                Console.WriteLine("年龄:" + user.age);
            }
            private static void PrintBanner() { }

    思想:让每个函数只做一件事,抽取能够被组织在一起的代码,并单独抽取为一个函数。如果函数的粒度小,被复用的机会就更大。后期如果需求改动,那么需要修改的代码就很少,可维护性高,同时阅读起来也不清晰。

    2:内联临时变量

    原始代码:

    double orderInfo = anOrder.BasePrice();
    return (orderInfo > 1000);

    重构为:

    return (anOrder.BasePrice() > 1000);

    注意:重构前要保证这个临时变量只被赋值一次,所以当遇到循环语句时,要注意被内联的变量的值是否会在循环中被改变。有时在执行循环之前定义固定的临时变量是必要的。尤其是当临时变量取自某对象的属性,而这个对象将在for循环中被更改。

    3:以查询取代临时变量

    原始代码:

    double GetBasePrice = quantity * itemPrice;
    if(GetBasePrice > 10)
    {
        return GetBasePrice * 9.5;
    }
    else
    {
        return GetBasePrice * 9.8;
    }

    重构为:

    if(GetBasePrice() > 10)
    {
        return GetBasePrice() * 16.2;
    }
    else
    {
        return GetBasePrice() * 16.1;
    }
    ...
    double GetBasePrice()
    {
        return quantity * itemPrice;
    }

    4:以卫语句嵌套条件表达式

    原始代码:

    double GetPayAmount()
    {
        double result;
        if(_isDead) result = deadAmount();
        else
        {
            if(_isSeparated)
            {
                result = separatedAmount();
            }
            else
            {
                if(_isRetired)
                {
                    result = retiredAmount();
                }
                else
                {
                    result = normalPayAmount();
                }
            }
        }
        return result;
    }

    重构为:

    double GetPayAmount()
    {
        if(_isDead)
        {
            return deadAmount();
        }
        if(_isSeparated)
        {
            return separatedAmount();
        }
        if(_isRetired)
        {
            return retiredAmount();
        }
        return normalPayAmount();
    }

    在初学编程的时候,很多人都会写出很多if…else嵌套的代码,其实很多时候,else并不是必须的。关于if…else…如何取决,关键看你对各分支的重视程度

    注:这是在一篇博客里学到的,地址忘记了!

    5::引入解释性变量

    原始代码:

    if((platform.ToUpper().IndexOf("MAC") > -1) && (browser.ToUpper().IndexOf("IE") > -1) && wasInitialized() && resize > 0)
    {
        //
    }

    重构为:

    bool isMacOs = platform.ToUpper().IndexOf("MAC") > -1;
    bool isIE = browser.ToUpper().IndexOf("IE") > -1;
    bool wasResized = resize > 0;
    
    if(isMacOs && isIE && wasInitialized() && wasResized)
    {
        // do something
    }

    在某些情况下,表达式可能非常的复杂以至于难以阅读。这样,临时变量可以帮助你将表达式分解为比较容易管理的形式。

    6:流程控制语句简化

    原始代码:

    int row = DbHelperSql.ExecuteSql(sql);
    if(row> 1)
    {
        return true;
    }
    else
    {
        return false;
    }

    重构为:

    int row = DbHelperSql.ExecuteSql(sql);
    if(row) > 1
    {
        return true;
    }
    return false;
    
    /////
    int row = DbHelperSql.ExecuteSql(sql);
    return (row > 1);
    
    return DbHelperSql.ExecuteSql(sql) > 1;
  • 相关阅读:
    快速排序 C语言实现
    怎样认识女孩?
    看了你就想结婚!)
    C语言面试题大汇总
    VC6.0下载地址
    STL vector 容器介绍
    Beauty of Maths! Amazing!
    自我参考:Java学习的30个目标
    Beauty of Maths! Amazing!
    采用 Java 持久化框架:选择、时机和优缺点?
  • 原文地址:https://www.cnblogs.com/dcy521/p/13449084.html
Copyright © 2011-2022 走看看