来源 感受设计的魅力

[ 2006-11-1 13:34:22 | 作者: 一线风 | 阅读:1948 | 评论:0 | 天气: sunny | 心情: normal ]
Font Size: Large | Medium | Small
我是怎么会喜欢上设计的,仔细想来,全都是因为03年的那次实习经歷
以下是回亿,不一定很精确,但大概情况是记得的
03年暑假,我在南京的一家软件公司实习(其实就是想开学后在同学面前显摆显摆,那时候还是很崇拜程序员的),
当时,那家公司主要是asp开发,自然而然,我也在那做起了asp,
那时候,对于我来说,根本不考虑什么设计合理,扩展性什么的,总是认为,那些都没用,只要写出来就行了,一个功能完成,就觉得自己很满足
直到那一天中午,我彻底改变了想法
那天中午闲的无聊,坐着跟技术经理聊天(我一直很感谢他,不知道现在去哪了),我说:"写程序也没什么难得,无非是些判断循环而已",他听完后,也不说话,
随手在纸上写了小题目:
在网页上有个按钮和一个显示块,要求当按钮显示"显示1"的时候按下按钮,显示块显示"1",并且按钮显示"显示2"
当按钮显示"显示2"的时候按下按钮,显示块显示"2",并且按钮显示"显示1"
我是怎么会喜欢上设计的,仔细想来,全都是因为03年的那次实习经歷
以下是回亿,不一定很精确,但大概情况是记得的
03年暑假,我在南京的一家软件公司实习(其实就是想开学后在同学面前显摆显摆,那时候还是很崇拜程序员的),
当时,那家公司主要是asp开发,自然而然,我也在那做起了asp,
那时候,对于我来说,根本不考虑什么设计合理,扩展性什么的,总是认为,那些都没用,只要写出来就行了,一个功能完成,就觉得自己很满足
直到那一天中午,我彻底改变了想法
那天中午闲的无聊,坐着跟技术经理聊天(我一直很感谢他,不知道现在去哪了),我说:"写程序也没什么难得,无非是些判断循环而已",他听完后,也不说话,
随手在纸上写了小题目:
在网页上有个按钮和一个显示块,要求当按钮显示"显示1"的时候按下按钮,显示块显示"1",并且按钮显示"显示2"
当按钮显示"显示2"的时候按下按钮,显示块显示"2",并且按钮显示"显示1"

看完后,我说"这有何难?"随手就在电脑上写了起来

<html>
    <body>
        <input  type="button"  id="btn_test"  >
        <div  id="show"></div>
    </body>
    <script  language="javascript">

        function  Control()
        {

              this.Execute=function()
              {
                      if  (btn_test.value=="显示1")
                      {
                                btn_test.value="显示2";
                                show.innerText="1";
                      }
                      else  if  (btn_test.value=="显示2"  ||  btn_test.value=="")
                      {
                                btn_test.value="显示1";
                                show.innerText="2";
                      } 
              } 
        }   
        onload=function()
        {
           
            control=new  Control();
            control.Execute();
        }

        btn_test.onclick=function()
        {
                control.Execute();
        }
        var  control;
    </script>
</html>

写完后,运行了一下,经理看了看,说"还行"
接著又说"现在要就变了,看看你怎么写",现在的要求是
当按钮显示"显示1"的时候按下按钮,显示块显示"1",并且按钮显示"显示2"
当按钮显示"显示2"的时候按下按钮,显示块显示"2",并且按钮显示"显示3"
当按钮显示"显示3"的时候按下按钮,显示块显示"3",并且按钮显示"显示1"


于是我又改了起来
<html>
    <body>
        <input  type="button"  id="btn_test"  >
        <div  id="show"></div>
    </body>
    <script  language="javascript">

        function  Control()
        {

              this.Execute=function()
              {
                      if  (btn_test.value=="显示1")
                      {
                                btn_test.value="显示2";
                                show.innerText="1";
                      }
                      else  if  (btn_test.value=="显示2")
                      {
                                btn_test.value="显示3";
                                show.innerText="2";
                      } 
                      else  if  (btn_test.value=="显示3"  ||  btn_test.value=="")
                      {
                                btn_test.value="显示1";
                                show.innerText="3"; 
                      }
              } 
        }   
        onload=function()
        {
           
            control=new  Control();
            control.Execute();
        }

        btn_test.onclick=function()
        {
                control.Execute();
        }
        var  control;
    </script>
</html>

经理看完后,说"不错,完成要求了,但这样写并不是很好,看看我写的"
他随手写了个程序给我看
下面就是他写的

<html>
    <body>
        <input  type="button"  id="btn_test"  >
        <div  id="show"></div>
    </body>
    <script  language="javascript">

        function  Control(state)
        {

              this.State=state;
              this.Execute=function()
              {
                      this.State.Execute(this);
              } 
        }

        function  State1()
        {
              this.Name="State1";
              this.Execute=function(control)
              {
                    btn_test.value="显示2";
                    show.innerText="1";
                    control.State=new  State2();
              }
        }

        function  State2()
        {   
              this.Name="State2";
              this.Execute=function(control)
              {
                    btn_test.value="显示1";
                    show.innerText="2"; 
                    control.State=new  State1();
              }
        }     
        onload=function()
        {
            control=new  Control(new  State1());
            control.Execute();
        }

        btn_test.onclick=function()
        {
                control.Execute();
        }
        var  control;
    </script>
</html>
接着他说:"你知道我写的好在哪里吗?因为我发现这个要求是和状态紧密联系的,当按钮处于不同状态时,有不同的行为,所以,干脆,我就将状态单独封装起来,这个,符合面向对像程序设计的基本原则"发现变化,封装变化",这样一来,Control这个类就不知道自己的具体的状态了,跟状态也就实现脱耦了,所有的行为都交给了状态对象所负责了,这样,以后要扩展起来,就不用再改变这个Control类了,实现了复用,现在,我再按照第二个要求写个程序"

<html>
    <body>
        <input  type="button"  id="btn_test"  >
        <div  id="show"></div>
    </body>
    <script  language="javascript">

        function  Control(state)
        {

              this.State=state;
              this.Execute=function()
              {
                      this.State.Execute(this);
              } 
        }

        function  State1()
        {
              this.Name="State1";
              this.Execute=function(control)
              {
                    btn_test.value="显示2";
                    show.innerText="1";
                    control.State=new  State2();
              }
        }

        function  State2()
        {   
              this.Name="State2";
              this.Execute=function(control)
              {
                    btn_test.value="显示3";
                    show.innerText="2"; 
                    control.State=new  State3();
              }
        }     

        function  State3()
        {   
              this.Name="State3";
              this.Execute=function(control)
              {
                    btn_test.value="显示1";
                    show.innerText="3"; 
                    control.State=new  State1();
              }
        }   
 
        onload=function()
        {
            control=new  Control(new  State1());
            control.Execute();
        }

        btn_test.onclick=function()
        {
                control.Execute();
        }
        var  control;
    </script>
</html>

"看到了吗?我只要增加进来一个状态类,再略为修改一下原来的状态对象就可以了,不用改动到Control类,并且,避免了大量的判断语句,这道题目要求的动作还是比较简单的,如果复杂,就更能体现出优势了,如果按照你的写法,肯定要搞晕在复杂的if  else里,而我的写法里,每个状态只知道自己的下一个状态和本身的动作,将原来的Control类与状态的一对多转变成了状态之间的一对一关係,这样就变得简单了,Control也实现了复用,不像你写的,Control类只能在这里一个地方用,这其实就是用到了一个状态模式,所以,你说的不用考虑设计的写程序方式,是不可取得,以后修改维护时要吃大苦头的,虽然这个只是javascript的一个小例子,限于脚本原因,并不能完全显示出设计的魅力来,但还是能看到设计的好处的"

在这期间,我一句话也没说,因为,我真的是很吃惊,同样的实现,他写出的代码就那么优雅,给后续的维护带来了那么的方便性,突然之间,就发现自己以前的想法非常愚昧,简直是非常可笑
也就是从那天起,我开始注意到设计了,每次写程序之前,总要多想想
虽然在那家公司只待了一个月时间,但给自己带来的收获是很大的,一个月中,那位经理交了我很多他的经验
我很感谢他,虽然现在已经失去了联系

--------------------------以下为回复

对状态模式来说,最根本的就是状态这个概念了
何谓状态?
if  (a==1)
{
...
}
else  if  (a==2)
{
...
}
else  if  (a==3)
......
这里的a其实并不叫状态
a只是一个标示
只有在
if  (a==1)
{
      a=2;
}
else  if  (a==2)
{
      a=3;
}
else  if  (a==3)
{
      a=1;
}
这种情况下才能把a称之为状态
这时状态模式才能起到它的作用
因此在这个例子里
this.State.Execute(this);
这句话的意思就是让状态可以去改变当前状态
也就是上面提到的
if  (a==1)
{
        a=2;
}
这个意思了

分类:学习参考
Tag: 设计 感受 学习