Code-review программы для работы с заметками

487
29 декабря 2016, 07:58

Здравствуйте. Я пишу небольшую программку для работы с заметками. Сейчас реализован минимальный функционал: заметку можно создать, отредактировать и удалить. Для GUI у меня Qt, база - SQLite. В общем, всё работает и делает то, что я хочу. Но опыт программирования у меня стремится к нулю, поэтому подозреваю, что есть много недочетов, которые я не могу исправить, потому что не знаю, куда смотреть. Хотелось бы, чтобы вы указали на все ошибки/проблемы/недостатки, которые бросаются в глаза. Интересует всё от логики разделения на классы до возможных утечек памяти.

Сейчас есть по сути 12 классов:

  • 4 окна: MattyNotesMainWindow, MattySettingsDialog, addNoteDialog, MattyMessageBox
  • класс для работы с БД DbManager
  • класс для составления SQL-запросов QueryConstructor
  • собственно класс-заметка MattyNote
  • класс-конструктор для визуального отображения заметки MattyGroupBox
  • класс, который занимается сортировкой и показом заметок NoteHolder
  • класс для управления css MattyStyleSheetEditor
  • класс для хранения строчек и символов Constants
  • часики MattyClocks

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

Например, функции подключения к базе, редактирования существующей заметки и извечения всех заметок из базы:

bool DbManager::connect(const QString & path)
{
    MattyNotesDb = QSqlDatabase::addDatabase("QSQLITE");
    MattyNotesDb.setDatabaseName(path);
    if(QFile::exists(path))
    {
        if (!MattyNotesDb.open())
        {
            showIsNotOpenedError();
            MattyNotesDb.close();
            return false;
        }
        else
        {
            PathToDb = MattyNotesDb.databaseName();
        }
        return true;
    }
    else
    {
        return false;
    }
}
bool DbManager::editNote(MattyNote & Note, int NoteId)
{
    if (connected())
    {
        QueryConstructor Edit;
        Edit.setTableName(QStringLiteral("Notes"));
        Edit.addWhereFieldValue(QStringLiteral("NoteId"), QString::number(NoteId));
        QMap<QString, QString> NoteTemp;
        NoteTemp["NoteTitle"] = "\'" + Note.getTitle() + "\'";
        NoteTemp["NoteType"] = "\'" + Note.getType() + "\'";
        NoteTemp["NoteText"] = "\'" + Note.getText() + "\'";
        NoteTemp["EventTime"] = "\'" + Note.getEventTime() + "\'";
        NoteTemp["EventDate"] = "\'" + Note.getEventDate() + "\'";
        NoteTemp["CrTime"] = "\'" + Note.getCrTime() + "\'";
        NoteTemp["CrDate"] = "\'" + Note.getCrDate() + "\'";
        NoteTemp["TypeId"] = QString::number(Note.getTypeId());
        Edit.setWhatToSetFieldValue(NoteTemp); //
        QSqlQuery editNoteQuery;
        return editNoteQuery.exec(Edit.constructUpdateQuery());
    }
    else
    {
        return false;
    }
}
QVector<MattyNoteRow> DbManager::showNotes()
{
    if (connected())
    {
        QVector<MattyNoteRow> VectorOfNoteRows;
        QueryConstructor SelectAllNotes;
        SelectAllNotes.setTableName(QStringLiteral("Notes"));
        SelectAllNotes.setOrderByClause("NoteId", Descending);
        QSqlQuery getAllNotesQuery(MattyNotesDb);
        if( getAllNotesQuery.exec(SelectAllNotes.constructSelectQuery()))
        {
            while (getAllNotesQuery.next())
            {
                MattyNoteRow Row;
                Row.NoteId=getAllNotesQuery.value("NoteId").toInt();
                Row.NoteTitle=getAllNotesQuery.value("NoteTitle").toString();
                Row.NoteType=getAllNotesQuery.value("NoteType").toString();
                Row.NoteText=getAllNotesQuery.value("NoteText").toString();
                Row.EventTime=getAllNotesQuery.value("EventTime").toString();
                Row.EventDate=getAllNotesQuery.value("EventDate").toString();
                Row.CrTime=getAllNotesQuery.value("CrTime").toString();
                Row.CrDate=getAllNotesQuery.value("CrDate").toString();
                Row.TypeId=getAllNotesQuery.value("TypeId").toInt();
                VectorOfNoteRows.push_back(Row);
            }
        }
        else
        {
            QMessageBox::critical(NULL, QObject::tr("Error"), getAllNotesQuery.lastError().text());
        }
        return VectorOfNoteRows;
    }
    else
    {
        return QVector<MattyNoteRow>();
    }
}

Отправка заметок на форму:

    void NoteHolder::publishNotes(QWidget* ParentWidget)
    {
        erasePublishedNotes(ParentWidget);
        getAllNotes();
        QVector<class MattyNote>::iterator NoteNumber;
        int i;
        for (NoteNumber = ListOfAllNotes.begin(), i=0; NoteNumber < ListOfAllNotes.end();NoteNumber++, i++)
        {
            MattyGroupBox* MyGroupBox = new MattyGroupBox(*NoteNumber, ParentWidget);
            ParentWidget->layout()->addWidget(MyGroupBox);
        }
    }
void NoteHolder::erasePublishedNotes(QWidget* ParentWidget)
{
    MattyGroupBox* MgbTemp;
    while ((MgbTemp = ParentWidget->findChild<MattyGroupBox*>()) != 0)
    {
        delete MgbTemp;
    }
    QGroupBox* GbTemp;
    while ((GbTemp = ParentWidget->findChild<QGroupBox*>()) != 0)
    {
        delete GbTemp;
    }
}
void NoteHolder::getAllNotes()
{
    TotalNoteCount = 0;
    if (!ListOfAllNotes.isEmpty())
        ListOfAllNotes.clear();
    QVector<struct MattyNoteRow> ListOfRows = DbManager::showNotes();
    for (int i = 0; i < ListOfRows.length();i++)
    {
        MattyNote TempNote(ListOfRows[i]);
        ListOfAllNotes.append(TempNote);
        TotalNoteCount++;
    }
}

Весь исходный код можно увидеть тут: GitHub

Разделение на классы, их методы, вызовы, зависимости и т.д. тут: Doxygen

READ ALSO
Импорт csv в mysql

Импорт csv в mysql

Хочу, чтобы при импорте из csv к каждой записи добавлялось поле "время добавления"Думал сделать по аналогии, как при обычном запросе и добавить...

592
LEFT JOIN нескольких таблиц выдаёт дубликаты

LEFT JOIN нескольких таблиц выдаёт дубликаты

Делаю билинговую систему к торговой интернет-площадкеВ таблицах tbl_user - пользователи, tbl_billing_refill - пополнения баланса, tbl_billing - покупки/продажи...

596
Scroll к элементу

Scroll к элементу

У меня есть расписание на экранеНадо, чтобы по нажатию кнопки осуществлялся ScrollTo() либо ScrollBy() к элементу, но я не знаю, как определять координаты...

450
Один статический объект на два процесса

Один статический объект на два процесса

Как создать один статический объект на два процесса?

463