Лучшие способы обработки интерфейса подключения - PullRequest
1 голос
/ 09 марта 2012

Мы используем OOP Perl в качестве языка программирования для разработки этой среды, поэтому этот альго-подобный код написан на Perl.

Мы разрабатываем среду автоматизации в OOP Perl для устройства конечной точки.Это конечное устройство предоставляет интерфейс HTTP, Telnet и SSH для выполнения определенного набора команд.Для простоты мы можем предположить, что все команды поддерживаются всеми тремя интерфейсами подключения, генерируя одинаковый вывод для данной команды.

В соответствующем классе Соединения записана функция для обработки конкретной команды.например,

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();
}

У нас есть 150+ таких команд, доступных через все три интерфейса (HTTP, Telnet, SSH).

1 Ответ

1 голос
/ 09 марта 2012

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'
        ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...