Cześć,
ucząc się c++ stworzyłem w QT prostą aplikację. Robiłem ją strukturalnie ale najwyższa pora przejść poziom wyżej i chciałbym przerobić ją na obiektową.
Będę wdzięczny za podpowiedź czy to co zrobiłem do tej pory ma jakiś sens bo jak uruchomiłem program zacząłem mieć wątpliwości :)
Aplikacja pobiera rekordy z bazy z takiej tabeli:
data(data)
sklepNr(int)
h06(String)
h07(String)
h08(String)
...
h22(String)
Wszystkie pola od h06 do h24 to godziny otwarcia sklepów i w bazie zapis w tej kolumnie wygląda tak:
pracownik,stanowisko,stawka zl/h,kiedy zatrudniony.
Zwykły string oddzielony przenikami
Utworzyłem klasę rekordSklepDzien w której są wszystkie pola powyżej.
Utworzyłem tez klasę rekordGodzina. Klasa ta obsługuje to co mamy w każdej godzinie czyli pracownik,stanowisko,stawka zl/h,kiedy zatrudniony
Pobieram rekord z bazy i w konstruktorze rekordSklepDzien robię coś takiego:
rekordSklepDzien::rekordSklepDzien(QList<QString> dataBaseRecord)
{
this->setData(dataBaseRecord[1]);
this->setSklepNr(dataBaseRecord[2].toInt());
this->setH06(dataBaseRecord[5]);
this->setH07(dataBaseRecord[6]);
this->setH08(dataBaseRecord[7]);
...
}
Metody set poszczególnych godzin w klasie powyżej (setH06) wyglądają tak:
void setH06(rekordGodzina data){ h06 = data;}
Czyli tworze obiekt rekordSklepDzien składający się z obiektów rekordGodzina czyli jeśli dobrze rozumiem jest to kompozycja
rekordGodzina w konstruktorze dzieli stringa po przecinku i przypisuje konkretne wartości do zmiennych:
rekordGodzina::rekordGodzina(QString record)
{
QList<QString> podziel;
podziel = record.split(",");
setPracownik(podziel.at(1));
setStanowisko(podziel.at(2));
...
}
Często robię coś takiego ze pobieram z bazy rekordy dla kilku sklepów i zakres dat powiedzmy 200 dni. Czy generalnie mam kolo 1000
rekordów i we wszystkich zmieniam od godz. h06 do h11 pracownika
for(z=1;z<=wszystkieRekordy.count();z++)
{
rekordSklepDzien record = rekordSklepDzien(wszystkieRekordy[z]);
this->zmienPracownika(&record, godz_od, godz_do, dane);
}
Metoda zmienPracownika przyjmuje wskaźnik do aktualnie zmienianego rekordu, godziny w jakich będzie nowy pracownik i QList<QString> z niezbędnymi danymi
i robi w skrócie coś takiego:
record->getH06().setPracownik(danePracownika);
Rekordy zmienione zapisuje w kontenerze i jak pętla zamieni wszystkie tworzone jest jedno duże zapytanie aktualizujące rekordy w bazie.
Generalnie to co zrobiłem działa wygląda dużo czytelniej niż wcześniej strukturalnie i łatwiej będzie dodać nowe możliwości ale po uruchomieniu zmiana takiej samej ilości rekordów wcześniej zajmowała ok 1 sekundy teraz zajmuje 7 sekund :/
Dlatego zastanawiam się czy to co zrobiłem ma jakiś sens. Może zamiast tworzyć tylu klas rekordGodzina wszystko zapakować w jedną klasę rekordSklepDzien?