Применить шаблон Bridge к существующему дизайну класса

Нет моста

Как видите, у меня есть интерфейс для событий отладки и две операции Attach и Detach. Кроме того, я должен реализовать версию для Windows и Linux, чтобы текущий дизайн не масштабировался вообще.

Представьте, что я должен добавить:

  • DebugEventThread <- DebugEventThreadAttach <- DebugEventThreadDetach
  • DebugEventProcess <- DebugEventProcessAttach <- DebugEventProcessDetach

Этот дизайн выходит из пропорций …

Я знаю, что паттерн Бридж будет решением этой проблемы, но как он будет применяться в этом случае?

Обновить:
В качестве первого исправления я подумываю добавить элемент Operation (Attach / Detach) в DebugEventModule. Таким образом, для различных типов операций присоединения / отсоединения больше не требуется подкласс:

1.

Мост

Мост между DebugEventModule -> DebugEventModuleImpl кажется мне бесполезным на данный момент, можете ли вы увидеть какие-либо преимущества наличия моста здесь? Без моста я бы имел:

2.

наследование

А как насчет того, чтобы перенести вещи, специфичные для платформы (ОС), с помощью Bridge? Что-то вроде этого:

3.

Абстракция платформы

Я думаю, что в этом последнем проекте функции platform_specific () будут специфичны для Module, Thread, Process, и это идет вразрез с «принципом единой ответственности», я бы не хотел, чтобы этот класс стал «мамонтом», стал Сочетание несвязанных функций.

Обновление 2:
Текущая реализация для DebugEvent + DebugEventModule:

    class DebugEvent {
public:
DebugEvent(uint32_t processId,
uint32_t threadId);
virtual ~DebugEvent();
virtual void Process() = 0;
private:
uint32_t _processId;
uint32_t _threadId;
};

class DebugEventModule : public DebugEvent {
public:
DebugEventModule (uint32_t processId,
uint32_t threadId,
handle_t fileHandle,
hmodule_t baseOfDll,
address_t imageName,
uint16_t isUnicode);
virtual ~DebugEventModule();
virtual void Process();
private:
handle_t _fileHandle;
hmodule_t _baseOfDll;
address_t _imageName;
uint16_t _isUnicode;
};

class DebugEventModuleAttach : public DebugEventModule {};
class DebugEventModuleDetach : public DebugEventModule {};

class DebugEventModuleAttachWindows : public DebugEventModuleAttach {};
class DebugEventModuleAttachLinux : public DebugEventModuleAttach {};

class DebugEventModuleDetachWindows : public DebugEventModuleDetach {};
class DebugEventModuleDetachLinux : public DebugEventModuleDetach {};

Идея состоит в том, чтобы сделать независимую от платформы версию Windows DEBUG_EVENT:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms679308%28v=vs.85%29.aspx

Windows DEBUG_EVENT выглядит так:

    typedef struct _DEBUG_EVENT {
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
union {
EXCEPTION_DEBUG_INFO      Exception;
CREATE_THREAD_DEBUG_INFO  CreateThread;
CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO    ExitThread;
EXIT_PROCESS_DEBUG_INFO   ExitProcess;
LOAD_DLL_DEBUG_INFO       LoadDll; // - This was DebugEventModuleAttach in the original design
UNLOAD_DLL_DEBUG_INFO     UnloadDll; // - This was DebugEventModuleDetach in the original design
OUTPUT_DEBUG_STRING_INFO  DebugString;
RIP_INFO                  RipInfo;
} u;
} DEBUG_EVENT, *LPDEBUG_EVENT;

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector