zoukankan      html  css  js  c++  java
  • 【重构学习】08 条件表达式的重构

    所谓条件表达式,就是分支语句,去掉分支语句咯

    1、分解条件表达式

    修改点:你有一个复杂的条件语句(就是if else语句)

    做法:将条件表达式的三个部分分别提炼出独立函数

                if (A部分)
                {
                    B部分;
                }
                else {
                    C部分;
                }    

    这三个部分都提炼成函数就好了。

    2、合并条件表达式

    修改点:你有一系列测试,都得到相同结果

    做法:将这些测试合并成一个条件表达式,并将这个表达式提炼成一个独立函数

    3、合并重复的条件片段

    修改点:在条件表达式的每个分支上有着相同一段代码

    做法:将这段重复代码搬移到条件表达式之外

    4、移除控制标记

    修改点:在一系列布尔表达式中,某个变量带有“控制标记”(control flag)的作用。

    做法:以break语句或return语句取代控制标记

                bool isILoveYou=true;
                int[] loveNum=new int[100];
                for (int i=0; i < 100; i++) {
                    if (isILoveYou) {
                        if (某种原因) {
                            isILoveYou = false;
                        }
                        Console.WriteLine(loveNum[i]);
                    }
                }        

    而isILoveYou就是控制标记,所以可以用continue,break,return这类跳出语句去移除控制标记

    5、以卫语句取代嵌套条件表达式

    修改点:函数中的条件逻辑使人难以看清正常的执行路径

    做法:使用卫语句表现所有情况。

    如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回,这样的语句被称为“卫语句”。

    6、以多态取代条件表达式

    修改点:你手上有个条件表达式,它根据对象类型的不同而选择不同的行为

    做法:将这个条件表达式的每个分支放进一个子类内的覆盖函数中,然后将原始函数声明为抽象函数。

    如果你搞不清楚的话,你可以看一看我在 7、数据的重构 里面的第14点的代码,也许你会更清楚一点。

    7、引入NULL对象

    修改点:你需要再三检查某对象是否为NULL

    做法:将NULL值替换为null对象

    用了NULL值的代码:

    class Program
        {
            static void Main(string[] args)
            {
                var roomList = new List<Room>();
                roomList.Add(new Room("低级房",new People("A先生")));
                roomList.Add(new Room("高级房"));
    
                foreach (var room in roomList) {
                    if (room.Master != null) {
                        Console.WriteLine(room.Master.Name);
                    }
                }
                Console.ReadKey();
            }
        }
    
        public class Room {
            public Room(string roomName,People people=null)
            {
                this.RoomName = roomName;
                this.Master = people;
            }
            public string RoomName { get; set; }
            public People Master { get; set; }
        }
        public class People
        {
            public People(string name) {
                this.Name = name;
            }
            public string Name { get; set; }
        }

    改为

    class Program
        {
            static void Main(string[] args)
            {
                var roomList = new List<Room>();
                roomList.Add(new Room("低级房",new People("A先生")));
                roomList.Add(new Room("高级房"));
    
                foreach (var room in roomList) {
                    Console.WriteLine(room.RoomName + ":" + room.Master.Name);
                }
                Console.ReadKey();
            }
        }
    
        public class Room {
            public Room(string roomName,People people=null)
            {
                this.RoomName = roomName;
                this.Master = people;
            }
            public string RoomName { get; set; }
            public People Master { 
                get{
                    return  _master==null?new NullPeople():_master;
                }
                set {
                    _master = value;
                }
            }
    
            People _master;
        }
        public class People
        {
            public People()
            {
            }
            public People(string name) {
                this.Name = name;
            }
            public virtual string Name { get; set; }
            public virtual bool IsNULL()
            {
                return false;
            }
            public static People CreateNullPeople()
            {
                return new NullPeople();
            }
        }
        public class NullPeople:People{
            public NullPeople():base() { 
            
            }
            public override bool IsNULL(){
                return true;
            }
            public override string Name
            {
                get
                {
                    return "无人";
                }
            }
        }

    在这里不继承people可能更好一点,都继承一个自定义的接口IsNULLPeople,代码更好看一点。

  • 相关阅读:
    安卓android.support.design使用中的问题
    处理requests SSl 证书问题
    python-excel
    post 请求包含相同参数
    关于zk 页面滚动问题 scroll
    Usefull Jquery
    Git 安装
    Comparison issues in TD
    Work Diary 12/13/17
    Unit10 I don't like work in the weekend
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5115351.html
Copyright © 2011-2022 走看看