寫程序其實是一件很好玩兒的事 - 高家庄,馬家河子版


寫程序的確是一件很好玩兒的事情。我一直覺得我們程序員的功底不比那些搞文學的差到哪兒去,我們只是用的語言不同罷了。寫程序其實也是在講話。我曾經寫過一篇文章給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


你們有沒有看到第三種方式的厲害?第三種方式把區隊長的經驗放進了一個哈希表里面,哈希表是一個數據結構,數據結構是能夠在運行時被修改的,所以婦女主任就可以隨時把自己在戰斗中獲得的經驗加入進去,還可以隨時根據敵情對現有的經驗進行調整,就可以實現在戰斗中學習,在戰斗中成長。這是前兩種方式做不到的。而且由於采用了百寶囊的形式,所以可以不局限於區隊長的作戰經驗,那個小李庄的經驗總結只需要做成一個百寶囊,也馬上可以傳遞過來,在這里使用。這樣以來,打鬼子就變的容易得多了,咱們根據地的擴大也就指日可待了。

代碼雖然很簡單,但是把這些簡單的道理和生活聯系起來,就變的好玩兒起來了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM