写程序其实是一件很好玩儿的事 - 高家庄,马家河子版

写程序的确是一件很好玩儿的事情。我一直觉得我们程序员的功底不比那些搞文学的差到哪儿去,我们只是用的语言不同罢了。写程序其实也是在讲话。我曾经写过一篇文章给DW,结果被打回来了,他们说文章不是那样写的。结果DW 上的文章读起来通常都很生硬。

 

写程序好玩儿在哪里呢?其实写程序就像讲话,你讲话给电脑听,他要听明白了就会帮你做事。 我觉得好玩儿的地方就在于你可以把事情讲的很轻松。如果需要很辛苦才能把一件事情讲明白当然就不好玩儿了。我举一个很简单的例子。例如你有一堆的函数,他们对应不同的情况,在特定的情况下要执行特定的函数。(看,我们通常讲话也是这样讲吧。)所以你需要一套分支结构,去分别指导他们在不同的情况下去调用不同的函数。听起来到目前为止还一切正常,也很轻松有趣。但是实际上我们都知道这里面的事情并不是想看起来一样的简单。如果仅仅是说话的话,当然很简单了。到目前为止我们已经把事情讲清楚了,已经说完了,接下来的时间计算机该做什么去做什么就是了。但是我们写程序的人都知道,写出来的程序还有一个巨大的工作等在后面的————就是你的程序将来还得维护啊。对于写程序来说事情还远远没有结束啊。所以随着维护的进行,要说的事情越来越复杂,函数的数量越來越多,你的分支结构越来越长,你在维护他们之间的关系的时候越来越小心翼翼…… 好吧,这样的事情从哪一个角度来说都不好玩儿了。

让我们还是回到说话这个层面上来。八路军要转移,要撤离高家庄,马家河子,总得跟当地的妇女主任交代点儿什么吧。我们有这个战术,这个战术,这个战术…… 如果是鬼子来了,你用这个战术;如果是伪军来了,你用这个战术;枣庄那边的游击队来了,你要这样跟他们接待;如果鬼子开着铁甲车大规模扫荡开始了,那你们就带着老乡赶紧往山里面转移吧。然后呢?然后斗争的形势变得更加复杂了。敌人又成立了保安团,维持会,还乡团,宪兵大队……需要应对的情况越来越多,赶上又新来了一个妇女主任,区队长还没把事情交代完呢,鬼子已经开到村口了。这样一来事情就不好玩儿了。

但是实际上事情是可以交代的更简单一些的。在上面我们是把事情分成两块来交代的,一方面是我们有什么样的战术,另一方面是每一种情况下应该采取那一种特定的战术,也就是说,情况和战术之间的对应关系。其实我们是可以一把把事情说清楚的。我们可以直接说我们有对付鬼子的战术;对付伪军的战术;收拾保安团,还乡团的战术;安抚维持会的策略;和联络游击队的方式…… 到现在为止我们已经把事情说的很清楚了,不需要再给妇女主任专门交代一遍对应关系了吧。

#+begin_src perl
  
  sub taitics_1 {
      ... ...
  }
  
  sub taitics_2 {
      ... ...
  }
  
  sub taitics_3 {
      ... ...
  }
  
  sub move_to_hills {
      ... ...
  }
  
  sub action {
  
      my $danger = shift;
  
      if ( $dander eq "guizi" ) {
          &taitics_1 ( @_ );
      
      } elsif ( $danger eq "weijun" ) {
          &taitics_2 ( @_ );
      
      } elsif ( $danger eq "youjidui" ) {
          &taitics_3 ( @_ );
      
      } elsif ( $danger eq "saodang" ) {
          &move_to_hills( @_ );
      
      }
  }
  
  
  &action( $danger, $..., $... );
  
#+end_src

 

第二种方式呢,对应于下面这些代码:

#+begin_src perl
  
  sub guizi_tactics {
      ... ...
  }
  
  sub weijun_tactics {
      ... ...
  }
  
  sub huanxiangtuan_tactics {
      ... ...
  }
  
  sub weichihui_tactics {
      ... ...
  }
  
  sub xianbingdui_tactics {
      ... ...
  }
  
  sub action {
      my $danger = shift;
  
      &$danger( @_ );
  }
  
  &action( $danger, $..., $... );
  
  
#+end_src


我们可以看到,在第二种方式里面就不需要维护那套对应关系了。即便不考虑日后长期维护的开销,至少也省了一半的力气。程序员的生活就能够轻松很多。

其实呢,还有另外一种办法。可以把区队长的作战经验做成一个百宝囊,给每一个根据地、游击队都领一份儿回去。并不需要区队长亲自去传授,遇到情况他们自己就知道如何应对了。

#+begin_src perl
  
  %instructions = {
      "guizi_tactics" => sub {
          ... ...
      },
      "weijun_tactics" => sub {
          ... ...
      },
      "huanxiangtuan_tactics" => sub {
          ... ...
      },
      "weichihui_tactics" => sub {
          ... ...
      },
      "xianbingdui_tactics" => sub {
          ... ...
      }
  };
  
  
  sub action {
  
      my $instructions = shift;
      my $danger = shift;
    
      &$instructions{$danger}( @_ );
  }
  
  &action ( \%instructions, $danger, $... $... );
  
#+end_src


你们有没有看到第三种方式的厉害?第三种方式把区队长的经验放进了一个哈希表里面,哈希表是一个数据结构,数据结构是能够在运行时被修改的,所以妇女主任就可以随时把自己在战斗中获得的经验加入进去,还可以随时根据敌情对现有的经验进行调整,就可以实现在战斗中学习,在战斗中成长。这是前两种方式做不到的。而且由于采用了百宝囊的形式,所以可以不局限于区队长的作战经验,那个小李庄的经验总结只需要做成一个百宝囊,也马上可以传递过来,在这里使用。这样以来,打鬼子就变的容易得多了,咱们根据地的扩大也就指日可待了。

代码虽然很简单,但是把这些简单的道理和生活联系起来,就变的好玩儿起来了。

 

posted on 2012-08-18 06:11  David Young 杨博华  阅读(3843)  评论(7编辑  收藏  举报

导航