2012-03-09 8 views
1

私たちはこのフレームワークを設計するためのプログラミング言語としてOOP perlを使用しています。したがって、このalgoのようなコードはPerlにあります。接続インタフェースを扱う最良の方法

私たちは、OOP Perlでエンドポイントデバイス用の自動化フレームワークを開発しています。このエンドポイントデバイスは、特定のコマンドセットを実行するためのHTTP、Telnet、およびSSHインターフェイスを提供します。わかりやすくするために、すべてのコマンドが3つの接続インタフェースすべてでサポートされており、特定のコマンドに対して同じ出力を生成すると仮定できます。

特定のコマンドを処理するために、関数がそれぞれの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(); 
} 

このようなコマンドは、3つのすべてのインターフェイス(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

+1

@rpg 'AUTOLOAD'は*ツール*です。しかし、インフラストラクチャを基盤にしないのはおそらく正しいでしょう。 'AUTOLOAD'はあまりにも多くのウィザードの問題を抱えているだけです。私は '$ sheet-> A5 + $ sheet-> C4'のようなものを作って、すべてのセル名をコード化する必要がないスプレッドシートの自動化インターフェースでは役に立ちましたが、AUTOLOADの使用方法が増えれば増えるほど、私はその動作のためにモジュールにカプセル化したいと思っていました。その結果、AUTOLOADハンドラを輸出者のセミブラインドスタンスからインストールしましたが、私はALの統合パターンを設計しましたが、複雑すぎる。 – Axeman

+0

すばらしい答え。ありがとう。 – rpg

関連する問題