2012-03-09 38 views
1

我們使用OOP perl作爲編程語言來設計這個框架,所以這個類似算法的代碼是用Perl編寫的。處理連接接口的最佳方法

我們正在開發面向終端設備的OOP Perl自動化框架。該端點設備提供HTTP,Telnet和SSH接口來執行特定的一組命令。爲了簡單起見,我們可以假設所有三個連接接口都支持所有命令,爲給定命令生成相同的輸出。

函數被寫入相應的Connection類來處理特定的命令。 例如

sub getVersion { 
    return $http->sendCommand('version'); 
    } 

但是調用這個函數的當前實現很少但是不同。假設,我們想調用getVersion函數,那麼它將被稱爲像這樣。

$device->getVersion(); //This is called through device object rather than connection object. 

由於此功能未在設備類中定義,因此調用AUTOLOAD。在設備類,AUTOLOAD是這樣

sub AUTOLOAD { 
    my $connection = $device->getConnection(); 
    return $connection->$methodName (..); // when called for getVersion, $methodName will become the "getVersion" 
    } 

實現請讓我知道,如果這是實現它一個很好的做法還是應該修改它通過在設備類實現每個命令的功能刪除AUTOLOAD ,是這樣的:

sub getVersion { 
    my $connection = $device->getConnection(); 
    return $connection->getVersion(); 
} 

我們有150多個可通過所有三個接口(HTTP,Telnet或SSH)這樣的命令。

回答

1

Class::Delegator非常適合更清潔的實施。您可以設計一個根行爲的類,如Connected,它定義瞭如何獲得連接。

{ package Connected; 
    use Modern::Perl; 

    sub getConnection { 
     ... 
    } 
} 
{ package ConnectedObject; 
    use Modern::Perl; 
    use parent 'Connected'; 

    use Class::Delegator 
     send => [ 'getVersion' 
       , 'obliterateAllLifeforms' 
       , ... 
       ] 
     to => 'getConnection' 
     ; 
} 
+0

感謝您的回覆!我想真正避免使用AUTOLOAD。我明白,使用它不是一個好習慣。因爲我沒有時間,所以我用它。現在我正在重新考慮代碼,所以想通過跳過AUTOLOAD以更好的方式實現。 – rpg 2012-03-09 14:25:43

+1

@rpg'AUTOLOAD'是一個*工具*。但是你可能不會在其上建立基礎架構。 'AUTOLOAD'只是因爲太多的嚮導問題而受到影響。這在電子表格自動化界面中非常有用,我不得不使用'$ sheet-> A5 + $ sheet-> C4',而不必爲每個單元格名稱編寫代碼,但我想出了更多用於'AUTOLOAD'的函數,我越想將其封裝在行爲模塊中,並因此從出口商的半盲立場安裝'AUTOLOAD'處理程序,我設計了一個AL集成模式,但從未完全編碼 - 因爲它剛剛得到太複雜了。 – Axeman 2012-03-09 17:02:56

+0

很好的答案。謝謝。 – rpg 2012-03-12 08:01:22