LINUX.ORG.RU

Прошу покритиковать моё приложение

 ,


0

2

Это мой первый опыт использования C++ и Qt, так что кто может, покритикуйте.

Репозиторий

Эта программа — графическая запускалка для другой моей программы w2midi. Она распознает ноты в звуковом сигнале и преобразует его в MIDI.

w2midi_qt взаимодействует с w2midi с помощью CLI.

Заранее спасибо!

C++ и Qt

Слишком толсто для cli запускалки. Когда выйтет какой-нибудь кутэ 7 начнётся сношение головы. Вот, Kron4ek раздавал на рутрекере openmw с запускалкой на куте4/5, так я его так и не смог собрать, хотя вроде бы все либы там есть. В общем написать гуй может любой, но сделать так, чтобы он запускался и собирался через 5-10 лет могут единицы. И в результате выходит так, что написанное с использованием голого sdl1.2 куда более портабельное, чем весь этот ваш кутэ.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от realbarmaley

Не увидел. Почитай про doxygen

https://habr.com/ru/post/252101/

Пример полно документированного кода (не doxygen, но все же)

https://github.com/weston-embedded/uC-OS2

Посмотри еще, как сам qt откомментирован, там все понятно и на все вопросы есть ответы.

w2midi_qt

вот это смотрел. Вообще для школьника - хорошо, может быть даже очень хорошо. Продолжай в том же духе и больше читай (в том числе внятные исходники), будет еще лучше.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 3)
Ответ на: комментарий от Zhbert

Тут еще не пробегали адепты «комментарии не нужны ваще!»? У них от кода по последней ссылке вообще должны пуканы подгореть.

Мне уже далеко за 30, чужие мнения глубоко неважны, я даже отвечать не буду. Может заигнорю кого, не более. Код uC-OS2 и компонентов верифицируется по DO-178B/C, когда эти комментаторы сделают что-нибудь подобное - пусть приходят.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 2)
Ответ на: комментарий от crutch_master

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

aiqu6Ait ★★★★
()
Ответ на: комментарий от aiqu6Ait

Не, на самом деле я вот щас какую-то эйфорию ощутил, когда в него посмотрел.

А вот это вот они руками делали или есть какие тулзы, чтобы так офигенно оформить блоки комментов?

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Не знаю. У нас принят doxygen, для vscode, eclipse и visual studio есть тулзы которые оформляют шапки по хоткеям и объявлениям функций/методов, я использую.

https://marketplace.visualstudio.com/items?itemName=cschlosser.doxdocgen

А микриум стар, там пацаны могли и от руки оформить.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 1)
    int minBufferSizePower = 5; // 2^5
    this->minBufferSizePower = minBufferSizePower;

не пиши этот сюр. у тебя локальная переменная и поле обьекта имеют одинаковое имя. разница только в this. тот кто не знает приоритет видимости имен вообще не поймет что чему присвоили.

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

тут же ты САМ породил конфликт имен и сам его пытаешься решить.

alysnix ★★★
()
Ответ на: комментарий от aiqu6Ait

Ну доксиген, все-таки, немного не то. Так-то я его тоже пользую.

для vscode, eclipse и visual studio есть тулзы которые оформляют шапки по хоткеям и объявлениям функций/методов

В доксиген-стайле? Или можно настроить? Подскажешь название, чтобы не рыться в тоннах плагинов?

У меня обычно IDEA блок коммента почти как Doxygen оформляла, благо оно на джавадок похоже очень сильно, но все равно руками приходилось потом править.

А вот добавлять такие мегашапки с названием блока и описанием было бы вообще круто.

Zhbert ★★★★★
()
Последнее исправление: Zhbert (всего исправлений: 1)

разделяй длинный код тел функций на блоки. пиши в блоках локальные переменные. типа

void ff(){
  int lx = 10;
  ....
  { //начался блок со своими локальными переменными
    int lvar = 0;
    ... //тут код
  }

  ...
  { // это еще какой-то блок
    MycLass *some_var = new Myclass();
    ...
  }
}

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

alysnix ★★★
()
class ClickableLabel : public QLabel {
    Q_OBJECT
protected:
    virtual bool event(QEvent*);
public:
    ClickableLabel(QString);
signals:
    void doubleClicked();
};

функция event(…) тут случайно не override? если да - то надо писать(компилятор проверит что такая функция действительно есть у предка.)

bool event(QEvent* ) override;
alysnix ★★★
()
Ответ на: комментарий от realbarmaley
 process = new QProcess((QObject*)this);

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

-Wall 
-Wextra

в плюсах желательно пользоваться static_cast, dynamic_cast и так далее, а не сишным (Type) …

alysnix ★★★
()
Ответ на: комментарий от crutch_master

но сделать так, чтобы он запускался и собирался через 5-10 лет могут единицы

Ну так и не нужно. Нужно указывать, на каких версиях собиралось. Да и вообще-то ты про 5 лет загнул. Ладно год еще.

rumgot ★★★★★
()

Вызов команды qt5_create_translation() имеет один нежелательный побочный эффект. Дело в том, что цель clean, создаваемая генераторами для make-файлов, удаляет все сгенерированные в результате выполнения правил файлы. То же самое относится к цели translations, результатом выполнения которой является создание файлов TS в каталоге проекта. После выполнения цели clean эти файлы будут также удалены, что может привести к потере результатов долгой работы по локализации. Чтобы обойти эту проблему, у каталога текущего подпроекта устанавливается в истину свойство CLEAN_NO_CUSTOM, что приводит к исключению файлов, генерируемых правилами команд add_custom_command(), из числа удаляемых целью clean. В результате, правда, при исполнении этой цели также не удаляются файлы QM в каталоге построения.

Дубров_CMake_Система_построения_проектов_2015

set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM TRUE)
rumgot ★★★★★
()
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished(int, QProcess::ExitStatus)));
connect(process, &QProcess::errorOccurred, this, [this](QProcess::ProcessError) { emit processStateChanged(false); });
connect(process, &QProcess::readyReadStandardError, this, &W2MidiCli::readyReadStderror);

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

rumgot ★★★★★
()
W2MidiCli::W2MidiCli(QObject *parent)
{
    bufferSize = 4096;
    ampThreshold = 20;
    accThreshold = 0.02;
    clientName = "w2midi";
    rangeStart = 20;
    rangeEnd = 240;

   //...
}

Тут я бы делал через список инициализаторов членов:

W2MidiCli::W2MidiCli(QObject *parent) : bufferSize(4096), ampThreshold(20), accThreshold(0.02) // ...
{
   //...
}

Кроме того, переменные члены класса можно инициализировать сразу в определении класса.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)

На простую пускалку надо выкидывать Qt и брать FLTK, Qt - жирновато как по мне. Если конечно не цель учиться Qt. А если по современной моде делать, то надо электроном обмазываться или иными способами веб в десктоп тащить.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Изучу тогда FLTK, а то мне страшно: 21 мебибайт оперативки, 216 кибибайт на диске занимает моя программа, хотя всего 3 кнопки…

А рабочая часть, которая анализирует частоты занимает в RAM 708 КиБ, а на диске 23 КиБ. Qt на помойку!

realbarmaley ★★
() автор топика
Ответ на: комментарий от crutch_master

В общем написать гуй может любой, но сделать так, чтобы он запускался и собирался через 5-10 лет могут единицы.

Не раздувай моё ЧСВ. Тот проект, который я время от времени слегка подпиариваю на ЛОРе, работает на Qt от 4.8 до 5.15. Сколько это в пересчёте на года, можешь прикинуть сам. И нет, таких, как я не единицы, а сильно больше.

hobbit ★★★★★
()