Zastosowałem tu trochę nietypowy sposób pracy z repozytorium. Kolejne wersje znajdują się w osobnych gałęziach. Pierwsza, najprostsza implementacja znajduje się w gałęzi step-1, kolejna wersja (po stworzeniu klasy Player
) -- w gałęzi step-2 itd.
Spis etapów
- step-1: Pierwsza, najprostsza implementacja, wszystko w metodzie
main()
. - step-2: Dodana klasa
Player
reprezentująca gracza. W klasie tylko jedna metoda intguess()
. - step-3: Do klasy
Player
dodane pole imienia (name
). Dodany setter sprawdzający poprawność danych (na razie wykluczenienull
i łańcucha pustego). Prywatnie, publicznie, pakietowo. - step-4: Konstruktory w klasie
Player
. Imię domyślne. - step-5: Dodana klasa
PlayerHuman
, która dziedziczy poPlayer
i wprowadza inny sposób odgadywania. - step-6: Poprawiona struktura klas graczy: abstrakcyjna klasa bazowa
Player
z abstrakcyjną metodąguess()
. Wprowadzona klasaPlayerComp
. - step-7: W przypadku przekazania do settera
setName()
klasyPlayer
nieprawidłowego imienia, rzucany jest wyjątekIllegalArgumentException
. - step-8: Poprawność imienia sprawdzamy za pomocą wyrażenia regularnego.
- step-9: Logika gry przeniesiona do klasy
Game
. - step-10: Metody
addPlayer()
iplay()
w klasieGame
przystosowane do trybu multiplayer. Zastosowanie kolekcji (ArrayList
). Wprowadzenie iteratora. - step-11: Imiona graczy muszą być unikatowe -- modyfikacja w metodzie
addPlayer()
. Zastosowanie rekurencji. - step-12: Dodane metody
removePlayer()
iprintPlayers()
. - step-13: Dodana klasa
Statistics
z metodami umożliwiającymi prowadzenie statystyk wygranych. Zastosowanie mapy (HashMap
). Obiekt klasyStatistics
jest przekazywany do obiektu gry poprzez konstruktorGame(Statistics)
-- namiastka tzw. wstrzykiwanie zależności (ang. dependency injection). - step-14: Dodanie możliwości przeprowadzania gry bez statystyk (konstruktor bezparametrowy
Game()
). Zastosowanie wzorca Null Object (pusty obiekt): interfejsStatistics
, klasaNullStatistics
. Dotychczasowa klasa statystyk zmieniła nazwę naWinStatistics
. - step-15: Wielkie końcowe porządki: utworzone dwa pakiety (players, statistics), w których wylądowały odpowiednie klasy.