Ответы пользователя по тегу Алгоритмы
  • В чем суть конечного автомата на примере фронтенда?

    hahenty
    @hahenty
    ('•')
    Конечный автомат — это ограниченное количество состояний, входные сигналы для перехода между состояниями и выходящие при этих переходах, а также сигналы текущего состояния. В теории их делят по выработке сигналов, но на фронтенде всё смешивается всё равно.
    И важно помнить, что для фронтенда "конечный автомат" применяется в большей степени для процесса, а не значений. То есть, состояниями будут, например, являться:
    • инициализация/загрузка документа — что до события download,
    • открытое модальное окно,
    • передача данных из формы,
    а сигналами будут как раз события:
    • ondowload сигнал для перехода из состояния загрузки в состояние готовности,
    • клик по определённой кнопке — это сигнал для закрытия модального окна, например.
    • submit формы
    • response или reject — ответ на форму,
    ещё сигналы из таймеров подойдут:
    • таймаут загрузки, как самое очевидное,
    • циклическая подгрузка, типа для новостей.
    И по теории автоматов должно быть так, чтобы переход из одного состояния в другое всегда сопровождался определённым сигналом. Например, бесконечная лента записей из состояния просмотра по сигналу "докрутили до конца" переходит в состояние "подгрузка". Но ведь пользователь может крутануть назад и вперёд, что опять породит сигнал "докрутили до конца", но из состояния "подгрузка" не должно быть переходов по этому сигналу, а потому не должно быть и повторного запроса на сервер.

    Можно примешивать ещё и значения, связанные с контентом, например, зависимость поведения от конкретных данных, но тогда количество состояний рискует быть неограниченным.

    И тут начинается цирк с конями.
    Обычное действие — форма заявки. Здесь можно начать с состояния "покоя", когда никаких действий пользователь ещё не совершил. Затем клик по кнопке "Заявка" — сигнал. Появляется модальное окно с формой — другое состояние. Здесь два пути, продолжить заполнять форму или закрыть её, оба пути – сигналы.
    НО процесс заполнения формы порождает зависимость от значений, так как нужна валидация введённых данных. Тут вроде бы и один сигнал "Отправить", но порождает два состояния: передача данных или "неверные данные в форме". С передачей данных более-менее понятно, переводим в состояние "Подождите" с каким-нибудь эффектом вращающейся свистелки.
    А как определить переход в состояние "неверной формы"? Технически это запуск функции валидации через перехват submit события, но логически это противоречит "конечным автоматам", а потому результат валидации становится сигналом. А ещё бывает так, что части формы нужно скрывать или показывать по чекбоксу в той же форме. Здесь есть место для размышлений и споров, да.


    И ещё, разные части страницы могут обладать своими независимым состояниями, а это порождает нужду в независимых, параллельно существующих автоматах или целой автоматной иерархии.
    Ответ написан
    Комментировать
  • Концепция создания бота в многопользовательской игре на WebSocket?

    hahenty
    @hahenty
    ('•')
    Можно даже развить идею разделения объектов: Игра, Игрок.
    Объект "игрок" оперирует соединением с пользователями, сам реализует обмен между сервером и клиентом и отвечает на запросы объекта "Игра". В объекте "Игра", по идее, не надо прописывать какие-либо сокеты, для "игры" есть только игроки, которые могут как-то изменять и реагировать на изменения состояния своими методами.
    Можно описать объект "Бот", у которого будут все те же методы и свойства, как у "игрока", но при этом внутри не будет никаких веб-сокетов.
    То есть, "Игра" дергает методы своих подключившихся игроков, но "Игре" не важно, бот это или человек. В коде объекта "игра" не должно быть упоминаний про веб-сокеты.
    Ответ написан
    2 комментария
  • Как вытащить только url replace'ом?

    hahenty
    @hahenty
    ('•')
    Долго объяснять, вот регулярка. И группы в ней.
    /\<a.*?(href\s*=\s*(["'])[^"']*\2).*?\>(.*?)\<\/a\>/

    а вытаскивать $1 и $3.
    Ответ написан
    6 комментариев