Помогите отделить GUI от логики в рамках MFC
От: jared  
Дата: 25.02.10 09:15
Оценка:
Разрабатывается обычное декстоп приложение с возможностью портируемости на различные платформы (в очень далеком будущем... сейчас хотелось бы правильно сделать архитектуру, для чтобы когда настанет время — ничего не рефакторить).
GUI'ем для винды хочется взять творение питерских ребят из BCGSoft любезно предоставляемого Майкрософтом в рамках MFC Feature Pack for Visual C++ 2008.

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

Снйчас я вижу весь GUI приложения, как набор классов управляемых каким-то GUIManager'ом реализующим IGUIManager — в который агрегировано огромная куча интерфейсов — по интерфейсу для каждой группы семантически связанных контролов.
Основное приложение с помощью какой-то фабрики получает объект реализующий IGUIManager (свой для каждой реализации гуя на каждой платформе) — тем самым обеспечивая кроссплатформенность.

Приложения MFC сгенерированные виззардом построены по другому принципу — не буду писать всем и так известно.
Как адаптировать MFC приложение для моих нужд, как отделить GUI от логики в рамках MFC, чтобы GUI можно было как угодно менять (при условии сохранении реализации GUI'ем необходимых логике интефейсов) не затрагивая логики.
Re: Помогите отделить GUI от логики в рамках MFC
От: grigsoft Беларусь http://www.grigsoft.ru/
Дата: 25.02.10 10:49
Оценка:
Пробую представить себе интерфейс такой надстройки — и не могу. Но я в архитектуре не силен. Традиционные библиотеки типа QT\WxW дают более низкоуровневое представление, на котором пишется интерфейс, а не наоборот — нечто глобальное, представляющее весь интерфейс. Если нет желание использовать готовые мультиплатформенные библиотеки, то имеет смысл идти от обратного — решаемую задачу представить в виде интерфейсов и писать платформо-независимую реализацию. А интерфейс писать родной для каждой платформы, вызывая оттуда реализацию.
Re: Помогите отделить GUI от логики в рамках MFC
От: Аноним  
Дата: 26.02.10 12:49
Оценка:
есть такая концепция — MVC (model view controller). суть в следующем:
создаёшь интерфейсы для отображения графики — View
создаёшь интерфейсы для реагирования на действия юзера — Controller
свою прогу (Model) привящываешь к этим интерфейсам, а потом уже реализуешь гую, которая порлучается заточена под интерфейсы View и Controller.

например, почтовый клиаент.

class CModel
{
private:
CView *m_p_view;

public:
CModel(CView *p_view)
{
m_p_view = p_view;
}
void on_user_read_message(uint msg_id)
{
m_p_view->do_show_message(...);
}
...
};

class CView
{
virtual void do_show_message(string &msg) = 0;
};

показывать сообщение можно хоть в консоле — хоть в эдите. просто нужно написать соответсвующие реализации CView. зачастую View и Controller связывают в один класс — сообщения и уведомления в виндовс никак не разделены. тут главное — ничего лишнего View не закинуть в Model, иначе придётся потом переписывать.
Re: Помогите отделить GUI от логики в рамках MFC
От: Hawk Россия  
Дата: 05.03.10 11:12
Оценка:
Здравствуйте, jared, Вы писали:

J>Как адаптировать MFC приложение для моих нужд, как отделить GUI от логики в рамках MFC, чтобы GUI можно было как угодно менять (при условии сохранении реализации GUI'ем необходимых логике интефейсов) не затрагивая логики.


Теоретически, да — можно работать через интерфейсы типа IToolBar, IDockingPane и т.п. Но на практике, я думаю, это выльется в жуткий геморрой — в первую очередь из-за того, что внутреннее устройство различных GUI frameworks слишком различается.

Можно вывести всю работу с GUI в некий объект с методами CreateEnvironment(), HandleMouse(), HandleKey() и... что там еще? Короче — сделать "черный ящик", который будет целиком руководить UI. Но это все теория. На практике довольно трудно работать подобными "крупными мазками". И со временем, из-за множества компромиссов, все это хозяйство неизбежно обернется опять же страшным геморроем. Будет нечто "немножко зависимое тут", "немножко там", а что в результате? Несопровождаемый уродец.

В общем, ИМХО, данная задача — менять GUI frameworks "как перчатки" — близка к неподъемной. И я бы посоветовал не делать что-то "мульти-библиотечное", а посмотреть в сторону кроссплатформенных GUI-библиотек. Первое, на что я бы глянул, это Qt, особенно учитывая такие замечательные вещи, как Kinetic и QML. У вас есть блестящая возможность начать с нуля с использованием декларативного UI, а это дорогого стоит. Ну и, раз уж заговорили о декларативном UI, нельзя не упомянуть HTMLayout. Но там — только визуализация и с кроссплатформенностью пока не все ясно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.