[Назад](./web_03.md) | [К содержанию](../readme.md#введение-в-web-разработку) | [Дальше](./web_05.md) # Vue.js: концепции, криптономикон ## #8 Бизнес логика или детали реализации? > 10 минут * [YouTube](https://www.youtube.com/watch?v=U2ZJCMiQuo8) * [RuTube](https://rutube.ru/video/dd892631a12710bea4ef59c5dc40eeef/) __Расшифровка скринкаста__ (Пересказ от "Алиса AI") В разработке на __Vue.js__ (и вообще в фронтенде) важно чётко разделять два слоя: * __Бизнес‑логика__ — это «что мы делаем» с точки зрения продукта и требований. Это правила, которые определяют поведение системы: «пользователь может добавить товар в корзину», «если товар закончился, нельзя оформить заказ», «список фильмов должен быть отсортирован по рейтингу». * __Реализация__ — это «как мы это делаем»: конкретные технологии, библиотеки, HTTP‑запросы, маппинг данных, обработка ошибок, кэширование. Например: «запрос делаем через Axios», «данные храним в Pinia», «сортировку делаем через JS‑метод sort()». Разделение этих слоёв помогает писать поддерживаемый код и не смешивать требования бизнеса с техническими деталями. ### Почему это важно в Vue.js Во Vue легко «смешать» бизнес‑логику и реализацию прямо в компоненте: ```vue ``` Здесь в одном месте: * HTTP‑запрос (техническая деталь), * фильтрация по рейтингу (бизнес‑правило). __Проблемы такого подхода__: * Компонент становится «толстым» и сложным для тестирования: чтобы протестировать бизнес‑правило, придётся "мокать" HTTP‑запрос. "Мокать" (от английского mock - имитация) - термин из юнит-тестирования, обозначает подмену получения реальных данных (из БД или внешних API) во время тестирования. * При смене технологии (например, с __Axios__ на __fetch__) придётся менять и бизнес‑логику. * Нарушается принцип _единой ответственности_: компонент отвечает сразу за _отображение_, за _запрос_ и за _бизнес‑правила_. ### Практические способы разделения 1. Вынос бизнес‑логики в отдельные модули/сервисы Бизнес‑правила выносят в отдельный слой (сервис, composable, store), где нет привязки к конкретной реализации (подробнее разберем в следующих лекциях). А в компоненте остаётся только вызов: ```vue ``` Теперь компонент не знает, как именно загружаются фильмы — он просто запрашивает «топ‑фильмы». 1. Разделение на слои: API‑слой и бизнес‑слой Часто используют два уровня: * __API‑слой__ (только реализация): делает запросы, обрабатывает ошибки, маппит DTO → модель. * __Сервис/бизнес‑слой__: использует API‑слой, применяет бизнес‑правила, валидацию, логику состояний. Это позволяет менять реализацию (например, перейти с одного бэкенда на другой) без переделки бизнес‑правил. 3. Использование composables для переиспользуемой логики Во Vue __composables__ — удобный способ вынести логику из компонентов, но важно не превращать их в «сборную солянку». В composable лучше класть либо: * только бизнес‑правила (без знания про HTTP), * либо только реализацию (без бизнес‑правил). Тогда их легче тестировать и переиспользовать. Типичный пример: * Бизнес‑требование: «Корзина должна показывать итоговую сумму с учётом скидок и налогов». * Реализация: «Запрос к API корзины, парсинг JSON, округление до двух знаков, форматирование валюты». Если всё это написано в компоненте корзины, то при изменении правил скидок придётся лезть в компонент и править его. Если же логика расчёта суммы вынесена в отдельный сервис, компонент просто отображает результат, а правила живут отдельно. ### Типичные ошибки и как их избегать * __Смешивание в компонентах__. Решение: выносить логику в сервисы/composables. * __Бизнес‑правила «зашиты» в шаблоны__. Например, фильтрация или сортировка прямо в `v-for`. Решение: делать это в JS‑слое, а в шаблоне только отображать. * __Слишком «тонкие» сервисы__, которые просто пробрасывают вызовы API. Решение: в сервисах должна быть именно логика (валидация, агрегация, правила), а не просто прокси. ### Вывод В разделе описано, как в Vue.js‑проектах отделять требования бизнеса от технических деталей. Это нужно, чтобы код был понятным, тестируемым и легко изменяемым. На практике это реализуется через вынос бизнес‑логики в отдельные сервисы и чёткое разделение на API‑слой (реализация) и бизнес‑слой (правила). ## #9 Учимся учиться > 5 минут * [YouTube](https://www.youtube.com/watch?v=ekrzshM4AHI) * [RuTube](https://rutube.ru/video/100ab08808ebc706fe69ff9e8d9a132a/) ## #10 Криптономикон-1 - Vue.js: практика > 39 минут Ниже приведен вольный пересказ этого скринкаста с переписыванием под `Vue3 + script setup`. Т.е. сначала просмотрите видео, чтобы понять о чём идет речь, а потом по пересказу попробуйте реализовать пример. * [YouTube](https://www.youtube.com/watch?v=0MEpPU3rWCk) * [RuTube](https://rutube.ru/video/5a7fa691b1fae3c7fa0d0dbf47dbfbdd/) ### Материалы к заданию 1. Материалы к изучению: под роликом на ютубе куча ссылок, но в принципе там раздел "Основы" от [Синтаксиса шаблонов](https://v3.ru.vuejs.org/ru/guide/template-syntax.html) до "Работы с формами" 1. [API для получения ключа:](https://www.cryptocompare.com/) **Расшифровка скринкаста** (вольный пересказ своими словами) **Внимание**! Cегодня мы с вами __напишем очень и очень плохой код__ почему так и зачем мы это сделаем? Мы это сделаем потому что когда вас учат писать сразу хороший код, вас учат решать задачу одним способом. Рано или поздно вы сталкиваетесь c задачами, решения которые вы не знаете и оказываетесь ситуации когда не понимаете хорошее ваше решение или плохое. Мы с вами вначале напишем плохой, но к сожалению распространенный код и шаг за шагом, в рамках этой серии видео, будем его улучшать. У нас, как и в реальной жизни, будут появляться новые требования заказчика, мы будем находить какие-то баги сами уже у себя и сами героический фиксить и так далее. Таким образом, на выходе вы не только получите хороший код для решения этой задачи, но и понимание как глядя на код понять что он действительно плохой. >В рамках расшифровки скринкаста я сразу буду переписывать его на Vue3, используя `vite` + `script setup` ### Описание проекта Чем же мы с вами займемся? Мы с вами напишем небольшое приложение, которое позволяет добавлять в список отслеживания криптовалюты, используя **api** `cryptocompare.com`. Соответственно мы будем иметь возможность добавить криптовалютные пары "имя валюты - USD" в наблюдение и, когда мы выбираем конкретную валюту, у нас внизу появляется график отслеживания. ### Создание нового проекта, удаление лишего В домашнем задании [первой лекции](./web_01.md) вы должны были научится создавать приложене **Vue**. Откроем его и удаляем "рыбу": * нам не нужно содержимое директорий `src/assets` и `src/components` * в `App.vue` удаляем всё из скрипта и шаблона (стили вообще удаляем) ```html ``` ```js ``` * в `main.js` комментируем строчку с импортом `./main.css` Можем запустить проект командой `npm run dev` и посмотреть на пустое окно, убедившись заодно, что нет ошибок ### Добавление вёрстки и стилей В этом репозитории есть каталог с файлами html и css ([/articles/cryptonomicon](./cryptonomicon/)). Можно открыть в браузере файл `index.html`, чтобы понимать, как должен выглядеть готовый проект ![Оригинальная верстка](./cryptonomicon/vue_01.jpg) 1. Скопируйте содержимое тега `` из файла `index.htm` в ваш шаблон (внутрь тега `