У меня есть несколько модулей (в основном C), которые необходимо переработать (используя C ++).В настоящее время основными проблемами являются:
- многие части приложения зависят от функций модуля
- некоторые части приложения могут захотеть отменить поведение модуля
Я думал о следующем подходе:
- перепроектировать модуль так, чтобы он имел четкую современную структуру классов (используя интерфейсы, наследование, контейнеры STL, ...)
- написание глобального класса интерфейса модуля, который можно использовать для доступа к любой функциональности модуля
- написание реализации этого интерфейса, который просто отображает методы интерфейса на правильные методы правильного класса вinterface
Другие модули в приложении, которые в настоящее время непосредственно используют функции C модуля, должны быть переданы [реализация] этого интерфейса.Таким образом, если приложение хочет изменить поведение одной из функций модуля, оно просто наследует эту реализацию по умолчанию и отменяет любую функцию, которую оно хочет.
Пример:
- Предположим, я полностью перепроектировал свой модуль так, чтобы у меня были такие классы, как: Book, Page, Cover, Author, ... Все эти классы имеют множество различных методов.
- Я создаю глобальный интерфейс, называемый ILibraryAccessorс большим количеством чисто виртуальных методов
- Я делаю реализацию по умолчанию, называемую DefaultLibraryAccessor, которая просто перенаправляет все методы в правильный метод правильного класса, например,
- DefaultLibraryAccessor :: printBook (book)вызывает book-> print ()
- DefaultLibraryAccessor :: getPage (book, 10) вызывает book-> getPage (10)
- DefaultLibraryAccessor :: printPage (page) вызывает page-> print ()
- Предположим, мое приложение имеет 3 вида окон
- Первое позволяет использовать все функции и в качестве приложения.Ион Я хочу разрешить это
- Второй также позволяет все функции (внутренне), но из приложения я хочу предотвратить печать отдельных страниц
- Третий также позволяет все функции (внутренне), но из приложения я хочу запретить печать некоторых видов книг
- При создании окна приложение передает реализацию ILibraryAccessor в окно
- Первое окнополучит DefaultLibraryAccessor, разрешив все
- Я передам специальный MyLibraryAccessor во второе окно, а в MyLibraryAccessor я отменю метод printPage и допустим сбой
- Я передам специальный AnotherLibraryAccessorв третьем окне и в AnotherLibraryAccessor я отменю метод printBook и проверю тип книги, прежде чем вызову book-> print ().
Преимуществоэтот подход заключается в том, что, как показано в примере, приложение можетотменить любой метод, который он хочет отменить.Недостатком является то, что я получаю довольно большой интерфейс, и структура классов полностью теряется для всех модулей, которые хотят получить доступ к этому другому модулю.
Хорошая идея или нет?