Мы используем 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).
Спасибо за ваш ответ !! Я хочу действительно избежать использования AUTOLOAD. Я понимаю, что это не очень хорошая практика. Поскольку у меня не было времени, поэтому я использовал его. Теперь я перераспределяю код, поэтому думаю, что лучше реализовать, пропустив AUTOLOAD. – rpg
@rpg 'AUTOLOAD' является * инструментом *. Но вы, вероятно, правы, чтобы не основывать на нем инфраструктуру. 'AUTOLOAD' просто страдает от проблемы слишком многих мастеров. Это было полезно в интерфейсе автоматизации электронной таблицы, который мне приходилось делать как '$ sheet-> A5 + $ sheet-> C4' и не иметь кода для каждого имени ячейки, но чем больше я придумывал использование для' AUTOLOAD', тем больше я хотел инкапсулировать его в модули для поведения и, как результат, установить обработчики 'AUTOLOAD' из полуслепой позиции экспортера, я разработал шаблон интеграции AL, но не полностью его закодировал - потому что он просто получил слишком сложным. – Axeman
отличный ответ. Благодарю. – rpg