日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
解析Perl面向?qū)ο缶幊痰膬煞N實現(xiàn)方式

本文和大家重點討論一下Perl面向?qū)ο缶幊痰膬煞N實現(xiàn)和比較,這里比較了在Perl中兩種主流的面向?qū)ο缶幊痰膶崿F(xiàn)方式,并且深刻地剖析了兩種實現(xiàn)的技術(shù)內(nèi)幕,并且提供了可供讀者直接使用的代碼和模塊示例。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)格爾木免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

Perl面向?qū)ο缶幊痰膬煞N實現(xiàn)和比較

本文比較了在Perl中兩種主流的面向?qū)ο缶幊痰膶崿F(xiàn)方式,基于匿名哈希表的實現(xiàn)和基于數(shù)組的實現(xiàn)。深刻地剖析了兩種實現(xiàn)的技術(shù)內(nèi)幕,并且提供了可供讀者直接使用的代碼和模塊示例。在文章的***作者比較了兩種實現(xiàn)方式的優(yōu)劣,并對讀者給出了在實際工作中選擇何種方式實現(xiàn)面向?qū)ο缶幊痰慕ㄗh。

背景

我們常??梢詮能浖こ痰臅臀恼轮校蛘唔椖拷?jīng)理的口中,聽到面向?qū)ο缶幊踢@樣的字眼。與大多數(shù)時髦的技術(shù)用詞不同,面向?qū)ο缶幊痰拇_可以為我們的軟件設(shè)計和開放工作帶來本質(zhì)性的變化。Perl作為一種成熟的“面向過程”的語言,同樣也提供了對于面向?qū)ο缶幊痰闹С帧?/p>

一個好的“面向?qū)ο蟆暗脑O(shè)計不僅是以數(shù)據(jù)為中心,它還盡力地封裝并且隱藏了實際的數(shù)據(jù)結(jié)構(gòu),而且只對外界開放有限的,具備良好文檔的接口。在下文中,我們將看到如何使用Perl語言的特性來實現(xiàn)這些面向?qū)ο笤O(shè)計的優(yōu)點的。

Perl中有兩種不同地面向?qū)ο缶幊痰膶崿F(xiàn),一是基于匿名哈希表的方式,每個對象實例的實質(zhì)就是一個指向匿名哈希表的引用。在這個匿名哈希表中,存儲來所有的實例屬性。二是基于數(shù)組的方式,在定義一個類的時候,我們將為每一個實例屬性創(chuàng)建一個數(shù)組,而每一個對象實例的實質(zhì)就是一個指向這些數(shù)組中某一行索引的引用。在這些數(shù)組中,存儲著所有的實例屬性。

Perl面向?qū)ο缶幊痰母拍?/strong>

首先,我們定義幾個預(yù)備性的術(shù)語。
實例(instance):一個對象的實例化實現(xiàn)。
標識(identity):每個對象的實例都需要一個可以唯一標識這個實例的標記。
實例屬性(instanceattribute):一個對象就是一組屬性的集合。
實例方法(instancemethod):所有存取或者更新對象某個實例一條或者多條屬性的函數(shù)的集合。
類屬性(classattribute):屬于一個類中所有對象的屬性,不會只在某個實例上發(fā)生變化。
類方法(classmethod):那些無須特定的對性實例就能夠工作的從屬于類的函數(shù)。

基于匿名散列表的方法

首先我們來談?wù)劵谀涿⒘斜淼拿嫦驅(qū)ο髮崿F(xiàn)。首先,我們需要定一個匿名散列表,并用一個引用指向這個匿名散列表。如清單1所示,我們定義了一個初始化函數(shù)來封裝這個匿名散列表的初始化過程。這個函數(shù)接受參數(shù)作為初始值,并且用這些值初始化其內(nèi)部包含的匿名散列表,并且返回一個指向這個匿名散列表的引用。在這個例子當中,我們創(chuàng)建了一個Person模塊,并且定義了一個可以實例化模塊Person的new函數(shù)。

清單1.基于匿名哈希表的面向?qū)ο缶幊?/p>

 
 
 
  1. packagePerson;  
  2. subnew{  
  3. my($name,$age)=@_;  
  4. my$r_object={  
  5. “name”=>$name,  
  6. “age”=>$age  
  7. }  
  8. return$r_object;  
  9. }  
  10.  
  11. my$personA=Person->new(“Tommy”,22);  
  12. my$personB=Person->new(“Jerry”,30);  
  13. print“PersonA’sname:”.$personA->{name}.“age:”.$personA->{age}.”.\n”;  
  14. print“PersonB’sname:”.$personB->{name}.“age:”.$personB->{age}.”.\n”;  
  15.  

但是,現(xiàn)在的這個方案有一個致命的缺點,Perl的編譯器并不知道如何new函數(shù)所返回的指向匿名哈希表的引用屬于哪個類(模塊)。這樣的話,如果要使用類中的實例方法,只能直接標出方法所屬于的類(模塊)的名字,并將引用作為方法的***個參數(shù)傳遞給它,

基于匿名散列表的方法中的繼承:

Perl允許一個模塊在一個特殊的名為@ISA的數(shù)組中制定一組其他模塊的名稱。當在模塊中找不到某個實例方法時,它就為檢查那個模塊的@ISA是否被初始化。如果已經(jīng)初始化了,它就為檢查其中的某個模塊是否支持這個“缺少”的函數(shù)。如果它按照深度優(yōu)先的層次結(jié)構(gòu)搜索@ISA數(shù)組并且發(fā)現(xiàn)同名的方法,它會調(diào)用***個被發(fā)現(xiàn)的同名方法并將控制權(quán)交給它。我們利用Perl語言的這個特性實現(xiàn)了繼承。

考慮這樣一個類的層次,我們定義一個Employee類,繼承于基類Person,如清單5所示。
我們將類名Person放入包Employee的ISA數(shù)組中,這樣當調(diào)用一個在包Employee中沒有定義的函數(shù)時,Perl編譯器會自動在Person類尋找這個函數(shù)。當用戶調(diào)用new函數(shù)初始化一個Employee對象實例的時候,Employee的new函數(shù)會在內(nèi)部調(diào)用它的基類的new函數(shù),并且返回一個包含部分以初始化的基類實例屬性的匿名哈希表。接著Employee的new函數(shù)將繼續(xù)執(zhí)行new函數(shù)的剩余代碼,完成屬于Employee自身的初始化工作,為Employee中剩余的實例屬性賦值。

基于數(shù)組的方法

基于匿名哈希表的面向?qū)ο缶幊谭椒ㄖ杏袃蓚€明顯的不足:一是無法為屬性提供一種訪問限制,限制外部對內(nèi)部屬性的訪問和改變。二是在處理大規(guī)模的實例的情況下,系統(tǒng)的內(nèi)存開銷頗大。100個實例意味著將創(chuàng)建100個散列表,這100個散列表都要為插入新紀錄的操作而分配額外的存儲空間。除了基于匿名散列表的實現(xiàn),我們也可以利用數(shù)組來存儲屬性,實現(xiàn)面向?qū)ο蟮木幊獭?/p>

整個實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)非常簡單,我們將為每一個類的實例屬性分配一個數(shù)組(見圖一,圖中的每一列對應(yīng)于類的一個實例屬性),而每一個新的實例將是跨越所有數(shù)組列的一個切片(圖中的每一個被使用的行對應(yīng)于類的一個實例)。每次需要實例化一個新的對象,new函數(shù)將被調(diào)用。一個新的邏輯行將被分配,新的實例的實例屬性將以新的行偏移量插入到相應(yīng)的屬性列當中去。

基于數(shù)組的方法中的繼承

基于數(shù)組的方法中的繼承與基于匿名哈希表的方法中的繼承完全一樣。我們設(shè)計的InsideOut類中利用@ISA數(shù)組提供了對繼承的支持。

總結(jié)

相比于基于匿名哈希表的方法,基于數(shù)組的方法對存取屬性的訪問提供了更好的控制和保護并且實現(xiàn)了對于對象的封裝,同時也提高了存儲空間的利用效率。但是基于匿名哈希表的方法也有著簡單易學(xué),邏輯上較為直觀而且無需要第三方模塊支持的優(yōu)點。具體使用哪種方式實現(xiàn)面向?qū)ο蟮脑O(shè)計,還要在工作中根據(jù)實際情況進行考慮才對。


文章題目:解析Perl面向?qū)ο缶幊痰膬煞N實現(xiàn)方式
網(wǎng)站鏈接:http://www.dlmjj.cn/article/dhsiicp.html