문제

코드에 확장성 기능을 프로그래밍하기 위한 일반적인 절차가 있습니까?

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

그러한 것들은 시스템이 작성된 언어에 의존하는 경향이 있습니까? 아니면 이를 허용하는 일반적인 방법이 있습니까?

도움이 되었습니까?

해결책

이는 일반적으로 사용자가 직접 노출해야 하는 것이므로 시스템이 작성된 언어에 따라 달라집니다(다른 언어에 대한 래퍼를 작성하는 것도 가능한 경우가 종종 있음).

예를 들어, Windows용 C로 작성된 프로그램이 있는 경우 플러그인은 프로그램용 DLL로 작성됩니다.런타임 시 이러한 DLL을 수동으로 로드하고 여기에 일부 인터페이스를 노출합니다.예를 들어 DLL은 다음을 노출할 수 있습니다. gimme_the_interface() 함수 포인터로 채워진 구조를 받아들일 수 있는 함수입니다.이러한 함수 포인터를 사용하면 DLL이 호출하고 콜백을 등록하는 등의 작업을 수행할 수 있습니다.

C++를 사용한다면 DLL 시스템을 사용하게 될 것입니다. 단, 구조체 대신 개체 포인터를 전달하고 개체는 기능을 제공하는 인터페이스를 구현합니다(구조체와 동일하지만 덜 추악함).Java의 경우 DLL 대신 필요에 따라 클래스 파일을 로드하지만 기본 아이디어는 동일합니다.

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

추신C++ 플러그인 시스템의 좋은 예를 보려면 다음을 확인하세요. foobar2000 SDK.한동안 사용하지 않았지만 예전에는 정말 잘 사용했습니다.나는 그것이 아직도 있다고 가정한다.

다른 팁

나는 과거에 플러그인에 이벤트 기반 API를 사용했습니다.이벤트를 전달하고 애플리케이션 상태에 대한 액세스를 제공하여 플러그인용 후크를 삽입할 수 있습니다.

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

이 일반적인 질문에 대해서는 Design Patterns 책을 추천하고 싶습니다. :p

진지하게, 내 생각에 대답은 '아니요'입니다.기본적으로 확장 가능한 코드를 작성할 수 없습니다. 작성/확장하기 어렵고 매우 비효율적입니다. (Mozilla는 확장성이 매우 뛰어나다는 생각으로 시작하여 모든 곳에서 XPCOM을 사용했지만 이제는 실수라는 것을 깨닫고 제거하기 시작했습니다. 말이 안되는 곳).

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

IMO에서는 동적 언어를 사용하는 데도 도움이 됩니다. 즉, 런타임에 핵심 코드를 조정할 수 있습니다(절대적으로 필요한 경우).Firefox 확장 기능을 작성할 때 Mozilla의 확장성이 그런 식으로 작동한다는 점에 감사드립니다.

귀하의 질문에는 두 가지 측면이 있다고 생각합니다.

확장 가능한 시스템 설계(설계 패턴, 제어 반전 및 기타 아키텍처 측면)(http://www.martinfowler.com/articles/injection.html).그리고 적어도 나에게는 그렇습니다. 이러한 패턴/기술은 플랫폼/언어 독립적이며 "일반 절차"로 볼 수 있습니다.

이제 구현은 언어 및 플랫폼에 따라 다릅니다(예를 들어 C/C++에는 동적 라이브러리 등이 있습니다).

플러그 가능성/확장성을 제공하는 프로그래밍 환경을 제공하기 위해 여러 '프레임워크'가 개발되었지만 다른 사람들이 언급했듯이 모든 것을 플러그 가능하게 만드는 데 너무 열중하지 마십시오.

Java 세계에서 살펴볼 좋은 사양은 OSGi(http://en.wikipedia.org/wiki/OSGi) 여러 구현을 통해 가장 좋은 IMHO는 Equinox(http://www.eclipse.org/equinox/)

  1. 플러그인 작성자에 적용하려는 최소 요구 사항을 알아보세요.그런 다음 작성자가 코드를 실행할 시기와 위치를 알 수 있도록 코드에 대해 구현해야 하는 하나 이상의 인터페이스를 만듭니다.

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

작성자가 상속해야 하는 기본 클래스를 만들 수도 있습니다.이렇게 하면 API 연결이 더 쉬워집니다.그런 다음 일종의 리플렉션을 사용하여 디렉터리를 검색하고 요구 사항과 일치하는 클래스를 찾은 다음 로드합니다.

어떤 사람들은 시스템을 위한 스크립팅 언어를 만들거나 기존 언어의 하위 집합에 대한 인터프리터를 구현하기도 합니다.이 길도 갈 수 있는 길이다.

결론은 다음과 같습니다.코드가 로드되면 상상력만이 당신을 막을 수 있을 것입니다.
행운을 빌어요.

C 또는 C++와 같은 컴파일된 언어를 사용하는 경우 스크립팅 언어를 통해 플러그인 지원을 살펴보는 것이 좋습니다.Python과 Lua는 모두 수많은 애플리케이션을 스크립팅하는 데 사용되는 훌륭한 언어입니다(Civ4와 블렌더는 Python을 사용하고 Supreme Commander는 Lua를 사용합니다).

C++를 사용하는 경우 Boost Python 라이브러리를 확인하세요.그렇지 않으면 Python은 C에서 사용할 수 있는 헤더와 함께 제공되며 C/python API를 문서화하는 데 상당히 효과적입니다.Lua에 대한 문서는 덜 완성된 것처럼 보였지만, 제가 충분히 열심히 찾지 않았을 수도 있습니다.어느 쪽이든 엄청난 작업을 들이지 않고도 상당히 견고한 스크립팅 플랫폼을 제공할 수 있습니다.여전히 사소한 것은 아니지만 작업할 수 있는 아주 좋은 기반을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top