2012-03-09 2 views
1

우리는이 프레임 워크를 디자인하기 위해 프로그래밍 언어로서 OOP perl을 사용하고 있습니다. 따라서이 algo와 유사한 코드는 Perl에 있습니다.연결 인터페이스를 처리하는 가장 좋은 방법

우리는 OOP Perl에서 엔드 포인트 장치 용 자동화 프레임 워크를 개발 중입니다. 이 종단 장치는 HTTP, 텔넷 및 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" 
    } 

처럼 구현되는이 그것을 구현하는 좋은 방법이 있으면 알려 주시기 아니면 디바이스 클래스의 각 명령에 대한 기능을 구현하여 AUTOLOAD을 제거하기 위해 수정해야하십시오 예를 들면 다음과 같습니다.

sub getVersion { 
    my $connection = $device->getConnection(); 
    return $connection->getVersion(); 
} 

세 가지 인터페이스 (HTTP, Telnet, SSH)를 통해 150 개 이상의 명령을 사용할 수 있습니다.

답변

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를 사용하는 것이 더 많았습니다. 행동을위한 모듈에 캡슐화하고 싶을수록 수출 업체의 세미 블라인드 (semi-blind) 자세에서'AUTOLOAD' 핸들러를 설치하기 때문에 AL 통합 패턴을 설계했지만 코드를 완전히 코딩하지 않았습니다. 너무 복잡합니다. – Axeman

+0

좋은 답변입니다. 감사. – rpg

관련 문제