Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как обеспечить расширяемость?


Автор: Melevir 13.7.2010, 21:48
Задача такая: есть интерфейс, через него происходит вызов функционала. Есть набор классов, в которых реализован этот функционал. Еще есть необходимость в нормальной расширяемости - написал новый класс, заинклудил его и все, готово (так мне видится в идеале).

Есть идея сделать в каждом таком классе стандартный метод типа AddMenuOption(CMainDlg*);, запихать его в конструктор главного окна и объявить как поле интерфейса, но тогда классу придется давать ссылку на интерфейс, а это не айс..

Еще есть идея упаковать все это в длл, но она довольно бессмысленна - код в моем распоряжении, модульное функционирование самого ПО не нужно.

Вот такая вот бедаsmile.
Если предложите чего-нибудь хорошего - буду благодарен.

Автор: Earnest 14.7.2010, 09:40
Смотря какие классы и что от них требуется. Из твоего поста не совсем понятно.
Но вот тебе пример, как я пишу обработку команд, может, пригодится.
Во-первых, есть маленький абстрактный класс - команда, с методами Execute и Update. Во-вторых есть коллекция команд, их может быть несколько на разных уровнях - у приложения, у окон, у документа - все зависит от задачи. И есть способ получения и диспетчеризации этих команд: получение - от нажатия кнопок, пунктов меню и т.д., Диспетчеризация - порядок обработки - в каком порядке идет обращение к коллекциям команд. Все это написано один раз и не требует изменения при расширении. А расширении происходит так: каждая конкретная команда объявляется как статический объект и регистрируется в какой-то коллекции. Я это делаю с помощью макросов, но можно и без них, несущественно. Команды остаются маленькими объектами, и не имеют состояния, но они могут для выполнения обращаться к другим известным им классам и объектам.
Т.е. для добавления нового функционала нужно добавить ручки в UI, написать этот функционал  и зарегистрировать команду, которая его выполняет. Два последних действия могут выполняться совершенно локально (хоть в одном файле), никак не портя окружающую действительность. Что касается расширения UI, то мне проще делать это в редакторе ресурсов, но при желании можно возложить это дело и на регистрацию команды, дописав в оболочку соответствующий менеджер.

Автор: Melevir 14.7.2010, 19:34
 То есть эта команда - нечто вроде промежуточного класса между интерфейсом и реализацией, так я понял?

Автор: Earnest 15.7.2010, 07:48
Не совсем. Команда - это самостоятельный объект, просто он очень маленький и не имеет состояния, так что может объявляться статически. Команда унифицирует регистрацию и выполнение любых действий.
А реализация функционала может быть совершенно любой, в каждом конкретном случае; команда просто ее вызывает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)