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

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

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

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

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

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

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

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

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

Спасибо.


person MVTC    schedule 04.02.2012    source источник
comment
Если у вас действительно есть 10 000 строк кода, написанного таким образом, возможно, будет проще начать заново с правильными методами, чем модифицировать его.   -  person Seth Carnegie    schedule 05.02.2012
comment
многие компоненты графического интерфейса пользователя, сотни должны быть доступны с помощью различных функций - похоже, вам следует попытаться разбить свой код на модули.   -  person Georg Fritzsche    schedule 05.02.2012
comment
Вы смотрели классы? Они должны помочь вам лучше структурировать код. Таким образом, вы можете держать переменные близко к тому, чему они принадлежат. Немного сложно помочь, не зная проблемы. Я не работал с беспорядком, но я думаю, вы бы передали указатель на конкретный класс. Или сам обработчик может быть методом определенного класса.   -  person Maiku Mori    schedule 05.02.2012
comment
Кроме того, если вам нужен простой старый графический интерфейс (кнопки, списки, метки и т. д.), я не думаю, что Clutter — лучший выбор, Qt или GTK+ должны быть намного проще, и они более распространены.   -  person Maiku Mori    schedule 05.02.2012


Ответы (2)


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

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

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

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

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

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

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

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

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

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

person Maiku Mori    schedule 04.02.2012
comment
Спасибо. У меня уже есть GTK как часть пакета clutter, а API очень похоже на clutter, так что я попробую. На самом деле существует библиотека clutter-gtk, которая позволяет мне встраивать виджеты GTK в clutter. Уже обнаружил, что я могу использовать некоторые вещи, такие как диалоговое окно выбора файла GTK, в беспорядке, связанном со стадией беспорядка. Я планировал создать свой собственный диалог выбора файлов, используя файловые системы boost, и был немного напряжен, просто думая об этом. - person MVTC; 05.02.2012
comment
@MVTCplusplus, ах, я вижу, на самом деле имеет смысл иметь это как зависимость. В этом случае вы можете просмотреть какой-нибудь открытый исходный код (например, github.com/ ) проекты на основе GTK+ и проверьте, как там структурированы приложения, вы, вероятно, почерпнете из них хорошие идеи. Что касается диалогов открытия файлов, я думаю, что лучше всего использовать тот, который предоставляется ОС (или GTK в вашем случае, который должен просто использовать текущий диалог открытия файла ОС), потому что большинство пользователей привыкли к нему, и он также содержит историю и избранное, установленное Пользователь. - person Maiku Mori; 05.02.2012

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

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

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

person John    schedule 04.02.2012
comment
Доступ к элементу внутри структуры всегда медленнее за счет дополнительной ссылки для выполнения и, следовательно, дополнительного чтения в ОЗУ. В большинстве случаев это не так. 7 аргументов функции — это чрезвычайно большое число. Объединение понятий в структуры упростило бы это. - person Captain Giraffe; 05.02.2012
comment
@CaptainGiraffe 7 - это верхний предел, некоторые автоматизированные инструменты производят 100. Хорошо, некоторые процессоры предлагают косвенность как часть своего кода операции, но если вы также разыменовываете указатели, то это израсходовано. То же самое можно сказать и о классах, но это хороший аргумент в пользу объектно-ориентированного подхода. - person John; 05.02.2012