다른 플랫폼에서 코드를 실행할 수 있도록 추상화 레이어를 작성하려고합니다. 제가 궁극적으로 높은 수준의 코드에 사용할 두 개의 클래스를 예를 들어 보겠습니다 :디자인 패턴 : C++ 추상화 레이어
class Thread
{
public:
Thread();
virtual ~Thread();
void start();
void stop();
virtual void callback() = 0;
};
class Display
{
public:
static void drawText(const char* text);
};
내 문제는 : 내가 구현에 낮은 수준의 코드를 칠 수 있도록하는 데 사용할 수있는 어떤 디자인 패턴? 여기 내 thoughs하고 나는 생각하지 않는다 왜 좋은 솔루션입니다 : 이론적으로
lowLevel/platformA/thread.cpp
에 앉아highLevel/thread.h
위의 정의 앉아 및 플랫폼 관련 구현을 가지고 아무런 문제가 없습니다. 이것은 링크 시간에 해결되는 오버 헤드가 낮은 솔루션입니다. 유일한 문제는 하위 수준 구현에서 멤버 변수 또는 멤버 함수를 추가 할 수 없다는 점입니다. 이것은 특정 일을 구현하는 것을 불가능하게 만듭니다.방법이 밖으로 정의 (기본적으로 Pimpl - 관용구)이를 추가하는 것입니다 :
이제 낮은 수준의 코드는 무효 포인터에 저장된 자신의 구조체 또는 객체의 수 있습니다. 여기서 문제는 그 추악한 프로그램을 읽고 고통 스럽다는 것입니다.class Thread { // ... private: void* impl_data; }
나는
class Thread
을 순수 가상으로 만들 수 있으며 저수준 기능을 상속하여 구현할 수 있습니다. 이 정도로 깔끔한 것// thread.h, below the pure virtual class definition extern "C" void* makeNewThread(); // in lowlevel/platformA/thread.h class ThreadImpl: public Thread { ... }; // in lowLevel/platformA/thread.cpp extern "C" void* makeNewThread() { return new ThreadImpl(); }
하지만 정적 클래스 실패 : 높은 수준의 코드는 다음과 같은 공장 함수를 호출하여 낮은 수준의 구현에 액세스 할 수 있습니다. 내 추상화 계층은 하드웨어 및 IO 작업에 사용될 것이고 하나의
Display
클래스에 대한 포인터를 가지고 다니는 대신Display::drawText(...)
을 가질 수 있기를 정말로 바랄 것입니다.다른 옵션은
extern "C" handle_t createThread()
과 같이 링크 타임에 해결할 수있는 C 스타일 기능 만 사용하는 것입니다. 이것은 디스플레이와 같이 한 번만있는 저수준 하드웨어에 액세스하기 쉽고 간단합니다. 그러나 여러 번 (잠금, 스레드, 메모리 관리) 할 수있는 모든 것에 대해 나는 핸들이 숨겨진 높은 수준의 래퍼 클래스를 가지고 있거나 못생긴 코드를 처리해야한다. 어느 쪽이든 나는 높은 수준과 낮은 수준 측면에서 각각의 기능과 핸들을 연결해야하는 오버 헤드가 있습니다.마지막으로 생각한 것은 하이브리드 구조입니다. 순수 C 스타일
extern "C"
은 단 한 번 밖에없는 저수준의 기능을합니다. 여러 번있을 수있는 물건에 대한 공장 기능 (3. 참조). 그러나 뭔가 잡종이 일관성없고 읽을 수없는 코드로 이어질까봐 두렵습니다.
내 요구 사항에 맞는 패턴을 설계하는 데 도움이 될만한 정보를 주시면 감사하겠습니다.
아직 전체 질문을 읽어 보지 않았. 그러나 C++은 C++ 11 이후 스레드에 대한 추상화 계층을 가지고 있습니다. – StoryTeller
나는 스레딩 물건을 먹으면서 FreeRTOS가있는 임베디드 타겟에서 작업하고 있습니다. 또 다른 플랫폼은 높은 수준의 코드를 쉽게 개발할 수있는 컴퓨터 기반 에뮬레이션입니다. C++ 11이이 시나리오를 지원한다고 생각하지 않습니다. – LoveDaOOP