Pierwszy program w Javie - potrzebna konstruktywna krytyka

Pierwszy program w Javie - potrzebna konstruktywna krytyka
kamedor
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Warszawa
  • Postów:6
0

Cześć, witam.
Napisałem program, który z założenia miał być wirtualną wersją gry w "Monopoly". Link do repozytorium: https://github.com/kamedor/monopoly1.1 . Funkcje zaimplementowane do tej pory:

  • wczytywanie danych o planszy z pliku "zapisane/danePlanszy.txt"
  • wczytywanie danych o graczach
  • zaimplementowane 9 różnych rodzajów pól na planszy oraz większości akcji dla nich (m.in.: kupowanie dla Ulic, pobieranie czynszu, wypłata 200zł za przekroczenie startu)
  • prowizoryczna wersja rozgrywki poprzez terminal.
    Proszę was o przejrzenie kodu itp. Czekam na uwagi/podpowiedzi/rady odnośnie kodu. Z góry dzięki za każdą pomoc.
    PS. Swoje "Hello world" w Javie napisałem około miesiąc temu, więc się nie załamujcie :D

"Done is better than perfect"
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:3 minuty
  • Postów:6656
1

Plików class nie wersjonuj. Dodaj out/ do .gitignore.


🕹️⌨️🖥️🖱️🎮
edytowany 4x, ostatnio: Spine
kamedor
zrobione. dzięki
niezdecydowany
niezdecydowany
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 9 lat
  • Lokalizacja:Bieszczady
1
  1. Java7 to switche ze stringami których używasz ale także try-with-reosueces którego nie używasz(wygooglaj), to także NIO.2 i np: klasa Path czy Paths których także nie używasz, poczytaj o tym, warto !
Kopiuj
 case "przedsiębiorstwo":
nazwa = inFile.next();
rodzajPola = Pole.rodzajPola.PRZEDSIEBIORSTWO;
Plansza.addPole(rodzajPola, nazwa);
break;
case "start":
rodzajPola = Pole.rodzajPola.START;
Plansza.addPole(rodzajPola, "START");
break;
case "parking":
rodzajPola = Pole.rodzajPola.PARKING;
Plansza.addPole(rodzajPola, "PARKING");
break;
case "szansa":
rodzajPola = Pole.rodzajPola.SZANSA;
Plansza.addPole(rodzajPola, "SZANSA");
break;
case "kasa":
inFile.next(); // wczytaj słowo społeczna (- niepotrzebne słowo)
rodzajPola = Pole.rodzajPola.KASA_SPOLECZNA;
Plansza.addPole(rodzajPola, "KASA SPOŁECZNA");
break;
case "więzienie":
rodzajPola = Pole.rodzajPola.WIEZIENIE;
Plansza.addPole(rodzajPola, "WIĘZIENIE");
break;
case "podatek":
inFile.next(); // wczytaj słowo dochodowy (- niepotrzebne słowo)
int oplata = inFile.nextInt();
rodzajPola = Pole.rodzajPola.PODATEK_DOCHODOWY;
Plansza.addPole(rodzajPola, "PODATEK DOCHODOWY", oplata);
break;
case "dworzec":
nazwa = inFile.next();
rodzajPola = Pole.rodzajPola.DWORZEC;
Plansza.addPole(rodzajPola,nazwa);
break;

każdy taki case powinien być metodą, powtarzasz kod, źle !
//DALEJ
Zamiast tych casów można to rozwiązać lepiej:

Kopiuj
doSomething(Types.PODATEK)

Takie coś powinno się wyciągać do metody

Kopiuj
 nazwa = inFile.next();
GraczCzlowiek graczCzlowiek = new GraczCzlowiek(nazwa);
gracze.add(graczCzlowiek);

A takie coś nie powinno się zdarzyć:

Kopiuj
ArrayList<Gracz> gracze = new ArrayList<>();

????????
isPozwolenieNaBudowe()

To jest słabe, Effective Java 2, Item 2

Kopiuj
 private int oplata = 0;
private Random generator = new Random();
public NieKupne(rodzajPola rodzaj, String nazwa){
this.rodzaj = rodzaj;
this.nazwa = nazwa;
this.nrPola = liczbaPol;
liczbaPol++;
}
public NieKupne(rodzajPola rodzaj, String nazwa, int oplata){
this.rodzaj = rodzaj;
this.nazwa = nazwa;
this.oplata = oplata;
this.nrPola = liczbaPol;
liczbaPol++;
}

Te metody robią zdecydowanie za dużo, jedna metoda jedna akcja.
https://github.com/kamedor/monopoly1.1/blob/master/src/Gracz.java

te nazwymetod, klas, zmiennych są śmieszkowe...

<trololo> Tam faktycznie są testy, najs :D nie rób takich kitajskich taktyk.... użyj jak człowiek Junita :D </trololo>

"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
edytowany 3x, ostatnio: niezdecydowany
GA
isPozwolenieNaBudowe() rozwaliło mnie :)
kamedor
isPozwolenie... już zmieniłem - taki ponglish z tego wyszedł. Co do rad: 1. Jeszcze to ogarnę, ale nie mam już dzisiaj na to sił. 2. cytowany case zmieniłem na mniejsze funkcję + klasy pochodne zamiast enumu "rodzajPola" - myślę, żeby przenieść te małe funkcje np. wczytajDworzec do innej klasy. 3. "ArrayList<Gracz> gracze = new ArrayList<>();" - nie mam pojęcia o co chodzi ;) . Jeśli możesz to napisz o co Ci chodziło. 4. Zrobiłem na razie na czuja. Potem z googluje. 5. Na JUnit jeszcze przyjdzie czas - "nie Od razu Kraków..." itd. PS. Kod oczywiście na Github'ie.
GA
3.List<Gracz> gracze = new ArrayList<>(); o to chodziło
kamedor
ok poczytam o tym. dzięki
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:14 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Na szybko

  1. polskie znaki w nazwach metod to zuo (specjalnie bez ł, bo ł zamieniło się w kodzie na ³).
  2. InputOutputFile, za dużo kodu, za dużo odpowiedzialności, za bardzo nagmatwane. Tego kobylastego switcha można zamienić na delegację do mniejszych metod i obudować odpowiednią mapą.
  3. Kupne.getAktualnyCzynsz switch w swichu. Zewnętrzny zamień na dziedziczenie. Wewnętrzny niech będzie implementacją metody w poszczególnych podklasach.
  4. klasy TDD nie są testami. Nic w nich nie sprawdzasz. To jest taki bardziej rozbudowany dupa-debug.

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
kamedor
1. Teraz nie będę zmieniał - w następnym programie będę pamiętał. 2. pracuje nad tym. 3. Zrobione 4. Wyrzucone, chociaż raz się przydały ;D Dam znać jak odchaczę całą listę zadań, którą mnie dzisiaj zarzuciliście.
GA
1. Powinieneś to zmienić koniecznie. Każde porządne idę ma opcje refaktoringu wiec dla tych paru klas zajmie Ci to max 5min.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.