Цель: научиться разделять слои абстракций и декомпозировать смешанный код.
badServer.js
- пример плохого стиля программирования, все в одном файле, в одной функции, слои абстракции идут вперемешку.goodServer.js
- пример более хорошего стиля программирования.
Из командной строки можно запустить node badServer
и node goodServer
,
для linux/unix систем, нужно использовать sudo node badServer
и
sudo node goodServer
потому, что HTTP сервер открывает TCP 80
порт,
а для всех портов до 1024
нужно иметь специальные права.
Переписать то, что делает badServer.js в хорошем стиле, желательно с применением того, что мы проходили: способов структурирования асинхронного кода, нового синтаксиса JS, метапрограммирования, песочниц. В переписанном коде нужно выделить несколько слоев абстракции (см. пояснения в репозитории), и сделать так, чтобы прикладная логика была абстрагирована от HTTP.
Нужно понять, что делает badServer.js
и почему так писать плохо, потом
посмотреть пример goodServer.js
и понять, где тут уровни абстракции, почему
такой код проще поддерживать и расширять, что делает его не однородным и в чем
преимущество расслоения и проектирования грамотной структры кода.
Теперь нужно переписать badServer.js
, выделив минимум 2-3 разных слоя
абстракции кода, разнеся их по функциям, или даже по разным файлам.
Следующие функциональные блоки просматриваются в этом коде и их нужно разделить, понизив их сцепление:
- Слой доступа к данным (в этом примере - работы с файловой системой)
- Парсинг, сериализация и десериализация
- Сервер HTTP
3.1. Кеширование ответов
3.2. Работа с Cookie
3.3. Склеивание буфера
3.4. Логирование вызовов
3.5. Маршрутизация обработки запросов - Бизнес-логика, относящаяся к предметной области
- Управление зависимостями
- Конфигурирование (например, порт и хост)
- Подстановка переменных в шаблоны
Тут будет полезно декларативно описать задачу в виде структур данных, пример
можно взять из goodServer.js
.
-
Пробросить в контекст приложения
setTimeout
иsetInterval
и использовать их, выводяconsole.log()
с таймера -
Пробросить в контекст приложения библиотеку
util
и сделать вызовы нескольких ее функций из приложения