플러그인이있는 C ++ 응용 프로그램에서 기본 동작 변경 [닫기
문제
간단히 말해서 : 팩토리+플러그인 메커니즘을 설계하고 구현하는 가장 좋은 방법은 무엇입니까? 따라서 플러그인이 기본 응용 프로그램의 객체를 대체 할 수 있습니다.
우리는 응용 프로그램을 구축 할 코드베이스가 있습니다. 코드 기반은 응용 프로그램의 70-95%에 적합합니다. 즉, 각각의 새로운 응용 프로그램에서 기본 동작의 5-30%를 변경해야합니다 (새 기능 추가, 기본 논리 변경, GUI 등).
구현은 플러그인 기반입니다. 코드베이스는 EXE 및 DLL에 내장되어 있으며, 기본 EXE가 실행될 때 필요한 기능을 추가하는 DLL을로드합니다.
현재 각 플러그인은 다음 기능을 노출시킵니다.
PluginInterface* PluginInit()
{
return new MyCustomizedPluginInterface();
}
PluginInterface가 다음과 같이 정의됩니다.
class PluginInterface {
public:
virtual SomeClass1* customizedSomeClass1() = 0;
virtual SomeClass2* customizedSomeClass2() = 0;
};
SomeClass1/SomeClass2에는 기본 동작이 있지만 플러그인에 의해 재정의 및 변경 될 수 있습니다.
현재 구현으로 새로운 맞춤형 클래스를 추가하기가 어렵습니다. 플러그인에서 기본 응용 프로그램의 모든 클래스를 교체하고자하므로 객체 공장을 사용하는 것이 합리적입니다.
내가 아는 하나의 SDK는 다음 기술을 사용합니다.
PluginInterface* PluginInit(GodObject* godObject)
{
FactoryForSomeClasses* factoryForSomeClasses =
godObject->factoryForSomeClasses();
factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}
이 접근법에 대한 대안이 있는지 궁금합니다.
방금 설명한 것처럼 플러그인 시스템/공장을 설계하고 구현하는 것이 좋습니다.
해결책
Dobb 박사에는이 정확한 문제에 대해 논의한 기사가 몇 번있었습니다. 여기에 있습니다 링크 문제의 기사에.
제쳐두고 프로젝트에 대한 플러그인의 직선 C 인터페이스를 고수하고 싶을 수도 있습니다. 이렇게하면 거의 모든 언어로 작성된 코드를 최소한의 번거 로움으로 프레임 워크에 연결할 수 있습니다. C ++는 훌륭하지만 Java와 Python Lands에 존재하는 놀라운 프레임 워크와 같이 C ++에 존재하는 것보다 더 많은 것을 활용할 수 있다는 것은 장기적으로 유익 할 수 있습니다.
다른 팁
플러그인 프레임 워크의 CodeProject 예제를 살펴 보셨습니까?https://secure.codeproject.com/kb/dll/plugin.aspx http://www.codeproject.com/kb/library/dynobj.aspx