2008-08-11 9 views
15

확장 성 기능을 코드에 프로그래밍하는 일반적인 절차가 있습니까?플러그인 기능 추가 제안 사항?

시스템의 핵심 코드를 수정하지 않고 플러그인 API를 통해 기능을 확장 할 수 있도록 작성하는 시스템에 확장 기능을 추가하는 일반적인 절차가 무엇인지 궁금합니다.

그런 일은 시스템이 작성된 언어에 따라 좌우되는 경향이 있습니까? 아니면이를 허용하는 일반적인 방법이 있습니까?

답변

3

이것은 일반적으로 사용자가 직접 노출해야하는 항목이므로 시스템이 작성된 언어에 따라 달라집니다 (다른 언어의 래퍼를 작성할 수도 있음).

예를 들어, C로 작성된 프로그램이있는 경우 Windows 용 플러그인은 프로그램 용으로 DLL로 작성됩니다. 런타임에는 이러한 DLL을 수동으로로드하고 일부 인터페이스를 해당 DLL에 노출합니다. 예를 들어 DLL에서 함수 포인터로 채워진 구조를 허용 할 수있는 gimme_the_interface() 함수를 노출 할 수 있습니다. 이 함수 포인터는 DLL이 호출, 콜백 등을 등록 할 수있게 해준다.

만약 당신이 struct 대신 객체 포인터를 넘기면 DLL 시스템을 사용하게된다. 기능을 제공하는 인터페이스 구현 (구조체와 동일한 일을하지만 덜 못생긴). Java의 경우 DLL 대신 클래스 파일을로드하지만 기본 아이디어는 동일합니다.

모든 경우에 플러그인을 초기화하고 플러그인이 사용자와 상호 작용할 수 있도록 코드와 플러그인 간의 표준 인터페이스를 정의해야합니다.

P. C++ 플러그인 시스템의 좋은 예를 보려면 foobar2000 SDK을 확인하십시오. 나는 꽤 오랫동안 그것을 사용하지 않았지만, 실제로는 잘 사용되었습니다. 나는 아직도 그것이라고 추정한다.

+0

예, 나는 그것이이 같은 해답이 될 것이라고 두려워했다 춘분 (http://www.eclipse.org/equinox/)에있는 최고의 하나 IMHO은 OSGi (http://en.wikipedia.org/wiki/OSGi)입니다. 여전히, 그것은 당신이 플러그인이 내가 할 수있는 것을 완벽하게 제어 할 수 있다는 것을 의미한다. – kaybenleroll

1
  1. 플러그인 작성자에 넣고 싶은 최소 요구 사항을 확인하십시오. 그런 다음 코드를 실행할시기와 위치를 알기 위해 작성자가 구현해야하는 하나 이상의 인터페이스를 만듭니다.

  2. 작성자가 코드의 일부 기능에 액세스하는 데 사용할 수있는 API를 만듭니다.

또한 작성자가 상속해야하는 기본 클래스를 만들 수도 있습니다. 이렇게하면 API를 쉽게 연결할 수 있습니다. 그런 다음 어떤 종류의 리플렉션을 사용하여 디렉토리를 스캔하고 요구 사항에 맞는 클래스를로드하십시오.

어떤 사람들은 시스템을위한 스크립팅 언어를 만들거나 기존 언어의 하위 집합에 대한 인터프리터를 구현합니다. 이것은 가능한 이동 경로이기도합니다.

결론은 다음과 같습니다. 코드를로드하면 상상력 만이 멈출 수 있습니다.
행운을 빕니다.

4

이전에는 플러그인 용 이벤트 기반 API를 사용했습니다. 이벤트를 전달하고 응용 프로그램 상태에 대한 액세스를 제공하여 플러그인 용 후크를 삽입 할 수 있습니다.

예를 들어 블로그 응용 프로그램을 작성하는 경우 새 게시물이 데이터베이스에 저장되기 직전에 이벤트를 발생시키고 플러그인에 게시물 HTML을 제공하여 필요에 따라 변경할 수 있습니다.

2

나는이 일반적인 질문에 대한 디자인 패턴 책을 가리 키도록 유혹 해요 : P

을 진심으로, 내가 대답은 전혀 생각하지 않습니다. 기본적으로 확장 가능한 코드를 작성할 수는 없으며, 쓰기/확장이 어렵고 비효율적입니다 (Mozilla는 확장 성이 뛰어나고 모든 곳에서 XPCOM을 사용했으며, 이제는 실수 였음을 깨닫고 제거하기 시작했습니다. 어디 그것은 이해가되지 않습니다).

의미있는 확장은 의미있는 확장이 가능한 시스템 부분을 식별하고 이러한 경우에 적합한 API를 지원하는 것입니다 (예 : 편집기의 언어 지원 플러그인). 관련 패턴을 사용 하겠지만 특정 구현은 플랫폼/언어 선택에 따라 다릅니다.

IMO는 또한 동적 언어를 사용하는 데 도움이되므로 런타임에 핵심 코드를 조정할 수 있습니다 (절대적으로 필요한 경우). Mozilla의 확장 성은 Firefox 확장 기능을 작성할 때 이와 같은 방식으로 작동합니다.

1

C 또는 C++와 같은 컴파일 된 언어를 사용하는 경우 스크립팅 언어를 통해 플러그인 지원을 보는 것이 좋습니다. Python과 Lua는 많은 수의 응용 프로그램을 스크립팅하는 데 사용되는 우수한 언어입니다 (Civ4 및 블렌더 사용 Python, Supreme Commander는 Lua를 사용합니다).

C++을 사용하는 경우에는 부스트 파이썬 라이브러리를 확인하십시오. 그렇지 않으면, 파이썬은 C에서 사용할 수있는 헤더와 함께 배송되며, C/python API를 문서화하는 꽤 좋은 일을합니다. 문서는 루아에 대해서는 덜 완성 된 것 같았지만 충분히 열심히 보지 못했을 수도 있습니다. 어쨌든 끔찍한 일없이 스크립트 플랫폼을 제공 할 수 있습니다. 여전히 사소한 것은 아니지만, 당신에게 일할 수있는 좋은 기반을 제공합니다.

시스템의 디자인은 확장 될 (디자인 패턴, 제어 및 기타 아키텍처 측면의 반전) (http://www.martinfowler.com/articles/injection.html) :

2

나는이 개 질문에 대한 측면이 있다고 생각합니다. 그리고 적어도 저에게 그렇습니다. 이러한 패턴/기법은 플랫폼/언어와 무관하며 "일반적인 절차"로 볼 수 있습니다.

이제 구현 언어 및 플랫폼 dependend (당신은 동적 라이브러리 물건이 C/C++에서 예를 들어, 등등)입니다

여러 가지가 '프레임 워크'당신을 제공하는 프로그래밍 환경을 제공하기 위해 개발되었다

pluggability/extensibility 그러나 다른 사람들이 언급했듯이 모든 것을 플러그 가능하게 만드는 것은 너무 미쳐 버리지 마십시오. 좋은 사양 보는 자바 세계에서

여러 구현과