2012-03-09 4 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" 
    } 

Пожалуйста, дайте мне знать, если это хорошая практика, чтобы осуществить его, или я должен изменить его, чтобы удалить автозагрузку путем реализации функции для каждой команды в классе устройств , что-то вроде:

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

+1

@rpg 'AUTOLOAD' является * инструментом *. Но вы, вероятно, правы, чтобы не основывать на нем инфраструктуру. 'AUTOLOAD' просто страдает от проблемы слишком многих мастеров. Это было полезно в интерфейсе автоматизации электронной таблицы, который мне приходилось делать как '$ sheet-> A5 + $ sheet-> C4' и не иметь кода для каждого имени ячейки, но чем больше я придумывал использование для' AUTOLOAD', тем больше я хотел инкапсулировать его в модули для поведения и, как результат, установить обработчики 'AUTOLOAD' из полуслепой позиции экспортера, я разработал шаблон интеграции AL, но не полностью его закодировал - потому что он просто получил слишком сложным. – Axeman

+0

отличный ответ. Благодарю. – rpg

Смежные вопросы