处理连接接口的最佳方法

时间:2012-03-09 07:43:15

标签: perl design-patterns

我们使用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。在Device类中,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();
}

我们通过所有三个接口(HTTP,Telnet,SSH)提供了150多个这样的命令。

1 个答案:

答案 0 :(得分: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'
        ;
}