Дизайн класса для рамки GUI - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть класс MainFrame (подкласс wxFrame ) Теперь этот класс делает большую часть работы, как создание меню, панели инструментов, панели и т. д.

Теперь для каждого события в меню / панели инструментов есть связанная функция, такая как OnSave, OnQuit, OnHelp и т. Д. В настоящее время (начальная стадия) я сделал всех участников OnXYZ MainFrame . Но такой дизайн делает меня неудобным. Скоро внутри класса будет слишком много функций.

Мой вопрос: как мне разбить описанный выше метод на несколько классов / файлов?

Или, в более общем смысле, как мне проектировать мой MainFrame ?

ПРИМЕЧАНИЕ: я проверил несколько вопросов относительно дизайна GUI на SO, но они все для Python, tkinter, поэтому я не очень хорошо их понял.

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Как правило, все оконные обработчики имеют класс окна. В C ++ нет ограничений на количество функций в классе, поэтому вам не нужно беспокоиться о «слишком большом количестве функций внутри класса». Ну, за исключением того, что это может быть трудно читать.

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

Другим способом может быть то, что все события-функции в главном окне содержат только одну строку, и это вызывает функцию в каком-то другом классе для обработки определенных задач. Для меню «Файл» может быть FileMenuHandlerClass, а функции событий главного окна просто действуют для этого как прокси.

1 голос
/ 09 декабря 2011

Вам решать, если разделить на несколько классов. Мой совет - создавать новые производные классы, если у виджета будет слишком много событий / элементов / подвиджетов.

Например, можно установить все свойства меню прямо в классе Frame, если меню действительно короткое, но если оно большое, используйте классы, производные от классов wxclasses, вместо создания нового wxMenu(this); для кадра, используйте BarraMenu::BarraMenu(Frame*framepairecebe) : wxMenuBar() в файле menu.cpp и просто вызовите его в файле фрейма (menubar = new BarraMenu(this);)

0 голосов
/ 09 декабря 2011

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

Лучшая помощь для удобства чтения - хорошая документация!

Обратите внимание, что методы класса могут быть реализованы в разных файлах - этоНе обязательно должен быть весь один исходный файл.Поэтому, если файл со всеми реализациями методов и их документацией становится настолько длинным, что он медленно загружается в вашем редакторе, вы можете разделить исходный файл, не разделяя класс.

Интересно, используете ли выплохая или несуществующая IDE?Без хорошей IDE вы обречены на постоянную прокрутку исходного файла - и это может стать утомительным, если файлы становятся длинными.

Хорошо, теперь, о каких методах мы говорим здесь?Есть сто или больше?Если так, то я бы посоветовал вам взглянуть на дизайн вашего графического интерфейса.Ваши пользователи будут очень смущены, если каждый раз при открытии вашего приложения они будут сталкиваться с сотней возможных действий!Если вы разделите ваш графический интерфейс на несколько экранов, каждый из которых имеет четко определенную и логичную цель, вам, пользователям, будет намного удобнее, и ваши классы будут меньше!

...