Представьте себе будильник:
Пусть у него имеются три кнопки. H
- кнопка для увеличения часа на единицу, M
- для увеличения минуты на единицу и кнопка Mode
, которая переключает часы в режим настройки будильника. В этом режиме на экране отображается время срабатывания будильника, а кнопки H
и M
устанавливают не текущее время, а время срабатывания будильника. Повторное нажатие кнопки Mode
возвращает часы в обычный режим. Кроме того, затяжное нажатие на кнопку Mode
приводит к тому, что будильник активируется. Такое же нажатие ещё раз отключает будильник.
После этого, если будильник активен и текущее время совпадает со временем будильника, включается звонок, который отключается либо нажатием кнопки Mode
, либо самопроизвольно через минуту. Кнопки H
и M
в режиме звонка (когда сработал будильник) не активны.
Поведение часов с будильником уже является сложным, поскольку одни и те же входные воздействия (нажатие одних и тех же кнопок) в зависимости от режима инициируют различные действия.
В программных и программно-аппаратных вычислительных системах сущности со сложным поведением встречаются очень часто. Таким свойством обладают устройства управления, сетевые протоколы, диалоговые окна, персонажи компьютерных игр и многие другие объекты и системы.
Подведём итог. У нас есть следующие действия:
- Установка времени
- Установка времени срабатывания будильника
- Включение/Выключение будильника
- Отключение звонка будильника
При использовании кнопок H
и M
часы и минуты изменяются независимо, и никак друг на друга не влияют (как и в большинстве реальных будильников). То есть если происходит увеличение минут с 59 до 60 (сброс на 00), то цифра с часами остается неизменной.
Интерфейсными методами часов являются:
clickMode()
- нажатие на кнопкуMode
longClickMode()
- долгое нажатие на кнопкуMode
clickH()
- нажатие на кнопкуH
clickM()
- нажатие на кнопкуM
tick()
- при вызове, увеличивает время на одну минуту. Если новое время совпало со временем на будильнике, то часы переключаются в режим срабатывания будильника (bell).isAlarmOn()
- показывает включен ли режим будильникаisAlarmTime()
- возвращаетtrue
, если время на часах совпадает со временем на будильникеgetMinutes()
- возвращает минуты, установленные на часахgetHours()
- возвращает часы, установленные на часахgetAlarmMinutes()
- возвращает минуты, установленные на будильникеgetAlarmHours()
- возвращает часы, установленные на будильникеgetCurrentMode()
- возвращает текущий режим (alarm | clock | bell)
Основной спецификацией к данной задачe нужно считать тесты.
AlarmClock.php
Реализуйте интерфейсные методы и логику работы часов.
States/AlarmState.php, States/BellState.php, States/ClockState.php
Реализуйте логику состояний.
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.