플러그인은 후크, 이벤트 또는 다른 무엇을 사용해야합니까?


24

플러그인이 프로그램 흐름에 반응 할 수있는 앱을 고려하십시오.

나는 이것을 달성하는 두 가지 방법을 알고 있습니다 : 갈고리사건

1. 후크

주 프로그램 흐름 내에서 함수를 비우려면 호출을 사용하십시오. 이러한 기능은 플러그인으로 대체 할 수 있습니다.

예를 들어 Drupal CMS는 모듈과 테마에 사용 가능한 후크를 구현합니다. 다음은 file_copy 함수 에서 hook이 구현되는 방법의 예입니다 .

function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
    // ... [File copying routine]

    // Inform modules that the file has been copied.
    module_invoke_all('file_copy', $file, $source);

    return $file;
    // ...
}

모듈은 in에 modulename_file_copy($file, $source)의해 호출 될 함수를 구현할 수 있습니다 . 이 기능이 완료되면 실행이 재개됩니다.module_invoke_allfile_copyfile_copy

2. 행사

앱에서 이벤트를 전달하면 플러그인에서들을 수 있습니다. 구독 된 이벤트를 수신 한 후 플러그인은 프로그램 흐름을 가로 채고 필요한 작업을 수행합니다.

예를 들어 jQuery 갤러리 플러그인 Fotorama 는 여러 이벤트를 구현합니다 . 예를 들어, 다음 showfotorama:show이벤트 를 발생시키는 메소드 의 일부입니다 .

  that.show = function (options) {
    // ... [show the new frame]

    // [fire the event]
    options.reset || triggerEvent('show', {
      user: options.user,
      time: time
    });

    // ... [do lots of other stuff with navigation bars, etc.]
  };

스크립트는이 이벤트를 듣고 실행될 때 무언가를 수행 할 수 있습니다.

$('.fotorama').on(
  'fotorama:show',
  function (e, fotorama, extra) {
    console.log(e.type + (extra.user ? ' after user’s touch' : ''));
    console.log('transition duration: ' + extra.time);
  }
);

의문

  1. 이러한 플러그인 동작을 구현하는 다른 주류 방법이 있습니까?

  2. 그렇지 않다면 언제 후크를 사용해야합니까? 언제 이벤트를 사용해야합니까? 궁극적 인 목표를 고려하는 것은 앱과 플러그인 개발자의 관점에서 코드를 유지 하고 읽을 수 있게 만드는 것 입니까?

답변:


17

후크와 이벤트의 주요 차이점은 느슨한 결합과 단단한 결합입니다.

후크는 어떤 일이 발생했음을 알리는 일반적인 방법입니다. 플러그인을 다시 컴파일하지 않고도 새 후크를 추가 할 수 있으며 모든 후크는 일반적인 디자인 패턴을 따릅니다. 후크 API가 정의되면 변경되지 않으므로 앱과 플러그인 간의 연결이 끊어지지 않습니다.

이벤트는 앱과 더 밀접하게 연결됩니다. 이벤트는 이벤트에 첨부 된 매개 변수를 정의 할 수 있으며 해당 매개 변수를 변경하면 기존 플러그인으로 API가 중단됩니다.

둘 다 동일한 결과를 얻습니다. 플러그인을 앱에 연결하는 방법에 달려 있습니다.

후크는 새로운 버전의 앱이 출시 될 때 깨지지 않는보다 동적 인 커플 링을 제공 할 수 있지만 플러그인이 더 이상 호환되지 않는다는 컴파일 타임 경고를받지 못한다는 단점이 있습니다.

이벤트는 일부 이벤트 서명이 변경되었으므로 플러그인을 수정해야하는 컴파일 시간 오류를 얻을 수있는 기능을 제공합니다.

다른 접근 방식을 요청했습니다.

명령 :

트리거 된 이벤트에 응답하는 플러그인 대신. 플러그인은 명령 객체를 응용 프로그램으로 푸시합니다. 각 명령 객체는 명령에 사용되는 인터페이스를 구현합니다. 애플리케이션이 기능을 실행해야 할 경우 해당 기능에 대한 모든 명령을 실행합니다. 이것은 콜백 함수 대신 객체로 구현된다는 점을 제외하면 이벤트와 매우 유사합니다.

매크로 :

상황이 발생하면 응답하는 플러그인 대신. 플러그인은 사전에 일이 발생하도록합니다. 매크로는 응용 프로그램 위에서 실행하여 수행 할 작업을 알려주는 작은 고급 언어입니다.

상태 변경 청취자 :

이벤트는 개발자가 미리 예측 한 응용 프로그램에 의해 트리거됩니다. 개발자는 이벤트를 발생시키는 코드를 의도적으로 작성해야합니다. 대신, 다른 접근 방식은 내부 상태가 변경 될 때 객체를 자동으로 브로드 캐스트하는 것입니다. 속성 또는 기타 지표 변경. 그런 다음 플러그인은 이러한 특정 상태 변경을 수신하고 그에 따라 대응할 수 있습니다. 이 방법의 장점은 프로그래머가 이벤트를 브로드 캐스트하는 것을 기억할 필요가 없다는 것입니다. 예를 들어, Document 객체가있을 수 있으며 프로그래머는 문서를 저장해야 함을 표시하는 플래그를 설정합니다. 이 상태 변경은 청취 플러그인으로 브로드 캐스트되며 별표를 포함하도록 문서 제목을 변경하는 플러그인이있을 수 있습니다.


2
대안에 대한 +1, -1 정의와 (커플 링 인수 하지 존재를하지만 커플 링은 당신이 당신의 플러그인 시스템에 제공 중 이름 설계 선택의 결과입니다)

5
또한 이벤트가 발생기에서 관찰자 / 청취자로 이동하는 방법에 대해 가정하고 있다고 생각합니다. 사실은 그 반대입니다. 후크는 단단히 결합되어 있지만 이벤트는 그렇지 않습니다.
Ahmed Masud

3

확실히 이벤트, 그것은 이미 아키텍처 수준에서 필요한 추상화를 허용합니다.

플러그인을 작성하는 사람이 실제로 문서화되거나 어떤 식 으로든 올바른 것으로 기대하지 마십시오. 나는 수백만 명의 사용자와 함께 잘 문서화 된 API를 유지해 왔으며 기본적으로 아무도 문서를 읽지 않고 거의 API를 올바르게 사용하지 않는 매우 고통스러운 경험을 알려줄 수 있습니다.

후크가있는 다음 예제를 보자. 20 개의 플러그인이 실행중인 시스템이있다. 이러한 플러그인 중 하나 file_copy는 문서화 된 방식으로 메소드를 호출하고 문서화 된대로 결과를 기대합니다. 그러나 일부 다른 플러그인이 해당 기능을 연결했기 때문에 다음 문제 중 하나가 충돌 또는 오작동을 유발합니다.

  • 후크 기능은 단순히 충돌합니다. 다른 모든 플러그인은 더 이상 file_copy를 사용할 수 없거나 기능이 예상과 다르게 작동하기 때문에 문제가 해결되었습니다.
  • 입력 내용은 설명서에 따라 정확하지만 다른 플러그인은 예상하지 않으며 이상한 결과 또는 충돌을 제공합니다.
  • 호출은 제대로 실행되지만 더 이상 설명서에 따라 예상되는 결과가 아니므로 플러그인이 실패하거나 충돌합니다.

해당 플러그인 내에서 동일한 문제가있는 이벤트에서 위와 동일하게 수행하면 다음이 발생합니다.

  • 플러그인 X의 이벤트 기능이 충돌하지만 다른 모든 기능은 정상적으로 작동합니다. 그러나 해당 플러그인은 관련이 없으므로 다른 플러그인이 계속 작동하는 동안 충돌하는 플러그인을 비활성화 할 수 있습니다.
  • 이상한 입력은 함수에 의해 올바르게 처리 될 수 있으며 각 플러그인에 대해 가능한 모든 것을 개별적으로 올바르게 확인할 수 있습니다. 플러그인 개발자는 이제 자신의 플러그인을 실제로 테스트 할 수있는 안정적이고 신뢰할 수있는 방법을 가지게되었습니다. 하나의 플러그인이 잘못된 입력을 제공하면 해당 플러그인과 분리 될 수 있습니다.
  • 마찬가지로 모든 상황에서 결과를 올바르게 확인하고 정의 할 수 있으므로 플러그인 개발자는 테스트 할 수있는 해당 기능으로부터 안정적이고 신뢰할 수있는 답변을 얻을 수 있습니다.

1

상속은 옵션 일 수 있습니다.

후크 이외의 상속에는 추가 메소드 정의가 필요하지 않으며, 후크 된 것이없는 경우 빈 메소드를 호출해도 성능 손실이 없습니다.

이벤트 이외의 상속에는 이벤트 호출을위한 추가 코드가 필요하지 않습니다.

그러나 한 유형의 동작을 수정하는 플러그인이 하나만있는 경우 상속이 가장 잘 작동합니다. 많은 플러그인이 필요한 경우 두 번째 플러그인은 첫 번째 플러그인에서 파생되어야하는데 이는 적합하지 않습니다.


-1 상속을 사용하고 인스턴스화 코드를 변경하여 스펙과 오용 상속을 사용하도록 변경하십시오. 새로운 동작은 기본 응용 프로그램과 다른 목적을 가지고 있기 때문입니다.
SparK

0

확실히 사건. 이를 통해 아키텍처의 확장 성이 향상됩니다.

예를 들어 플러그인을 별도의 시스템에 배치해야 할 경우 어떻게 될지 상상해보십시오. 이벤트 사용-이벤트 네트워크를 기반으로 작은 코드를 수정하기 만하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.