Klasy - pytanie od kompletnego nooba.

0

Witam,

Otóż sprawa wygląda tak:
Na studiach programowałem w Delphi, spodobało mi się. Mój projekt inżynierski to była implementacja obliczania przepustowości skrzyżowań bez sygnalizacji świetlnej w Delphi. Projekt wyszedł dosyć dobrze, był nawet konkretny - bo jedna taka instrukcja ma ok. 100 stron i masę wzorów i przypadków.

Przykładowo - przepustowość jest zależna od kierunków w jakie można jechać z danego pasa (tzw. relacje), natężenia pojazdów na skrzyżowaniu, ilości pasów, występowania skanalizowania skrzyżowania, przejść dla pieszych, umiejscowienia skrzyżowania (duże miasto, małe, itp.) i wiele innych. Oblicza się przepustowości dla skrzyżowań, wlotów i poszczególnych pasów.

Stworzyłem kilka klas robiąc ten projekt, jednak większość projektu była robiona strukturalnie.

Ostatnio nieco zainteresowałem się Javą która jest w pełni obiektowa i w związku z tym próbuję zrozumieć jak powinno się tworzyć klasy. Zrobiłem kilka prostych programów, ale każdy był malutki. Chciałbym zrobić podobny projekt w Javie, jednak nie do końca rozumiem koncepcję tworzenia klas.

Przykładowo stworzę sobie klasy "Skrzyzowanie", "Wloty", "Pasy", "Relacje". Jak wiadomo W skrzyżowaniu znajdują się:

  • wloty,
  • na wlotach znajdują się pasy,
  • na pasach znajdują się relacje.

Później dochodzą jeszcze takie rzeczy jak:

  • przejścia dla pieszych na wlotach,
  • skanalizowanie wlotu,
  • znaki stop lub ustąp pierwszeństwa dla wlotu,
  • natężenia ruchu na pasach,
  • natężenie ruchu dla poszczególnych kierunków,
  • udział ciężarówek/rowerów/autobusów dla kierunku,
  • itd..
    Może jednak powinienem wszystkie te informacje zawrzeć w jednej klasie?

Kiedy już mamy opisane skrzyżowanie, trzeba stworzyć metody dla obliczania przepustowości. Zaczynając od:

  • przepustowości relacji,
  • przez przepustowości wlotów,
  • kończąc na przepustowości skrzyżowania.
    Do tego jest masa wzorów. Czy te wzory powinny być w kolejnej klasie o nazwie "Natężenia", czy może poszczególne metody dla obliczania natężeń powinienem zawrzeć w klasach do których się odwołują? Ostatecznie kompletnie wszystko jest ze sobą powiązane, poza metodami obliczania poszczególnych natężeń i współczynników. Okej, więc klasy muszą być publiczne, w nich są zawarte prywatne metody i ostateczny wynik po obliczeniach jest publiczny żeby inne klasy mogły z niego korzystać. Jednak czytałem gdzieś, że klasy nie powinny być od siebie aż tak zależne, więc nie wiem co o tym myśleć.

Mam parę myśli jak mógłbym to zrobić, jednak nie chcę zaczynać od robienia czegoś źle. Owszem jest dużo tutoriali czy książek i staram się zrozumieć jak się do tego zabrać tak czysto teoretycznie. Są może jakieś wzorce które mi podpowiedzą co mam zrobić?

Pytanie więc do doświadczonych programistów znających się na OOP:
Jak wy byście się zabrali za tworzenie takich klas? Co polecacie poczytać? Czy dobrze robię ucząc się Javy tworząc aplikację graficzną od podstaw? Może jakiś inny język programowania będzie się do tego lepiej nadawał (chociaż wolałbym jednak Javę)?

1

Pierwsza koncepcja wydaje się Skrzyżowanie zawiera x wlotów, każdy wlot y pasów. I teraz zależnie od tego jak rozbudowane ma być przejście. Ja bym w każdym wlocie zawarł bool, czy zawiera przejście dla pieszych. Właściwie drugie wyliczenie to same zmienne do zawarcia w odpowiednich klasach. Wzory mogą być bezpośrednio w metodach, lub lepiej (jeśli korzystasz z nich w wielu miejscach) funkcje globalne, tudzież statycze metody klasy głównej. Wtedy można łatwo wzór sprawdzić, zmienić i kod staje się czytelniejszy (nazwa funkcji mówi co dany wzór robi/co to za wzór).

Co do zależności klas między sobą - wszystko zależy od wzorca architektonicznego, ewentualnie projektu. Grunt, aby kod był wydajny, czytelny i logiczny. Wiele zależy też od tego co się kodzi.

Poczytać najlepiej jakąś dużą książkę o javie. (nie moja działka - ktoś pewnie poleci).
Java jest do kodzenia na szybko. Programy pisze się w niej szybciej (w porównaniu do C++) i z reguły mają mniej błędów (garbage collector i te sprawy), ale to kosztem wydajności. Do tak prostej aplikacji java będzie dobrym rozwiązaniem.

Nie wiem jak dokładnie miałby działać. Dlatego wszystko a czuja, ale wydaje mi się, że dobrze myślisz. Możesz ewetualnie poczytać o wzorach projektowych:
http://cpp0x.pl/kursy/Wzorce-projektowe/152

Pisane w C++, ale chodzi o to, żebyś poczytał opisy. Są to różne przykłady 'fajnego' wykorzystania OOP.

0

Co do tego jak program miałby działać...

  1. Tworzysz skrzyżowanie:
  • ilości wlotów
  • ilości pasów na wlotach
  1. Ustalasz relacje (kierunki w które można jechać) dla każdego pojedynczego pasa
  2. Wybierasz dodatkowe opcje:
  • znaki drogowe
  • umiejscowienie skrzyżowania
  • skanalizowanie wlotu
  • poszerzenie pasa ruchu
  • czy występuje szeroka wyspa dzieląca + jej długość
  • występowanie przystanku autobusowego i częstotliwość kursowania autobusu
  1. Ustalasz natężenia:
  • dla poszczególnych pasów, jeśli to możliwe - jeśli nie, są na to wzory
  • dla poszczególnych relacji na pasach (relacje L, W, P - lewo, wporst, prawo) jeśli to możliwe, jeśli nie, są na to wzory
  1. Ustalasz udział rowerów/ciężarówek/autobusów dla danej relacji

  2. Klikasz oblicz, i tutaj program wylicza:

  • tzw. tablice mnożników relacji nadrzędnych, na podstawie której wyliczane są natężenia relacji nadrzędnych
  • na podstawie tych natężeń wyliczane są tzw. współczynniki dławienia (jak bardzo ruch na wlotach podporządkowanych jest 'dławiony' przez ruch na wlotach nadrzędnych)
  • na podstawie wsp. dławienia i natężeń relacji nadrzędnych wyliczane są przepustowości relacji podporządkowanych
  • Na podstawie przepustowości relacji podporządkowanych obliczane są przepustowości wlotów

I tyle :). W bardzo dużym uproszczeniu :D. W Delphi ogarnąłem to w 2 tygodnie.

1
  1. 2, albo 3 klasy - w zależności od tego ile będziesz robił obliczeń.
    Klasa dla skrzyżowania - automatycznie generująca sobie n wlotów.
    (ewentualna)Klasa dla pasa.

  2. Kierunki bym dał jako sumę logiczną flag. 0x0001, 0x002, 0x004 (jak nie wiesz o co chodzi to możesz dać - 1 - L; 2 - W; 3 - L+W; 4 - P; 5 - P+L; 6 - P+W; 7 - L+W+P albo po prostu 3x bool).

  3. Znaki drogowe - (pewnie 1 na pas to zmienna).
    Skanalizowanie - no idea what is this
    Poszerzenie - zmienna
    Czy wystepuje - bool (zmienna)
    przystanek - zmienna (wystarczy częstotliwość. Jeśli 0 to brak przystanku)

    Umiejscowienie - Jeśli będzie więcej niż jedno skrzyżowanie to dobrze zrobić dodatkowy obiekt (mapa, graf) i niech on zajmuje się umiejscowieniem.

  4. Wywoływanie metod do zmiany zmiennych obiektów.

  5. Wywoływanie metod do zmiany zmiennych.

  6. Wywołanie kilku metod, lub wywołanie metody zwracającej jakąś strukturkę.

0

Okej, wielkie dzięki, zaraz biorę się do roboty. Możliwe że od czasu do czasu będę aktualizował swoje postępy w nauce Javy i w tworzeniu Programu :).

A skanalizowany wlot (a raczej poprawnie -> skanalizowany prawoskręt) to po prostu występowanie wyspy trójkątnej i pas wychodzący z wlotu do jazdy w prawo. Ale tutaj też są tylko dwie opcje - występuje, albo nie występuje, a więc bool.

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