Perl 处理连接接口的最佳方法

Perl 处理连接接口的最佳方法,perl,design-patterns,Perl,Design Patterns,我们使用OOP perl作为编程语言来设计这个框架,所以这个类似于算法的代码是用perl编写的 我们正在用面向对象的Perl语言为终端设备开发一个自动化框架。这个终端设备提供了一个HTTP、Telnet和SSH接口来执行特定的命令集。为简单起见,我们可以假设所有命令都受所有三个连接接口的支持,为给定命令生成相同的输出 在相应的连接类中编写一个函数来处理特定命令。 e、 g 但当前调用此类函数的实现很少,但有所不同。假设,我们想调用getVersion函数,那么它将被这样调用 $device-&g

我们使用OOP perl作为编程语言来设计这个框架,所以这个类似于算法的代码是用perl编写的

我们正在用面向对象的Perl语言为终端设备开发一个自动化框架。这个终端设备提供了一个HTTP、Telnet和SSH接口来执行特定的命令集。为简单起见,我们可以假设所有命令都受所有三个连接接口的支持,为给定命令生成相同的输出

在相应的连接类中编写一个函数来处理特定命令。 e、 g

但当前调用此类函数的实现很少,但有所不同。假设,我们想调用getVersion函数,那么它将被这样调用

$device->getVersion(); //This is called through device object rather than connection object.
由于此函数未在设备类中定义,因此将调用AUTOLOAD。在设备类中,自动加载是这样实现的

sub AUTOLOAD {
  my $connection = $device->getConnection();
  return $connection->$methodName (..); // when called for getVersion, $methodName will become the "getVersion"
  }
请让我知道这是否是一个很好的实践来实现它,或者我应该通过为设备类中的每个命令实现一个函数来修改它以删除自动加载,例如:

sub getVersion {
    my $connection = $device->getConnection();
    return $connection->getVersion();
}
我们有150多个这样的命令可通过所有三个接口(HTTP、Telnet、SSH)使用。

非常适合更干净的实现。您可能会设计一个作为根行为的类,比如
Connected
,它定义了如何获得连接

{   package Connected;
    use Modern::Perl;

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

    use Class::Delegator 
        send => [ 'getVersion'
                , 'obliterateAllLifeforms'
                , ... 
                ]
        to   => 'getConnection'
        ;
}
非常适合于更干净的实现。您可能会设计一个作为根行为的类,比如
Connected
,它定义了如何获得连接

{   package Connected;
    use Modern::Perl;

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

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

谢谢你的回复!!我想真正避免使用自动加载。我明白,使用它不是一个好的做法。因为,我没有时间,所以我用了它。现在我正在重新分解代码,所以我想通过跳过自动加载来更好地实现。@rpg
AUTOLOAD
是一个工具。但您不将基础设施建立在它之上可能是正确的<代码>自动加载只是遇到了向导太多的问题。它在电子表格自动化界面中很有用,我必须制作
$sheet->A5+$sheet->C4
这样的东西,而且不必为每个单元格名称编码,但我越想使用
自动加载
,我就越想将其封装在模块中,以实现行为,因此,从导出器的半盲立场安装
自动加载
处理程序,我设计了一个AL集成模式,但从未完全编码过它——因为它太复杂了。正如您所说,Class::Delegator非常适合更干净的实现。但正如我看到的,我需要为我的150多个这样的函数编写它(send=>,to=>)。所以我只想考虑一下自动加载确实不起作用的任何缺点。因为对于Class::Delegation,我们似乎需要为我们将要添加的任何新方法添加一个新条目。请帮助我理解这一点@rpg,如果您只想将方法调用发送到connection属性,那么您只需要编写150多个方法的名称就可以将它们发送到那里。因此,您的规范==与自动加载不同。自动加载的一个问题是它没有在正确的位置创建方法<代码>$obj->can('getVersion')将失败。因此,在我使用AL的后期,我超越了
can
,创建了
\u can\u work
来处理创建存根的工作。(续)@rpg,您始终可以创建一个允许
Class::Delegate
执行其工作的函数<代码>子类::Delegator::delegate{shift;my$package\u name=shift;my@args=@;local$EVAL\u错误;返回if EVAL“{package$package\u name;Class::Delegator->import(\@args);};1;;“Carp::croak($EVAL\u ERROR)if$EVAL\u ERROR;}谢谢您的回复!!我想真正避免使用自动加载。我明白,使用它不是一个好的做法。因为,我没有时间,所以我用了它。现在我正在重新分解代码,所以我想通过跳过自动加载来更好地实现。@rpg
AUTOLOAD
是一个工具。但您不将基础设施建立在它之上可能是正确的<代码>自动加载只是遇到了向导太多的问题。它在电子表格自动化界面中很有用,我必须制作
$sheet->A5+$sheet->C4
这样的东西,而且不必为每个单元格名称编码,但我越想使用
自动加载
,我就越想将其封装在模块中,以实现行为,因此,从导出器的半盲立场安装
自动加载
处理程序,我设计了一个AL集成模式,但从未完全编码过它——因为它太复杂了。正如您所说,Class::Delegator非常适合更干净的实现。但正如我看到的,我需要为我的150多个这样的函数编写它(send=>,to=>)。所以我只想考虑一下自动加载确实不起作用的任何缺点。因为对于Class::Delegation,我们似乎需要为我们将要添加的任何新方法添加一个新条目。请帮助我理解这一点@rpg,如果您只想将方法调用发送到connection属性,那么您只需要编写150多个方法的名称就可以将它们发送到那里。因此,您的规范==与自动加载不同。自动加载的一个问题是它没有在正确的位置创建方法<代码>$obj->can('getVersion')将失败。因此,在我使用AL的后期,我超越了
can
,创建了
\u can\u work
来处理创建存根的工作。(续)@rpg,您始终可以创建一个允许
Class::Delegate
执行其工作的函数<代码>子类::Delegator::delegate{shift;my$package\u name=shift;my@args=@;local$EVAL\u错误;返回if EVAL“{package$package\u name;Class::Delegator->import(\@args);};1;;“Carp::croak($EVAL\u ERROR)if$EVAL\u ERROR;}