Wątek przeniesiony 2018-08-21 19:06 z C/C++ przez kq.

Baza danych w plikach .txt

0

Napisałem swój pierwszy program w C++ (z użyciem QtSql) i chciałbym poznać opinię kogoś, kto ma jakieś doświadczenie, zanim spróbuję napisać kolejny.
Umożliwia on tworzenie 'bazy danych' zapisywanej w plikach .txt ('member' reprezentuje rząd a 'value' kolumnę), dodałem też obsługę MySQL (użytkownik wprowadza dane, a program wysyła query do bazy).

Mam wątpliwości co do struktury kodu ('C z klasami') - nie mogłem znaleźć zastosowania dla bardziej zaawansowanego programowania obiektowego (w tym kierunku chciałbym go rozwijać), klasy wykorzystuję tylko do przechowywania danych.

Github: github.com/ranger281/FileDatabase.

Przykładowa baza danych w plikach: https://pastebin.com/WRwuucNf

1

Kolego, "gdyby" to było jakieś fajne "C z klasami" albo porządne proceduralne C, mógłbym to zaakceptować. Ale to kaszanka i/ lub spagetti. NIC tu nie gra, od nazw i identyfikatorów. Jakiejś idei przewodniej projektu nie udało mi się stwierdzić

EDIT: zdecydowanie "pierwszy program w C++" to powinieneś n/t jakiś jabłek i pomarańczy. Pozornie użyteczny pierwszy program to TYLKO pozór, trzeba sporo roboty dać pozornie "na zmarnowanie", ale to właśnie jest inwestycja w siebie.

0
if (input == "Mysql" || input == "File") {
    if (input == "Mysql") {
        if (MySQL == true)
            cout << "\nMySQL Help\n";
        else {
            cout << "You do not have the permission to see MySQL database help\n";
            permission = false;
        }
    }
    if (input == "File") {
        if (SaveFile == true && MySQL == false)
            cout << "\nFile Help\n";
        else {
            cout << "You do not have the permission to see File-only database help\n";
            permission = false;
       }
    }
}
if (cmd_enter == "Help") {
    Help = true;
}
if (cmd_enter == "Mysqlm_r") {
    if (MySQL == true)
        sql_member.SqlReadMembers();
}
if (cmd_enter == "Mysqlm_c") {
    if (MySQL == true)
        sql_member.SqlCreateMember();
}
if (cmd_enter == "Mysqlm_d") {
    if (MySQL == true)
        sql_member.SqlDeleteMember();
}
if (cmd_enter == "Mysqlm_s") {
    if (MySQL == true) {
        int m_nr;
        sql_member.SqlSearchMember(m_nr);
    }
}
if (cmd_enter == "Mysqlm_e") {
    if (MySQL == true)
        sql_member.SqlEditMember();
}
if (cmd_enter == "Mysqlv_r") {
    if (MySQL == true)
        sql_member.SqlReadValues();
}
if (cmd_enter == "Mysqlv_c") {
    if (MySQL == true)
        sql_member.SqlCreateValue();
}
if (cmd_enter == "Mysqlv_d") {
    if (MySQL == true) {
        string column;
        sql_member.SqlDeleteValue(column);
        if (SaveFile == true)
            member.deleteValue(column);
    }
}
///  //  FILE
if (cmd_enter == "Filem_r") {
    if (MySQL == false && SaveFile == true)
        member.readMember();
}
if (cmd_enter == "Filem_c") {
    if (MySQL == false && SaveFile == true)
        member.addMember();
}
if (cmd_enter == "Filem_d") {
    if (MySQL == false && SaveFile == true)
        member.deleteMember();
}
if (cmd_enter == "Filem_s") {
    if (MySQL == false && SaveFile == true) {
        unsigned found_nr;
        bool found = false;
        member.searchMemberStr(found, found_nr);
        if (found == true)
            member.infoMember(found_nr);
    }
}
if (cmd_enter == "Filem_e") {
    if (MySQL == false && SaveFile == true)
        member.editMember();
}
if (cmd_enter == "Filev_r") {
    if (MySQL == false && SaveFile == true)
        member.readValue();
}
if (cmd_enter == "Filev_c") {
    if (MySQL == false && SaveFile == true)
        member.createValue();
}
if (cmd_enter == "Filev_d") {
    if (MySQL == false && SaveFile == true)
        member.deleteValue();
}
if (cmd_enter == "File_update") {
    if (SaveFile == true)
        file.updateData();
}
if (cmd_enter == "File_open") {
    if (SaveFile == true)
        file.openFile();
}
if (cmd_enter == "File_clear") {
    if (SaveFile == true)
        file.clearFile();
}
if (cmd_enter == "Data_add") {
    if (SaveFile == true) {
        string name;
        list.addDB(name);
    }
}
if (cmd_enter == "Data_del") {
    if (SaveFile == true) {
        int del_return = list.deleteDB();
        if (del_return == 1) {
            cout << "Closing program after deleting database..\n";
            current = "DELETED_DATABASE";
            cmd_enter = "close";
        }
    }
}
if (cmd_enter == "Data_show") {
    if (SaveFile == true)
        list.readDB();
}
if (cmd_enter == "Data_merge") {
    if (SaveFile == true) {
        bool check;
        list.mergeDB(check);
        if (check == false)
            cout << "Merging failed.\n";
        if (check == true) {
            current = "DELETED_DATABASE";
            cout << "\nClosing program after merging and saving data..\n";
            cmd_enter = "Close";
        }
    }
}
if (cmd_enter == "Mysqlu_d") {
    if (MySQL == true && SaveFile == true)
        sql_member.SqlUpdateData();
}
if (cmd_enter == "Mysqlu_f") {
    if (MySQL == true && SaveFile == true)
        sql_member.SqlUpdateFile();
}

Lol

0

@AnyKtokolwiek: Ideą była baza danych w plikach. To mój pierwszy program i nie był przeznaczony do bycia użytecznym - na razie mam tylko podstawową wiedzę z C++ i zanim przejdę dalej chciałbym poprawić ewentualne błędy. Program działa w zamierzony sposób.

@Pijak: Plik .cpp miał służyć obsłudze prostych komend za pomocą konsoli.

0

Poprawiłem nazwy zmiennych i porównania z bool, oddzieliłem też definicję i implementację klasy do osobnych plików .h i .cpp. Dodałem przykładowy plik z danymi i .config. Jestem otwarty na wszelkie uwagi dotyczące jakości czy struktury kodu (najlepiej z dołączonym fragmentem). Wolałbym nie porzucać tego projektu zanim nie będę z niego w jakimś stopniu zadowolony.

Dziękuję za pomoc.

Edit: (chciałbym zaznaczyć, że plik .cpp służy głównie obsłudze programu przez użytkownika za pomocą konsoli i nie ma większego znaczenia - chodziło tylko o prostotę w wpisywaniu komend)

1

Gdybyś chciał dodać interfejs graficzny to musiałbyś wszystko przepisać od nowa. Nie świadczy to najlepiej o strukturze kodu.
Jeśli program ma obsługiwać różne formaty to aż się prosi o "wyrzucenie" konkretnych implementacji do oddzielnych klas z zunifikowanym interfejsem.
Obecnie ciężko się połapać co klasy reprezentują, czym się zajmują, itp. Starałem się wgryźć w Twój kod, ale dałem sobie spokój, bo nie wiedziałem od czego zacząć. Wystarczy spojrzeć na liczbę argumentów w konstruktorach, żeby zobaczyć, że coś tu jest nie halo. Dziwi brak klas odpowiedzialnych za konfigurację oraz użytkownika.

Ogółem oprócz nabrania wprawy i tego, że kod, jak twierdzisz, działa to ciężko znaleźć inne pozytywy. Dalsze rozwijanie tego będzie strasznie bolesne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1