{"id":18270661,"url":"https://github.com/ruslanxdev/yandex-shri-2018-homework-8","last_synced_at":"2025-04-09T03:17:04.878Z","repository":{"id":143848865,"uuid":"127614047","full_name":"ruslanxdev/yandex-shri-2018-homework-8","owner":"ruslanxdev","description":"Домашнее задание #8 \"Архитектура\" в ШРИ Яндекса 2018.","archived":false,"fork":false,"pushed_at":"2018-04-04T21:07:02.000Z","size":704,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-14T21:35:38.264Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://ruslankhh.com/yandex-shri-2018-homework-8","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruslanxdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-01T09:08:32.000Z","updated_at":"2018-04-07T21:51:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"a2fdd219-c349-4f8e-b5e7-a8316f12ec33","html_url":"https://github.com/ruslanxdev/yandex-shri-2018-homework-8","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanxdev%2Fyandex-shri-2018-homework-8","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanxdev%2Fyandex-shri-2018-homework-8/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanxdev%2Fyandex-shri-2018-homework-8/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruslanxdev%2Fyandex-shri-2018-homework-8/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruslanxdev","download_url":"https://codeload.github.com/ruslanxdev/yandex-shri-2018-homework-8/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247968378,"owners_count":21025823,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T11:38:47.623Z","updated_at":"2025-04-09T03:17:04.862Z","avatar_url":"https://github.com/ruslanxdev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Домашнее задание \"Архитектура\"\n\nДомашнее задание #8 в ШРИ Яндекса 2018.\n\n## Задание\n\n### Постановка задачи\n\nВам предлагается реализовать один из наиболее популярных в мире фронтенда архитектурных подходов - Flux - в формате простого фреймворка. Ваш фреймворк должен уметь обрабатывать действия пользователя и предоставлять API для связи с бэкэндом\n\n### Требуемая реализация\n\nВам предлагается 2 файла - `index.html` и `sendToServer.js`.\u003cbr\u003e\nВ `index.html` вы найдете простую форму: инпут для ввода текста, кнопку \"отправить на сервер\" и лейбл.\u003cbr\u003e\nВ `sendToServer.js` находится фейковый метод отправки данных на сервер. После \"успешной отправки\" метод вызывает событие `dataIsSent`.\n\nВам предлагается написать Flux реализацию фреймворка, который бы осуществлял отправку данных на сервер по нажатию на кнопку, а после успешной отправки писал в лейбле \"Сервер принял данные \u003cтекст из инпута\u003e\".\u003cbr\u003e\nКаждый этап (передача данных и/или управления между элементами архитектуры) должен логироваться в консоль и на экран.\n\n**Использование фреймворков и библиотек, в том числе jQuery, запрещено.**\u003cbr\u003e\nРеализовывать виртуальный DOM для Flux-архитектуры не нужно. Изменять API `sendToServer` - можно и даже рекомендуется (при сохранении \"функциональности\"). Изменять верстку index.html - можно, но необязательно.\n\nОбратите внимание, что в стандарте es5 еще нет классов и разделения кода на модули. Если вы используете es5 - прочитайте, как реализовать модули и классы, например, в книге Стояна Стефанова \"Javscript. Шаблоны\".\n\n### Минимальное решение\n\n- [x] Реализация фреймворка Flux с логированием в консоль\n- [x] Сделать логирование событий на экран\n\n### Оптимальное решение\n\n- [ ] Реализация MVP-фреймворка с той же функциональностью\n\n### Дополнительное задание\n\n- [ ] Реализовать другие архитектурные подходы (MVC, MVVM)\n\n## Запуск\n\n```bash\n$ npm i\n$ npm run build\n$ npm start\n```\n\nДля разработки:\n\n```bash\n$ npm run dev\n```\n\n## Выполнение задания\n\n- Подредактировал вёрстку и стили\n- Сделал фреймворк для создания пользовательских интерфейсов [bem](https://github.com/ruslankhh/yandex-shri-2018-homework-8/tree/master/packages/bem).\n  - Реализует компонентный подход по методологии БЭМ.\n- Сделал фреймворк для логирования [logger](https://github.com/ruslankhh/yandex-shri-2018-homework-8/tree/master/packages/logger).\n  - Позволяет следить (логировать) данные которые поступают/выходят из наблюдаемых функций.\n  - Реализует паттерн Декоратор.\n  - Позволяет подписываться/отписываться на вызовы этих функций. Таким образом нам не нужно писать самим `console.log`-и внутри функций. И мы можем в любой момент добавить или убрать слушатели (обработчики событий логирования).\n- Функцию [sendToServer](https://github.com/ruslankhh/yandex-shri-2018-homework-8/blob/master/src/utils/sendToServer.js) переписал. Теперь она возврощает просто промис, который резолвится с какой-то небольшой задержкой.\n\n### Flux\n\n- Разбил View на блоки и контейнеры с помощью bem.\n  - Блоки отвечают за то, как будет выглядеть (вёрстка и стили) View.\n  - Контейнеры отвечают за то, какие данные будут во View, и за обновление этих данных.\n  - Вполне возможно контейнеры можно назвать Presenter-ами.\n- Сделал фреймворк для работы с состоянием [flux](https://github.com/ruslankhh/yandex-shri-2018-homework-8/tree/master/packages/flux).\n  - Реализует архитектурный паттерн Flux (actions, dispatcher, store, view).\n  - Позволяет подписываться/отписываться на изменения состояния.\n- Реализовал логирование с помощью logger-a.\n  - Сначала лог существовал независимо от store.\n  - Потом решил внести лог в store. Так как лог всё-таки является частью приложения. И по понятным причинам получилась рекурсия. Избавился от неё частичным логированием (что logger позволял удобно сделать). Но в итоге потерялась связь между действиями пользователся и данными которые выводились в логе (там выводились данные и самого лога). И лог экспоненциально рос в связи с этим. Реализацию можно посмотреть по тегу [log-in-store](https://github.com/ruslankhh/yandex-shri-2018-homework-8/tree/log-in-store).\n  - В итоге решил отказаться от лога в store для большей наглядности работы приложения.\n  - Возможно стоит оставить его в store, и записывать в log данные без данных log (ну вы поняли).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruslanxdev%2Fyandex-shri-2018-homework-8","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruslanxdev%2Fyandex-shri-2018-homework-8","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruslanxdev%2Fyandex-shri-2018-homework-8/lists"}