Название: Соглашения по стилю написания кода в Qt Отправлено: kuzulis от Январь 26, 2010, 19:10 Доброго всем времени суток.
Недавно пересмотрел вот это: http://translated.by/you/qt-coding-conventions/into-ru/ И в глаза мне бросилось: Цитировать ... При включении заголовочных файлов Qt, всегда используйте следующую форму записи: \#include <QtCore/qwhatever.h>. Префикс библиотеки необходим для фреймворков Mac OS X, а также очень целесообразен для не qmake проектов. ... Но просмотрев исходники примеров Qt4 и т.п., я вижу что там встречаются такие варианты записи (к примеру): 1. Код: ... Код: ... Код: ... так вот вопрос: все-таки как правильнее подключать Qt-шные классы к проекту..? (разумеется с учетом того, что гипотетически буду использовать CMake) есть ли все-таки разница? Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 26, 2010, 19:19 наверное это потому что то всего лишь примеры.
лично я всегда использую одну из: Код и обязательно соблюдение регистра. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Авварон от Январь 26, 2010, 19:29 фигня всё про префикс на маке, и без него работает. Но я все равно пишу их, с соблюдением регистра (а это уже для линукса важно).
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: lit-uriy от Январь 26, 2010, 19:36 А я всегда использую то как в описании класса в асистенте написано, т.е.:
#include <QString> Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 26, 2010, 21:07 А я всегда использую префикс. Даже QtCreator генерит код без префикса пока в опциях не выбрать иначе. На мой взгляд это более читаемо и понятно. Сразу видно какой класс к какому модулю относится. Чем-то похоже на стиль Java:
Код
Код
А теперь посмотрите на эти классы и скажите можно ли догадаться к какому модулю они относятся: Код
Если кому-то удастся не подглядывая соотнести каждый класс с конкретным модулем, то я вас поздравляю - вы можете писать код, который смогут прочитать и понять такие же по уровню профессионалы как вы, но остальная часть программистов будет вас доставать на форуме создавая темы типа "почему после копипастинга вашего кода я получаю ошибку undefined reference to" Название: Re: Соглашения по стилю написания кода в Qt Отправлено: DS_tm от Январь 26, 2010, 21:27 Полностью согласен. Читабильность - важная штука, особенно если работаешь в команде.
Вообще статья хорошая, только форматирование слишком жестокое, порой не понимаешь где закончилась одна мысль и началась другая. Хотя есть и спорные моменты, особенно меня удивила фраза по поводу исключений. Я сам лично старательно их избегаю, но большое количество действительно хороших специалистов используют их постоянно. А Вы что думаете по поводу исключений? Название: Re: Соглашения по стилю написания кода в Qt Отправлено: BRE от Январь 26, 2010, 21:32 А Вы что думаете по поводу исключений? Не так давно немного поговорили на эту тему. :)http://www.forum.crossplatform.ru/index.php?showtopic=3483 Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 26, 2010, 21:32 А Вы что думаете по поводу исключений? Это соглашение относится к редактированию исходников Qt, поэтому не всё, что там написано нужно переносить на свои проекты. Если гуру в исключениях и знаешь их вдоль и поперек вместе с подводными камнями - используй на здоровье, иначе изучать до победного или обходить их стороной. Вот в FAQ'e по C++ про исключения есть: http://www.parashift.com/c++-faq-lite/exceptions.html Название: Re: Соглашения по стилю написания кода в Qt Отправлено: DS_tm от Январь 26, 2010, 21:46 Спасб за инфу. В свое время читал Мейерса и Александреску, они часто вспоминают про исключения и их использование. Кстати надо бы перечитать их. Кто не читал, настоятельно советую.
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Alex Custov от Январь 26, 2010, 22:15 Единственное что я вижу, для чего нужен префикс, это для того чтобы было видно из какого модуля класс(типа самодокументация кода).
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 00:07 Цитировать А Вы что думаете по поводу исключений? я думаю что без них писать на с++ невозможно!тут развернуто: http://forum.vingrad.ru/forum/topic-281797.html очень рекомендую внимательно прочесть. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Alex Custov от Январь 27, 2010, 02:05 тут развернуто: http://forum.vingrad.ru/forum/topic-281797.html очень рекомендую внимательно прочесть. там флейм ::) Цитировать А Вы что думаете по поводу исключений? я думаю что без них писать на с++ невозможно!Qt написана без исключений, KDE написано на 99.9% без исключений. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 03:04 Цитировать Qt написана без исключений, KDE написано на 99.9% без исключений. невнимательно читали)http://forum.vingrad.ru/index.php?showtopic=281797&view=findpost&p=2032673 Название: Re: Соглашения по стилю написания кода в Qt Отправлено: pastor от Январь 27, 2010, 03:19 невнимательно читали) Это обработка исключений. Qt не генерирует исключения. Ненужно путать Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 27, 2010, 04:31 pastor
В недрах QtXmlPatterns генерируются и обрабатываются исключения :) Хотя наружу конечно ничего не торчит :) А если по теме то... Использую precompiled headers куда подключаю хедеры библиотек и не парюсь :D Название: Re: Соглашения по стилю написания кода в Qt Отправлено: kuzulis от Январь 27, 2010, 08:03 Такс, раз используем префикс - то что предпочтительнее:
2. Код: Код: ... или 3. Код: Код: ... ? :) (не могу выбрать) Работают ли другие системы сборки (крое qmake) с п. №3 ? (думаю CMake работает... А вот другие - хз) Чтобы уж точно на будущее определиться с стилем !!! Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 27, 2010, 08:26 А с чего вдруг пункт №3 не должен работать на других системах сборки? Если пути к хедерам прописаны верно, то все отлично соберется.
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: kuzulis от Январь 27, 2010, 08:40 Цитировать А с чего вдруг пункт №3 не должен работать на других системах сборки? Если пути к хедерам прописаны верно, то все отлично соберется. Усп... понятно.Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 09:28 пункт №3
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 09:31 Цитировать Это обработка исключений. Qt не генерирует исключения. Ненужно путать а где я говорил что Qt генерирует исключения?Цитировать Использую precompiled headers куда подключаю хедеры библиотек и не парюс помоему мингв не поддерживает precompiled headers? поправьте если неправ.Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 27, 2010, 11:38 Цитировать помоему мингв не поддерживает precompiled headers? поправьте если неправ. AFAIK, gcc их с версии 3.4 поддерживает.Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 11:47 Цитировать gcc их с версии 3.4 поддерживает. я говорю именно про мингв. поддерживает? пруфлинк пожалуйста. и пример если не сложно.Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SASA от Январь 27, 2010, 12:47 Код: ... Код: #include <QtCore/QString> Но, по-моему проще А я всегда использую то как в описании класса в асистенте написано, т.е.: Встаил классик -> компилятор оругался -> copy/past из ассистанта. Отработаная технология.#include <QString> По поводу префексов. Если я подключаю модуль, то по любому надо править проект. Подключить либку, добавить инклудпас. Если используешь про-файл, то нужно его чуток подправить. В студии, это тоже деоается одной командой. Т.е. префикс нужен только для наглядности. У меня как-то не первая необходимость знать какой класс к какому модулю относится. Вывод - гемороя больше чем пользы. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 27, 2010, 12:53 Цитировать я говорю именно про мингв. поддерживает? пруфлинк пожалуйста. и пример если не сложно. А чем mingw от gcc отличается, кроме поддержки винды? :))p.s. сойдет ли за пруф, то что мой проект в котором используются precompiled headers собирается на mingw? :D Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 27, 2010, 13:00 Цитировать А чем mingw от gcc отличается, кроме поддержки винды? ц-ц-ц...Цитировать p.s. сойдет ли за пруф, то что мой проект в котором используются precompiled headers собирается на mingw? голословное утверждение.зы прошу заметить, я не отрицаю того факта, что возможно, мингв поддерживает precompiled headers. просто хочу увидеть доказательство. ничего более. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Авварон от Январь 27, 2010, 13:17 niXman
если оно поддерживается в гцц, то логично никто не станет писать о том, что оно поддерживается в в мигв - это логично подразумевается... Если бы было наоборот, то была бы куча воплей в гугле, коих мы не видим => они таки поддерживаются. по поводу исключений - исключения зло... Они нарастают точно также как ифы. Писал на шарпе 1 программку, там кэтчей было больше чем кода... отловить что файл не существует, что-то кирдыкнулось в винде, отловить то, сё, чем дальше тестишь, тем больше "исключительных" (о ужас, нам отправку почту зарезал фиреволл) ситуаций всплывает... Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 27, 2010, 13:27 Цитировать зы так блин, ради бога, возьмите и скомпилируйте. Проверить то не долго.прошу заметить, я не отрицаю того факта, что возможно, мингв поддерживает precompiled headers. просто хочу увидеть доказательство. ничего более. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Alex Custov от Январь 27, 2010, 15:00 Цитировать Qt написана без исключений, KDE написано на 99.9% без исключений. невнимательно читали)http://forum.vingrad.ru/index.php?showtopic=281797&view=findpost&p=2032673 В 4.5.3 не нашёл такого, видимо это добавили только в 4.6 Название: Re: Соглашения по стилю написания кода в Qt Отправлено: kuzulis от Январь 29, 2010, 13:30 Еще меня "путает" такое утверждение из статьи:
1. Цитировать В исходных кодах подключайте вначале специализированные заголовочные файлы, а затем уже общие. \#include <qstring.h> // класс Qt \#include <new> // файлы стандартной библиотеки C++ \#include <limits.h> // общесистемные файлы Файл qplatformdefs.h необходимо всегда включать первым. Если вам нужно подключить qt_x11_p.h, то подключайте его самым последним. НО! Просмотрев исходники Qt4 + программ из /tools и т.п. вижу что там все не так: Код: #include "ui3reader.h" т.е. все наоборот ! о_О .. Кому верить? ---- 2. также в некоторых циклах for присутствует префиксная и постфиксная запись инкремента переменной i ... Какая быстрее и лучше? -- упс, по поводу вопроса №2 говорят в гугле что вариант в цикле ++i будет работать быстрее чем i++ !! но лучше всего писать так: Код: ... Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 29, 2010, 14:22 взято отсюда: http://www.kirupa.com/forum/showthread.php?t=294799 Ориентироваться на оптимизацию в Action Script (flash) и пытаться применить её в C++, мягко говоря не правильно. Ты сам то пытался провести бенчмарк с i+=1 в C++? Везде пишут, что ++i быстрее, за счет того, что не создается временная переменная. Лучше тут почитай: http://www.agner.org/optimize/ Название: Re: Соглашения по стилю написания кода в Qt Отправлено: kuzulis от Январь 29, 2010, 14:33 Спс, а что насчет п. №1 ?
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 29, 2010, 17:02 Спс, а что насчет п. №1 ? Ничего. Судя по исходникам Qt у них даже нет единого стиля объявления типа переменных, иногда "int *", иногда "int* " (QObject *, QObject*, int&, int & и т.д.) Провел бенчмарк циклов с вариантами: Код
Код: g++ -g -pg -Wall -O3 -fno-inline main.cpp Дале прошелся профайлером gprof. Код: Each sample counts as 0.01 seconds. Программа выполнялась 5.16 секунд. Теперь уменьшаем переменную NUM_ITERATION до 1500000000: Код: Each sample counts as 0.01 seconds. Теперь уменьшаем переменную NUM_ITERATION до 1000000000: Код: Each sample counts as 0.01 seconds. Уменьшаем до 100 млн-ов: Код: Each sample counts as 0.01 seconds. Если брать три последних теста (где есть отличия), то во всех них лидируют 2 функции: iregpostinc(): Код
iregadd() Код
Если брать варианты без register, то в первом тесте все три варианта выполняются одно и то же время, в следующем тесте ipreinc() быстрее iadd() и ipostinc(), в другом тесте iadd() быстрее чем ipreinc() и ipostinc(). И в последнем тесте лидирует ipreinc(). Если разделить результаты по баллам, то получается такая картина: ipreinc() - 3 iadd() - 2 ipostinc() - 1 В итоге можно сказать, что использование конструкции ++i предпочтительней, но нет никакой гарантии того, что она сделает цикл быстрее, может даже замедлить. Поэтому прежде чем бездумно делать оптимизацию лучше пройтись профайлером. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Rcus от Январь 29, 2010, 17:45 А вы пробовали в objdump -S заглядывать? Я немного усложнил тест чтобы компилятор не смог заоптимизировать все до noop, для всех вариантов получился один и тот же код на платформе x86_64:
Код: void iregadd() Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 29, 2010, 19:11 Похоже на то. Значит компилятору фиолетово какую конструкцию ты используешь, один хрен соптимизирует. Конечно хотелось бы увидеть другой тест, который мог бы быть показательным, но я не знаю как его сделать, нужен более опытный программист.
Код: 00000000 <__Z8ipostincv>: Название: Re: Соглашения по стилю написания кода в Qt Отправлено: crackedmind от Январь 30, 2010, 18:37 нафига ж вы на int'ах проверяете? разница будет если у объекта будет тяжелый конструктор, типа итератора или еще чего.
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: xokc от Январь 30, 2010, 20:37 нафига ж вы на int'ах проверяете? разница будет если у объекта будет тяжелый конструктор, типа итератора или еще чего. Классический пример оптимизации не того, что надо бы оптимизировать.Название: Re: Соглашения по стилю написания кода в Qt Отправлено: pastor от Январь 31, 2010, 02:25 а где я говорил что Qt генерирует исключения? а где я сказал, что это сказал ты? о_О Ты дал линк на топик в которой идет дискусия по поводу генерации искючений в программах на Qt. Далее привел линк на конкретный пост в котором приведен листинг обработки исключении. Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Igors от Январь 31, 2010, 04:35 Похоже на то. Значит компилятору фиолетово какую конструкцию ты используешь, один хрен соптимизирует. Для простых конструкций - да. В ++библии приводится 2 варианта, примерно такихЦитировать // первый И говорится что нормальный компилятор сделает примерно одинаковый код. for (i = 0; i < num; ++i) dst[ i ] = src[ i ]; // второй while (src < end) *dst++ = *src++; Изучение кода - дело гораздо более полезное чем это кажется на первый взгляд. Попробуйте заглянуть в код напр "QString = ". Это не так уж трудно, совсем необязательно разбирать все "до команды". И, может быть, Вы увидите по-новому те вещи которые давным-давно знали :) Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 31, 2010, 11:51 Изучение кода - дело гораздо более полезное чем это кажется на первый взгляд. Попробуйте заглянуть в код напр "QString = ". Это не так уж трудно, совсем необязательно разбирать все "до команды". И, может быть, Вы увидите по-новому те вещи которые давным-давно знали :) А что тут необычного? Код
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: niXman от Январь 31, 2010, 12:37 для POD типов, компилятор естественно оптимизирует инкремент/декремент. но с итераторами он ничего не сделает.
Название: Re: Соглашения по стилю написания кода в Qt Отправлено: SABROG от Январь 31, 2010, 15:36 для POD типов, компилятор естественно оптимизирует инкремент/декремент. но с итераторами он ничего не сделает. Из плюсов итераторов. Итераторы призваны скрыть внутреннюю реализацию контейнера, возможность вставки нового элемента без необходимость учитывать индекс, быстрый перебор в контейнерах с произвольным доступом (vector, deque) в отличае от индексного варианта. Из минусов итераторов. Лучше использовать константные интераторы (если есть такая возможность), т.к. не константные методы типа begin() могут привести к копированию данных в контейнерах с совместным доступом (implicit shared) - QList, QLinkedList. (Qt). Необходимость использовать префиксные операторы, чтобы избежать оверхеда конструктора временного итератора (временной переменной). Необходимость сохранять результат метода .end(), чтобы избежать оверхеда с созданием временного итератора в блоке сравнения (itr != container.end()). Из всего этого я могу лишь сделать такой вывод, если используется QList или Си массив и нужно только читать из него и проход по нему никак не сказывается на время отклика программы - использовать обычный индексный доступ. И даже не парится насчет постфиксного оператора или префиксного для i. Если программа работает с вектором в котором куча данных на несколько мегабайт оперативы и нужно его менять туда сюда - использовать итераторы и парится насчет оптимизации. Возможно даже можно запариться насчет отказа от QVector'a в пользу std::vector и своего аллокатора памяти. Можно даже запариться насчет распараллеливания прохода по массиву на всех ядрах процессора QtConcurrent::map(), а то ведь гуишный поток один и использует только 50% мощности компьютера (если ядра 2). Название: Re: Соглашения по стилю написания кода в Qt Отправлено: Igors от Январь 31, 2010, 15:59 Из плюсов итераторов. .. Я согласен со всем что Вы написали, но, на мой взгляд это не главное для производительности. Если надо что-то просто просмотреть/перебрать, то проходит все что угодно и не видно особой разницы между std::vector, QVector, QList и просто "С" массивом (который все же самый быстрый :)). Проблемы начинаются когда большие объемы данные "прибывают" и с ними надо что-то делать (часто при этом удалять старые). Вот тут уже разница между QVector и QList может быть в несколько раз. Другой случай - всякие хитрые просмотры/анализы с целью избежать прямого перебора. У меня есть такая задача связанная с делением BSP. Есть желание - обсудим в "алгоритмах".Из минусов итераторов... |