Задачи для начинающих
И еще. Если код для начинающих, то он должен чему то учить. Цель не научить рисовать светофоры. Поэтому во-первых не нужно усложнять задание задержками включения кнопки. Слишком много деталей. Во-вторых на примере должно быть видно, насколько код устойчив к изменениям. Небольшие изменения в техзадании - насколько нужно переписывать код? Насколько легко код понимают и могут воспроизвести коллеги? Насколько легко колеги могут код допилить?
Если бабушка подошла к светофору за 2 секунды до отключения зелёного, то на светофоре не написано что 2 секунды осталось, поэтому бабушка даже об это не узнает, а пойдет через дорогу.
Бабушка зрячая и видит, что зеленый уже долго горит. Так что даже если нет таймера, бабушка все равно трезво оценивает ситуацию и понимает, что перейти в зеленую фазу она не успеет.
красной фазе чего? ежели он нажмет когда машинам красный - то флаг ему в руки, все его потуги пойдут в игнор.
Красной фазе пешеходам и соответственно зеленой фазе машинам.
оборудование не было оговорено, что в кнопке тригер сидит.программа расчитана на тупое замыкание контактов.
Так это ради бога. Вопрос в том, как кнопку интерпритирует программист. Ее (кнопку) удобно представлять в виде простого триггера, который умеет делать всего 2 вещи: 1) сообщать о своем состоянии (на важно как) и 2) сбрасывать состояние в "неактивное".
это программой предусмотренно.
Да? В каком месте? Я у тебя в диаграмме вижу "пешеход отжал кнопку". Так вот уверяю тебя, что ни один пешеход никогда в жизни не будет отжимать кнопку. Так что твоя диаграмма заведомо нерабочая.
Так что даже если нет таймера, бабушка все равно трезво оценивает ситуацию и понимает, что перейти в зеленую фазу она не успеет.какая умная бабушка! видимо годы свои не зря прожила, а светофорный опыт всю жизнь оттачивала.

Но почему бабушка не знает, что ежели она хоть шаг на дорогу сделала (как положено, когда ей зеленый горел), то машины обязаны ее подождать?
Впрочем, чего спорить, если логику поменять - раз плюнуть?!
Какие у тебя предложения? Никогда не игнорировать кнопку?
Так вот уверяю тебя, что ни один пешеход никогда в жизни не будет отжимать кнопку. Так что твоя диаграмма заведомо нерабочая.так кнопки на светофорах вроде суперклеем не мажут

........
в диаграме указано что кнопка замыкает контакт и размыкает его. Сейчас светофор реагирует на размыкание, но можно сделать реакцию на замыкание.
Важно реагировать именно на изменение состояния кнопки, а не на само состояние.
Но почему бабушка не знает, что ежели она хоть шаг на дорогу сделала (как положено, когда ей зеленый горел), то машины обязаны ее подождать?
Я же писал, что бабушка это знает :) И я писал, что она очень вежлива и не любит, когда другие ее ждут :)
Какие у тебя предложения? Никогда не игнорировать кнопку?
Логика простая - когда пешеходам красный - можно опрашивать кнопку. Когда пешеходам зеленый - сбрасывать состояние кнопки. Все :) Во всех остальных состояниях кнопка никого не интересует.
когда пешеходам красный - можно опрашивать кнопку.так именно так и есть.
Когда пешеходам зеленый - сбрасывать состояние кнопки.когда зеленый - нажатия игнорируются, как будто их и не было.
Всё работает как ты желаешь.
Сегодня, хочу что нажатие кнопки сокращало зелёный машинам на какое то время. Завтра, что бы следующее сокращение могло происходило только после одного полного цикла. Послезавтра, что бы машины ездили не менее 15 секунд до срабатывания следующего запроса. Через неделю может еще, что захочется. И каждый раз надо думать как "собрать" все условия и где это всё разместить.так это просто смещение логики.
Если я рассматриваю сейчас всё устройство, как светофор(лампочки и логику) с кнопкой, то ты сейчас думаешь о кнопке с логикой, а сам светофор - одни лампочки.
Если очень хочется, то разделить логику лампочек и логику кнопки.
Но по-моему, плодить классы в задаче светофора уже одержимостью попахивает.
На мой взгляд тут один класс, у которого на вход подаётся состояние кнопки, а выходы подключаются к лампочкам. Но ни кнопка ни лампочки - не относятся к этому классу.
И если нужна какая-то логика для работы с лампочкой или кнопкой, то это должно быть сделано в других классах.
Но класс светофора от этого вообще не зависит. Ибо ему всё равно: пришел сигнал непосредственно с кнопки или из класса обслуживающего кнопку. Тоже - и о лампочках.
плодить классы в задаче светофора уже одержимостью попахивает.
Классы или есть или их нет. Не пишут сегодня классы, а завтра простыни. Твой код рабочий, но читать его очень тяжело. Там то кода один метод, но не хотел бы я править баги в таком коде.
мой взгляд тут один класс,
На твой взгляд тут классов нет. Ты пытаешься всунуть код в какой то контейнер , который ты считаешь классом и по количеству кода прикидывает, не нужен ли ещё один пвсевдокласс, а то первый великоват получается. Или не получается. Количество кода не критерий для инкапсуляции его в класс.
Количество кода не критерий для инкапсуляции его в класс.а кто выдвинул тут такой критерий?
Твой код рабочий, но читать его очень тяжело. Там то кода один метод, но не хотел бы я править баги в таком коде.а его читать и не надо. Это код автоматически сгенерированный из диаграммы. Читать и править надо диаграмму.
так кнопки на светофорах вроде суперклеем не мажут. Достаточно убрать руку чтоб кнопку отжать. Конечно это от устройства кнопки завсит.
В таком случае у меня 2 замечания:
1) если для того, чтобы отжать кнопку достаточно убрать руку, то не понятно, почему это действие присутствует в диаграмме. Ведь по-сути действия "отжать кнопку" не существует.
2) сейчас кнопки делаются в виде сенсора, а не в виде кнопки, т.е. там нет действия "нажать" или "отжать" :)
Важно реагировать именно на изменение состояния кнопки, а не на само состояние.
В этом твоя ошибка :) Потому что на самом деле все как раз наоборот. Изменение состояния кнопки - не интересно. Интересно состояние. При этом состояние интересно только в одной фазе светофора - когда машинам зеленый.
Во всех остальных случаях состояние кнопки тоже не интересно :) (единственный момент - надо не забыть "скинуть" состояние, когда пешеходам будет зеленый).
1) если для того, чтобы отжать кнопку достаточно убрать руку, то не понятно, почему это действие присутствует в диаграмме. Ведь по-сути действия "отжать кнопку" не существует. 2) сейчас кнопки делаются в виде сенсора, а не в виде кнопки, т.е. там нет действия "нажать" или "отжать" :)Серсор вырабатывает два события: переход из FALSE в TRUE, и назад в FALSE. Это соответствует нажатию и отжатию кнопки. Т.е. он вырабатывает импульс, а у импульса есть передний и задний фронт сигнала.
Программа ничего не знает об устройстве кнопки, и даже о ее существовании. У программы есть только булевский вход: сигнал запроса зеленого пешеходам. Сейчас программ реагирует на задний фронт сигнала, но можно отреагировать и на передний - принципиально ничего не поменяется.
В этом твоя ошибка :)да нет, всё правильно. Именно событие надо ловить - изменение состояния кнопки, и запомнить его до применения (которое может быть сразу, а может чуть позже).
динственный момент - надо не забыть "скинуть" состояние,это и делается: запомненное событие забывается после применения.
При этом состояние интересно только в одной фазе светофора - когда машинам зеленый. Во всех остальных случаях состояние кнопки тоже не интересно :) (единственный момент - надо не забыть "скинуть" состояние, когда пешеходам будет зеленый).
Имхо. Если мы говорим о светофоре на перекрестке. Состояние кнопки интересно, когда нужно включать состояние "машинам красный". В этом случае есть 2 варианта - включать пешеходам зелёный, если состояние кнопки "нажата". Или не включать и тогда у всех красный.по окончании состояния "машинам красный, пешеходам зелёный" состояние кнопки сбросить.
Если мы говорим о светофоре на перекрестке. Состояние кнопки интересно, когда нужно включать состояние "машинам красный". В этом случае есть 2 варианта - включать пешеходам зелёный, если состояние кнопки "нажата". Или не включать и тогда у всех красный.по окончании состояния "машинам красный, пешеходам зелёный" состояние кнопки сбросить.мне вообще не понятно зачем НЕ включать зелёный пешеходам, когда машинам - красный?
Простая противофаза - лучшее решение.
мне вообще не понятно зачем НЕ включать зелёный пешеходам, когда машинам - красный?
Не знаю. Дебильная система, которая везде у нас установлена. Но так работают все светофоры на перекрестке с кнопкой. Я симулировал реальную систему
то ты сейчас думаешь о кнопке с логикой, а сам светофор - одни лампочки
В данный момент были именно размышления о кнопке с логикой.
Светофор и его логика как бы отдельная вещь и именно эти две вещи хочется иметь раздельными.
А лампочки были отделены еще на самой первой стадии При этом получился объект с тремя фиксированными состояниями.
Еще есть логика переключения состояний.
А к этому есть кнопка которая должна как то изменить логику переключений. При этом необходимо знать актуальное состояние и возможно предыдущие.
На мой взгляд тут один класс
Один класс не может быть даже при обычном светофоре. Так как у нас есть по крайней мере, две задачи: включение/выключение лампочек и логика их смены.
Любая система должна делится на простейшие части.
У нас вот сейчас 5 лампочек, которые должны реагировать на 3 сигнала определенным образом. Если оставить их как есть то возрастет вероятность ошибки так как эта логика должна быть где-то в другом месте.
то это должно быть сделано в других классах
именно так, один класс никак не катит. Дело тут никак не в одержимости.
Хотя можно сделать и больше классов чем действительно нужно, на все возможные случаи жизни. В данном случае будет просто неоправданное усложнение реализации.