Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Tekstowa baza danych - pomoc w rozgryzieniu problemu

Ostatnio zmodyfikowano 2018-08-27 20:38
Autor Wiadomość
KrulTibianus
Temat założony przez niniejszego użytkownika
C++ Tekstowa baza danych - pomoc w rozgryzieniu problemu
» 2018-08-27 16:25:49
Cześć.
Mam do zrobienia bazę danych bez używania zewnętrznych narzędzi typu SQL. Widok konsolowy. W poleceniu mam zadane, że program ma być podzielony na klasy w następujący sposób:
-klasa widoku Interfejs
-klasa zarządzająca bazą Database
-klasy podstawowe Klient(dziedziczy po Osoba), Pracownik(dziedziczy po Osoba), Pojazd, Przesyłka, Umowa. Każdy z obiektów klas ma swoje ID i inne pola.
-klasy tabelowe Klient_Table, Pracownik_Table, Pojazd_Table, itd.

Wstępnie planuję takie działanie - ekran logowania pracownika - załadowanie danych z plików txt do pamięci - wyświetlenie menu - pracownik uzyskuje dostęp do bazy i ma możliwość dodawania/usuwania/modyfikacji klientów, pracowników i pojazdów, a także dodawania nowych przesyłek oraz umów. Oczywiście ma możliwość odczytu danych, do tego może przeszukiwać rekordy (będę używać regexów), np. chcąc znaleźć przesyłki przewożone przez Pojazd X, program przeszuka "Umowa_Table" (Umowa zawiera Klienta, Pracownika, Przesyłkę, Pojazd przewożący) i wyświetli coś w stylu:
"Przesylki przewiezione przez samochod X:
id_przesyłki1 nazwa_przesyłki1
id_przesyłki2 nazwa_przesyłki2"
Po zakończeniu wszelkich czynności, przy wylogowaniu, program zapisuje wszystkie zmiany do plików. Wtedy z kolei w przypadku wysypania się programu po iluś modyfikacjach w bazie, modyfikacje nie byłyby zapisane w plikach - jak się przed tym zabezpieczyć?

Czego ogólnie nie rozumiem? Jak logicznie rozdzielić metody na klasy tabelowe i klasę Database.

Po małym researchu znalazłem taki temat http://cpp0x.pl/forum/temat/?id=26389 , gdzie pomocny jest post mateczka (P-167855), który mówi, że metody dodające/modyfikujące/usuwające powinny być nie w klasie "osoba", a w klasie "lista_osob", czyli rozumiem, że w moim przypadku będą one w klasach tabelowych. Czy metody wyszukujące po regexie też mają być w klasach tabelowych, czy w Database? Ogólnie, jeśli dobrze rozumuję, to te klasy tabelowe mają zawierać tylko jedno główne pole, np. Pojazd_Table ma mieć pole "list<Pojazd> listapojazdów", do którego ładowane będą rekordy z pliku "pojazdy.txt" (ewentualnie jakieś dodatkowe, jeśli będą potrzebne)? Metody odczytu/zapisu z plików lepiej by były właśnie w klasach tabelowych, czy w Database?
Jakie potencjalne metody w takim razie pozostaną dla klas podstawowych? Czy klasy podstawowe są po prostu podstawką dla klas tabelowych, bo klasa podstawowa tylko reprezentuje jeden rekord z klasy tabelowej - jest elementem jej listy, tak? Czy bardziej elementem listy będzie pojedynczy rekord (linia) wczytany z pliku, a klasa podstawowa ze swoim konstruktorem bierze udział tylko przy dodawaniu nowego elementu do tabeli (listy klasy tabelowej)?
Czy ktoś widzi tutaj zastosowanie dla szablonu klas/funkcji? Czy mógłbym zrobić w klasie Database np. szablon funkcji dodawania nowego elementu do bazy, który sprawdzałby jakoś przyjęty parametr (np. Klient) i w zależności od przyjętego obiektu wprowadzałby go do odpowiedniej klasy tabelowej? Tak samo wydaje mi się, że podobnie mógłby działać szablon odczytu (i następny szablon zapisu) odpowiednich plików?

Sorry, że tak rozlegle, ale błądzę po tej abstrakcji i tylko coraz więcej pytań się rodzi. :P
P-172219
pekfos
» 2018-08-27 18:27:23
Wstępnie planuję takie działanie - ekran logowania pracownika - załadowanie danych z plików txt do pamięci
Brzmi jakbyś robił "bazę danych". Masz robić bazę danych, czy bawić się w bazę danych? Prawdziwa baza danych nie ładuje plików do pamięci.

Wtedy z kolei w przypadku wysypania się programu po iluś modyfikacjach w bazie, modyfikacje nie byłyby zapisane w plikach - jak się przed tym zabezpieczyć?
Najlepiej jakby program się nie wysypywał.

gdzie pomocny jest post mateczka (P-167855), który mówi, że metody dodające/modyfikujące/usuwające powinny być nie w klasie "osoba", a w klasie "lista_osob"
Musiałeś szukać takich rzeczy? Kod obiektowy ma mieć sens. Dodawanie osoby do listy osób ma sens. Dodawanie osoby do drugiej osoby nie ma sensu. (Chyba że te "dodawanie" to eufemizm na coś..)
P-172223
KrulTibianus
Temat założony przez niniejszego użytkownika
» 2018-08-27 19:37:35
Dzięki za odzew.
Właśnie przez to, że mam operować na plikach txt, a baza nie ma być ogromna, dostałem zieloną lampkę na wczytywanie jej do pamięci, co byłoby dla mnie prostsze. Rozumiem, że to zła praktyka i prawdziwa baza danych uzyskuje dostęp do danych w czasie rzeczywistym.
Głównym zamysłem postu było dowiedzenie się, jak logicznie rozdzielić metody po klasach tabelowych, a czym ma zarządzać główna klasa database, mógłbyś się do tego odnieść?
P-172229
pekfos
» 2018-08-27 20:22:45
Rozumiem, że to zła praktyka i prawdziwa baza danych uzyskuje dostęp do danych w czasie rzeczywistym.
To niemożliwa praktyka.

Głównym zamysłem postu było dowiedzenie się, jak logicznie rozdzielić metody po klasach tabelowych, a czym ma zarządzać główna klasa database, mógłbyś się do tego odnieść?
Przecież się odniosłem. Kod ma mieć sens. Jeśli nie ma sensu, to robisz go źle. Zrób dowolnie z sensem. Nazwy klas narzucają ci zakres funkcjonalności. Metody i pola albo masz narzucone, albo to kwestia implementacyjna - zrób dowolnie z sensem.
P-172231
KrulTibianus
Temat założony przez niniejszego użytkownika
» 2018-08-27 20:38:19
Ok, na pewno odezwę się z jakimiś konkretami przy przyszłych przeszkodach. Na razie dzięki.
P-172232
« 1 »
  Strona 1 z 1