хорошо или плохо: создать гигантскую структуру, чтобы избежать использования глобалов / свойств структуры / множества параметров - PullRequest
2 голосов
/ 05 февраля 2012

Я новичок, и я написал программу длиной в 10000 строк, которая в основном использует глобальные и пустые функции, в c ++.

В любом случае, моя программа не имеет графического интерфейса, поэтому я делаю его для Clutter. Таким образом, в беспорядке вы используете функцию обработки сигналов для соединения нажатий кнопок, событий движения и т. Д.

Функция обработки сигналов может принимать только один параметр пользовательских данных. Тем не менее, многие компоненты GUI, сотни должны быть доступны с помощью различных функций. Поэтому я помещаю все свои объекты GUI в одну структуру и передаю ее из каждой функции обработки сигналов.

Итак, моя программа, как сейчас, (консольная программа) печатает, нажимает какую-то букву, чтобы что-то сделать. Если вы нажмете эту букву, запустите определенную функцию. Если я исключу использование global, мне нужно будет передать в качестве параметров некоторые из этих переменных.

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

Извините, если все это звучит безумно. Я просто пытаюсь переписать свой код, чтобы использовать лучшие практики, но с кодом длиной 10000 и моим непониманием некоторых вещей я чувствую себя довольно подавленным.

Я просто ищу несколько советов о том, с чего начать и как решить эту проблему, которую я воспринимаю при подключении к графическому интерфейсу.

И на мой вопрос о структурах. Мне интересно знать, есть ли максимальное количество элементов, которые могут быть внутри структуры. Если у вас есть массив внутри структуры, будет ли время доступа к этому массиву медленнее? Есть ли разница в том, как обрабатывается память для структуры.

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Я думаю, что у вашего вопроса есть скрытый вопрос: как написать приложение / фреймворк с графическим интерфейсом?

Кажется, что беспорядок очень низок по сравнению с тем, что я быстро прогуглил.Если вы хотите пропустить много кода, просто используйте что-то вроде Qt Framework, который также рендерит большинство вещей, используя OpenGL (или GTK +, зависит от того, какую лицензию вы хотите).

Нет простого ответа, если вы хотите написать большеили меньше с нуля, и я попытаюсь просто пройтись по нему на очень высоком уровне и просто выделить очень основную идею, как это обычно работает.

Поскольку вы пометили его тегом C ++, то правильный C ++можно использовать классы.

У вас будут классы для таких вещей, как Sound (MP3), с такими методами, как декодирование, кодирование и т. д. Тогда у вас будут классы для элементов GUI с такими методами, как onPaint, onClick.и т. д.

Допустим, вы хотели кнопку.Это был бы класс с переменными, такими как x, y, ширина, высота, текст, clickHandler, включен и так далее.Он будет иметь некоторые низкоуровневые обработчики событий, такие как onPaint, onClick (этот будет проверять, находится ли мышь над кнопкой и включена ли она, и если все эти проверки пройдут, вызовет clickHandler).У него также могут быть некоторые методы, такие как isEnabled (), disable (), enable () и т. Д.

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

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

Но на самом деле вы не хотите писать что-либо изэто так, как уже делают огромные библиотеки.

Что касается того, как склеить все это вместе, вы, вероятно, захотите следовать соглашению, используемому конкретной выбранной вами средой.Если вы работаете в Windows и хотите сделать приложение только для Windows, используйте WPF (или Winforms).Qt хорош для кроссплатформенных вещей и довольно современен, но лицензия немного ограничивает вас, если вы создаете коммерческое приложение.

0 голосов
/ 05 февраля 2012

Доступ к элементу внутри структуры всегда медленнее из-за стоимости наличия дополнительной ссылки для выполнения и, следовательно, дополнительного чтения в ОЗУ.Попробуйте сгруппировать объекты в struct s, чтобы их можно было использовать вместе, чтобы эти запросы памяти могли кэшироваться в более быстром ОЗУ / встроенном кеше.

На самом деле нет ограничений на структуру членов, и они частоПолезно, когда вы превышаете максимальное количество параметров, которое должна принимать функция, меня учили (в 2002 году), что магическое число равно 7.

В конечном счете, при группировании членов по struct s вы сможете определить, какиефункции используют их, и вместо передачи структуры вы можете сделать функцию членом и избавиться от необходимости разыменования структуры для получения членов этого параметра.Я думаю, что в этот момент вы, вероятно, можете присвоить struct s эквивалентную метку C ++, class.

...