Koncepcja klas

0

Tak, to znowu ja. Tym razem pisze w sekcji newbie więc może nie znajdzie mnie payl :P

Ale do rzeczy. Do tej pory pisałem głównie w delphi. Były to aplikacje okienkowe i nigdy specjalnie nie przejmowałem się klasami. Formatki tworzyłem kreatorem a on wstawiał niezbędny kod. Zajmowałem się procedurami obsługującymi przyciski.

Potem przyszedł czas na książkę do JAVY i tu w zasadzie poznałem programowanie obiektowe. Nie miałem jednak jeszcze okazji popisać zbyt wiele (jakieś początki na Androidzie).

Obecnie muszę wykazać się sensowną strukturą klas w małym projekcie który mi zlecono. Nie wyrobiłem sobie jeszcze chyba odpowiedniego sposobu myślenia Jeśli chodzi o OOP dlatego chciałem prosić o jakąś podpowiedź.

Stworzyłem szereg funkcji obsługujących pewien format tekstowy oraz formatkę prezentującą ich działanie. Funkcje rozłożyłem w dwóch modułach, formatka jest na kolejnym. Nie sądzę jednak, żeby to było "profesjonalne" rozwiązanie sprawy. Zleceniodawca oczekuje ode mnie większego skupienia się na koncepcji klas.

Oto przykładowy plik, który obsługuje:

-IdentDostawcy----StandardPL-IdentOdbiorcy-DataWystawienia
 FAH/1319/93/95   1          120027        03.01.19
 
-KSBLOZ-------NazwaTowaru--------------------------------Ilosc---
 116590111000 Vit. A kaps. 12,000 j.m. 50 szt.            10.000
 116590311000 Vit. A plyn 50.000 j.m./1ml 10 ml            5.000
 119530111009 Vit. A+D3 (2000j.m.A+1000j.m kaps. 50 szt.   5.000
 119530311057 Vit. A+D3 solutio aquosa krople 10ml         5.000

Plik może mieć różną zawartość kolumn w części nagłówka jak i części głównej oraz dowolną liczbę rekordów.
Stworzyłem już funkcje odpowiedzialne za:
*zliczanie ilości znaków w kolumnach (osobno dla nagłówka i części głównej)
*zliczanie ilości kolumn (osobno dla nagłówka i części głównej)
*zwracanie nazw kolumn w tablicy lub pojedynczo(osobno dla nagłówka i części głównej)
*zwracanie tablicy wielowymiarowej z polami głównej części pliku
*zwracanie wartości dowolnej kolumny przy podanym KSBLOZ

Dopisze jeszcze:
*dopisywanie nowego wiersza
*usuwanie wybranego wiersza
*modyfikowanie dowolnej wartości

Mój dylemat:
Wiadomo, że muszę mieć jedną formatkę, która jest klasą dziedziczącą po TForm i przyznam bez bicia nie wiem jakie inne klasy mógłbym stworzyć by projekt był bardziej przejrzysty. Wydaje mi się on tak niewielki, że najchętniej wszystko zmieściłbym w jednej :/ Jednak muszę na siłę poupychac to do klas, eby pokazać, że potrafię na nich operować.

Myślałem o następujących klasach:
*TMain - formatka do prezentacji
*TColumns - zawierająca metody obsługujące parsowanie wierszy z kolumnami
*TRecords - zawierająca metody obsługujące parsowanie wierszy z rekordami
*TEditData - zawierająca metody obsługujące modyfikowanie pojedynczych wartosci w pliku, dodawanie i usuwanie wierszy

Może ktoś będzie miał dla mnie lepszą propozycje struktury

1

Obecnie muszę wykazać się sensowną strukturą klas w małym projekcie który mi zlecono. Nie wyrobiłem sobie jeszcze chyba odpowiedniego sposobu myślenia Jeśli chodzi o OOP dlatego chciałem prosić o jakąś podpowiedź.

Sensownie to będzie zrobić jedną klasę i w niej wszystko. Zleceniobiorca cię sprytnie testuje :P

A tak serio - samo pogrupowanie funkcji po oddzielnych plikach nie daje ci od razu programowania obiektowego. Zamiast tworzyć klasy dla "pola", "kolumny" stwórz klasę Towar. Czaisz? Po co ci milion obiektów klasy TRecords? Chyba że nie chcesz tworzyć obiektów tej klasy, tylko bedziesz miał wszystkie metody statyczne.

Ciężko to wytłumaczyć. To musi zaskoczyć. Spróbuj zamiast dzielić kod po kodzie, zastanowić się, na czym tak naprawdę będziesz operować? Postaraj się jak najdokładniej odwzorować świat prawdziwy na wirtualny. Czyli - dodajesz do danych Odbiorcę i Towar. No to zrób klasę Towar i klasę Odbiorca a w nich metody do dodawania, usuwania, edycji Odbiorcy i Towaru. A nie wiersza i kolumny....

0

Dokładnie takich podpowiedzi potrzebowałem. Rodzajów dokumentów jest kilka (faktura, WZ etc) i to z nich zrobię klasy. Będą obsługiwac poszczególne dokumenty. Z opisanych wyżej funkcji zrobie klase główną po której będa dziedziczyć moje dokumenty.

I teraz pytanie:
Czy aby posłużyć się metodą z klasy nadrzędnej usze wywoływać konstruktor? W javie zdaje sie nie musiałem

2

ja jak zaczynam pisać kod to najpierw piszę sobie jakbym chciał, żeby ten końcowy wyglądał - czyli tak jakbym miał już te klasy napisane. np tak:

// nagłówki

int main()
{
  Reader* r = new FileReader("nazwapliku.txt");
  if (r->ErrorOccured())
    {
      cout << r->getError();
      delete r;
      return 0;
    }
  Records recs = r->getRecords(); // pobiera tablicę rekordów, Records to może być np.: vector<Record>
  Columns cols = r->getColumns(); // pobiera nazwy kolumn np.: vecotr<string>
  delete r;
  for (Columns::iterator i = cols.begin(); i!=cols.end(); ++i)
    {
      cout << *i << "\t";
    }
  cout << "\n";
  for (Records::iterator i = recs.begin(); i!=recs.end(); ++i)
    {
      for (Record::iterator j = i->begin(); j!=i->end; ++j)
         cout << *j << "\t";
      cout << "\n";
    }
  return 0;
}

i później piszesz wszystko to co sobie wymyśliłeś - idzie szybko

0

Znaczy że twoja klasa dziedziczy po jakiejś klasie, do metod której chcesz mieć dostęp?
Raczej powinieneś mieć dostęp z wnętrza klasy. Tyle że ja w delphi nie piszę, ale spróbuj:
Me albo this
i zobaczy do jakich metod masz dostęp dla tego obiektu.

0

Ale nie napisałeś (albo przeoczyłem) co ten program tak naprawdę ma robić?

Pełna obsługa pliku?
Ja na dzień dzisiejszy zrobiłbym tylko dwie funkcje - konwersji do/z obiekty(ów) XML/DOM.
A na nich możesz sobie majstrować dowolnie.
Gdyby się okazało że XML to za dużo, to można użyć jakiegoś innego kompozytu:
http://sourcemaking.com/design_patterns/composite/cpp/1

Publiczne implementacje nie-XML jakie znam które by Ci się przydały to:

Ale generalnie to taki plik nie jest dobrym formatem baz danych...

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