zoukankan      html  css  js  c++  java
  • 定义和实现分离

     定义和实现分离,oop的编程,或则.....我也不知道,这边文章改定义什么样的标题好呢,然后......

     我们来看一段代码的优化,来逐步的体会一下;

     public enum ScheduleType
        {
            Once=0,
            Daily=1,
            Weekly=2
        }
        //这种方式,我们可以使用多种方式来进行优化滴呀;
        //简单的swich case 方式滴啊;
        //然后就是我们的 委托的方式滴呀
        //还有我们的    就是我们的重载的方式滴啊
        //多种多样的方式和写法滴啊;
    
        public class TaskInfo
        {
            public void ShowScheduleDescription(ScheduleType type)
            {
                //这种将判断的逻辑写在了我们的函数内部滴呀;
                //这种方式将功能的实现(业务逻辑混合在一起了滴呀)和方法的定义
                switch (type)
                {
                    case ScheduleType.Once:
                        Console.WriteLine("this is once activitys");
                        break;
                    case ScheduleType.Daily:
                        Console.WriteLine("this is week activitys");
                        break;
                    case ScheduleType.Weekly:
                        Console.WriteLine("this si weekly activitys");
                        break;
                    default:
                        throw new InvalidOperationException("unsupported sceduled...");
                }
            }
        }

    接下来我们做到了“看似分离的一个状态滴呀”,注意,我这里强调的是看似

     public class TaskInfo2
        {
            public void ShowScheduleDescription(ScheduleType type)
            {
                ScheduleActivity s = new ScheduleActivity();
                switch (type)
                {
                    case ScheduleType.Once:
                        s.Once("this is once");
                        break;
                    case ScheduleType.Daily:
                        s.Daily("this is dail");
                        break;
                    case ScheduleType.Weekly:
                        s.Weekly("this is weekly");
                        break;
                    default:
                        throw new InvalidOperationException("unsupported sceduled...");
                }
               
            }
        }
        //这样就将我们的方法定义和我们的具体实现给分离的滴呀;
        public class ScheduleActivity  //动态的扩展就可以在我们的这里进行了滴啊;
        {
    
            public void Once(string Str)
            {
                Console.WriteLine(Str);
            }
    
            public void Daily(string Str)
            {
                Console.WriteLine(Str);
            }
    
            public void Weekly(string Str)
            {
                Console.WriteLine(Str);
            }
        }

    然后,就算我们通过委托将将具体的实现进行分离;也是无预计与是的,以为,我们优化的开始方向就错了;这样优化,有种多此一举的感觉;

        public delegate void Del(string str);
    
        public class TaskInfo2
        {
            public void ShowScheduleDescription(ScheduleType type)
            {
                ScheduleActivity s = new ScheduleActivity();
                string val = string.Empty;
                Del del;
                switch (type)
                {
                    case ScheduleType.Once:
                        val = "this is once";
                        del=new Del(s.Once);
                        break;
                    case ScheduleType.Daily:
                        val = "this is dail";
                        del=new Del(s.Daily);
                        break;
                    case ScheduleType.Weekly:
                        val = "this is weekly";
                        del = new Del(s.Weekly);
                        break;
                    default:
                        throw new InvalidOperationException("unsupported sceduled...");
                }
                del(val);
               
            }
        }

    其实一开始,我们只是在改变代码所在的地方,并没有实现真正意义的分离,

    对于一个有经验的OO开发者,一旦看到switch,if(type=typeof(…))之类的代码马上会提高警惕

    把真正意义的上实现暴露在代码的外部注册,而是不是内部;

    这些改写,也许会好一点底呀;

        //到了某个点之后,调用什么样的方法,我们不写在这里,而是通过事件在外部进行我们的注册
        //这样我们的额程序,就有很大的扩展和提升性了滴呀;
        //这就给了我们这个类,足够的扩展性了滴呀;
        public class TaskInfo  
        {
            public string val;
            public delegate void BoyHandler(string value);   // 声明委托
            public event BoyHandler BoyEvent;             // 注册事件
            public void ShowScheduleDescription()
            {
               if (BoyEvent != null)
                {
                    BoyEvent(val);
                }
            }
        }
    这里就是我们外部调用类的滴呀;将我们的定义和实现分离的滴呀;
        public class OuterClass
        {
            public void Info(ScheduleType type)
            {
                TaskInfo t = new TaskInfo();
                ScheduleActivity s = new ScheduleActivity();
                switch (type)
                {
                    case ScheduleType.Once:
                        t.val = "this is once";
                        t.BoyEvent += s.Once;
                        break;
                    case ScheduleType.Daily:
                        t.val = "this is Daily";
                        t.BoyEvent += s.Daily;
                        break;
                    case ScheduleType.Weekly:
                        t.val = "this is once";
                        t.BoyEvent += s.Weekly;
                        break;
                    default:
                        throw new InvalidOperationException("unsupported sceduled...");
                }
            }
    
          }

    好了,上面的优化,之路很别扭,因为一开始的房方向就错了,好了,现在我们来oop优化吧

    switch中进行变动;所以,并不是那么的完美,那么我们再进一步的进行优化;

         public class Schedule
        {
            public virtual void ShowShowScheduleDescriptions()
            {
                //这里我们只定义,具体的实现,交给我们的额子类去实现;
                //这样就有了很好的扩展性,这个也是我们多肽的变现形式之一滴呀;
            }
        }
    
        public class OnceSchedule : Schedule
        {
            public override void ShowShowScheduleDescriptions()
            {
                Console.WriteLine("this is once activity");
            }
        }
    
        public class DailySchedule : Schedule
        {
            public override void ShowShowScheduleDescriptions()
            {
                Console.WriteLine("this is daily activity");
            }
        }
    
        public class WeeklySchedule : Schedule
        {
            public override void ShowShowScheduleDescriptions()
            {
                Console.WriteLine("this is daily Weekly");
                //这样的代码很好的解决了面向过程代码的两个问题,看起来更加具有扩展性,随着新类型的Schedule引入,旧的代码完全不用改动。
            }
            //同样我们可以使用接口来实现,不过这种方式,接种方式显德更好一些滴呀
        }

    over~

     然后再来看看我们一段js代码 oop的优化过程;

       //div0 - 长度长度加1
        //div1
        //div2
        //div3
        //div4
        //div5
        //div6
        //div7
    
    
        //上面这个就是面向过程的写法;
        function Change() {
            var div0 = document.getElementById("div0");
            var div1 = document.getElementById("div1");
            var div2 = document.getElementById("div2");
            var div3 = document.getElementById("div3");
            var div4 = document.getElementById("div4");
            var div5 = document.getElementById("div5");
            var div6 = document.getElementById("div6");
    
            div0.length = div0.length + 10 + "px";
            div1.length = div1.length + 10 + "px";
            div2.length = div2.length + 10 + "px";
            div3.length = div3.length + 10 + "px";
            div4.length = div4.length + 10 + "px";
            div5.length = div5.length + 10 + "px";
            div6.length = div6.length + 10 + "px";
        }
    
        
        function ChangeInfo(id,AddVal) {
            var obj = document.getElementById(id)
            obj.length = obj.length + AddVal;
        }
    
        function Do() {
            ChangeInfo("div0", AddVal) //如果,这样,就出现了,很多的副本;没有达到代码的重用id呀;没有oo的感觉
            ChangeInfo("div1", AddVal)
            ChangeInfo("div2", AddVal)
            ChangeInfo("div3", AddVal)
        }
    
        //下面这个就是面向对象的写法;
        function DivObj(id,AddVal) {
            this.obj = document.getElementById(id)
            this.AddVal = AddVal;
            this.AddLen = function () {
                this.obj.length = this.length + this.AddVal + "px";
            }
            //获取到的东东,已经是一个对象了,这个叫对象的多台扩展滴呀;
            //正确的做法是应该对它进行拓展,英文,当document.getElementById(id) 之后,已经是一个对象了;
            //有点类似于它的扩展了滴呀
        }
    
        
    
        function ChangeLen() {
            var obj = new DivObj("div0", 10)  //这些,仅仅是我抽象的一个实例吧了;
            obj.AddLen();
            var obj1 = new DivObj("div1", 10)
            obj1.AddLen();
            var obj2 = new DivObj("div2", 10)
            obj2.AddLen();
            var obj3 = new DivObj("div3", 10)
            obj3.AddLen();
        }
    
        //个人觉得,贯穿oo 的就是我们的this关键字

    参考文献: http://blog.jobbole.com/102236/

  • 相关阅读:
    win10 L2TP拨号
    Esxi直通板载Sata
    Esxi 增加网卡驱动 生成ISO
    IPMITOOL THRESHOLD 修改
    Reverse Engineering Supermicro IPMI
    Esxi通过RDM直通硬盘
    Centos 安装后优化
    Centos 6安装apache 2.4
    Try Catch Finally 中Finally的代码在什么时候不被执行
    用CutePDF AND GhostScript 生成PDF的处理流
  • 原文地址:https://www.cnblogs.com/mc67/p/6361107.html
Copyright © 2011-2022 走看看