Как видите, у меня есть интерфейс для событий отладки и две операции Attach и Detach. Кроме того, я должен реализовать версию для Windows и Linux, чтобы текущий дизайн не масштабировался вообще.
Представьте, что я должен добавить:
Этот дизайн выходит из пропорций …
Я знаю, что паттерн Бридж будет решением этой проблемы, но как он будет применяться в этом случае?
Обновить:
В качестве первого исправления я подумываю добавить элемент 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;
Задача ещё не решена.
Других решений пока нет …