天天看點

養成良好的Perl OOP習慣

如果你曾經用Perl開發過應用程式,那你可能用過很多程式子產品。而且你還可能天天用到這些程式包的面向對象接口。但是,如果你像那些普通的Perl程式員一樣,在開發自己的代碼時都不試着使用面向對象技術。那麼,這篇文章可以幫助你成為一位習慣面向對象程式設計的Perl開發者。

  

   OOP速成

  面向對象程式設計(OOP)的基本思想非常簡單,說不定你可能已在有限場合下用過這種技術了。所謂對象不過是資料的集合,而這些資料又千絲萬縷地聯系在一起。不妨考慮下面的例子:假設某個哈希散列裝載的是說明球類特性的資料,這樣哈希散列的鍵(key)就可能牽扯到球的顔色、直徑以及制造材料等。而OOP的方法(method)隻是處理每個球類資料的哈希散列子程式,這種子程式在操作每個球有關資料時會采用相應的定義字段。

  

   什麼是哈希散列?

  小型的哈希散列基本上不會占用什麼記憶體,對系統的性能不會有大的影響,你完全可以放心地用它們把對象資料歸攏到一起來。如果你不知道Per語言中的l哈希數組(也叫作聯合數組),那你可沒好好利用Perl。普通的數組結構按照資料的位置命名單個條目;而在哈希數組裡,你能給條目命名(叫作鍵:key)。其實不妨把哈希散列想象為一個小資料庫。給出一個名字就可以通過它查出一條記錄。Perl程式設計時在指令行上運作“perldoc perldata”可以查閱Perl資料類型和結構的有關文檔。

  

  OOP不僅僅隻把你的資料和子程式組織為互相關聯的集合,它還保證了對象及其方法實際連接配接的編譯和運作(runtime)時。那樣,你就不必直接調用哈希數組的ball_volume值了。OOP語言還進一步的提供了莫大的好處,OOP語言簡化了程式設計句法而且為聲明複雜的、對象-對象關系提供了大量的其它特性。

  

  在最簡單的情況下,每個對象都會告訴Perl它是什麼種類的對象,這樣,隻有知道如何安全地操作該對象的子程式才會被調用。開發人員則隻需使用方法的名字即可。如果你調用book對象的volume值,它會告訴你目前該數值該圖書資料中的位置而不會告訴你它真正占用了多少體積空間。

  

   習慣 #1 :使用哈希散列

  請把相關的資料通過小哈希散列收集起來。以前你可能建立過諸如$red、$green以及$blue之類的一整套變量。但不久你就認識到你需要2或3個集合把這些變量修改為$a_red、$b_red、$c_red來差別不同對象的屬性,對綠色(green)和藍色(blue)變量也同樣如此。是以請把這9個變量修改為% a_color、% b_color和%c_color的3個哈希散列,而把r、g和b選作參數。

  

  在CPAN内,幾乎每一個子產品都封裝成了哈希散列。把成組關聯的資料包含在哈希散列内是一種優秀的面向對象程式設計技術。這樣做的話你聲明的變量就少多了,資料也組織得更為合理。同時還提高了可靠性,因為諸如$boy{height}之類的變量實際上自身就包含了明顯的含義。清單A即是一例。

  

   習慣 #2 :使用子程式

  下一個好習慣是使用子程式來圍繞那些資料集合組織你的代碼。盡量地把哈希散列上成塊代碼分組到子程式裡。保證你傳遞的是集合而非單個的值。調用invert_new ( /%color )顯然比調用invert_old (/$reda , /$greena , /$bluea );更合理。至少你不需要記得參數的順序。

  

  子程式把代碼組織得更有邏輯了;程式宛如從子程式檔案的頭頂略過而底下的工作全然不知。可以把所有的變量都傳遞給子程式,重用代碼就輕松多了,新的程式使用不同的全局變量,而其中某些全局變量還用于其他完全不同的用途。至少小型的子程式在調試的時候也友善多了,在這種情況下,所有你需要了解的代碼剛好占一屏(參看程式清單B)。看,這有多友善!

  

   習慣 #3 :重用

  第3個良好的OOP習慣是把子程式收集起來放進一個單獨的檔案供以後再次使用他們。你還應該精制它們使之能用于一般用途。此外還應該在多個腳本中使用這些子程式而且對它們不斷地進行調試。現在你不妨把采用某個特定哈希散列的所有的子程式都組合進一個檔案,這就算走出了重用代碼的第1步。

  

  采取以上的做法隻需把子程式放進某個檔案,再使用的時候采用“require”關鍵詞即可。已經不用的子程式就别這麼做了;那純粹是浪費時間。保證它們能工作就行了。清單C是一個比較不錯的例子。

  

   習慣 #4 :保護哈希散列

  保護你的哈希散列。不要直接建立哈希,最好是對用來建立哈希的資料進行再次檢查之後添加一個傳回哈希散列索引的子程式。然後,再添加一些微小的子程式傳回哈希散列中的各個值以便安全地修改它們。這些代碼示例如清單D所示。

  

  這樣處理小子程式,可以讓你在改變規則的時候可以更容易找出錯誤所在。是以,不要在程式中編寫那些修改哈希散列的代碼,你應該把這些代碼移到函數庫中去。

  

   益處

  以上這些建議歸根結底就是一句話:哈希散列把資料關聯了起來,編寫采用整個哈希散列的子程式,把聯系某一哈希散列的子程式收集到一個簡單的庫内,保護你的哈希散列庫。這些小技巧幾乎沒有增加什麼工作量但卻具有極好的組織性。但這些工作在你建立面向對象的子產品時占了90%以上的比重。

  

  如果你保證哈希索引首先發送給了每個子程式。而且你隻通過庫函數同哈希散列内部打交道,那麼你基本上隻需要為你的子產品起個名字即可。這樣就讓 Perl 知道它應該把你的哈希散列當作一個對象。你的代碼庫要變成子產品甚至很可能不需要20行代碼。