Zacznij od interfejsu. Pomyśl co zwykła winda w praktyce ma.
- Na każdym piętrze przycisk do przywołania wraz z określeniem czy chcesz jechać w górę czy w dół
- W środku przyciski do jazdy na piętro
- W środku przycisk alarmu
Obecnie większość wind automatycznie zamyka i otwiera drzwi. Może to powinna być wewnętrzna sprawa windy i użytkownik nie powinien robić tego ręcznie?
Druga sprawa to wyświetlanie stanu windy. Na którym jest piętrze, czy ma otwarte czy zamknięte drzwi, czy jedzie, czy stoi, itd. Rozwiązaniem jest wzorzec obserwator. Interfejs powinien zatem posiadać metodę do rejestracji obserwatora.
Mając to, możesz zbudować sobie gui. coś co będzie symulowało budynek z podziałem na piętra, na każdym po 2 przyciski. dodatkowo okienko z widoku windy gdzie ludziki w środku będą mogły wciskać przyciski. Zrób referencję do interfejsu windy i podepnij każdy przycisk do odpowiedniej funkcji. Teraz, gdyby tylko mieć implementację windy, można by było już jeździć, zatem wiesz co masz zrobić.
Do jej implementacji polecam wzorzec maszyny stanów. Jeżeli ktoś chce jechać w dół, ale wciśnie oba przyciski, a winda jedzie z dołu do góry to zatrzyma się na piętrze, ale mimo wciśniętego przycisku z niższym piętrem pojedzie dalej w górę.
No dobra, ale załóżmy że chcesz zacząć ładnie od testów. Winda musi działać na wątku, żeby odpowiednie czynności trwały ileś czasu a nie wykonywały się natychmiastowo. Trzeba do windy dodać metodę która przyjmię deltę czasu od ostatniej aktualizacji. Jedyną rzeczą jaką wątek musi zrobić to aktualizacja tego czasu. Możesz wtedy popisać testy i ręcznie aktualizować ten czas. Np test otwierania drzwi.
- (Before) Stwórz windę z czasem czekania otwartych drzwi 5 sekund oraz czasem zamykania 1 sekunda, oraz doprowadź ją do stanu w którym drzwi na piętrze się otworzyły
- zaczekaj 4.9s
- sprawdź czy drzwi są otwarte
- sprawdź czy nie wysłano do obserwatora żadnego komunikatu
- zaczekaj 0.1s
- sprawdz czy obserwator otrzymał komunikat o tym że drzwi zaczęły się zamykać
- sprawdz czy stan windy to "zamykanie drzwi"
*zaczekaj 0.9s
- sprawdz czy stan windy to "zamykanie drzwi"
- sprawdź czy nie wysłano do obserwatora żadnego komunikatu
- zaczekaj 0.1s
- sprawdz czy obserwator otrzymał komunikat o tym że drzwi zostały zamknięte
- sprawdz czy stan windy to "postój z zamkniętymi drzwiami"
A co gdy drzwi będą się zamykać a ktoś kliknie przycisk otwarcia drzwi lub drzwi zostaną zatrzymane nogą? Też do tego testy.
Najlepiej by było jakbyś napisał kilka wersji windy. Pierwsza ma być tempa, komunistyczna i po prostu wozić tyłek. Każda kolejna ma mieć dodatkowy feature, a ostatnia być wypasiona jak te w nowych wieżowcach.