Паттерн Module (Модуль), теория
Модульность — ключевой принцип в построении архитектуры приложения, помогающий разделить сущности в коде и разложить их по полочкам.
Сама концепция модульности в программировании появилась ещё в 1960-70-х годах. В этом тренажёре рассказывается о ES-модулях, которые появились в языке с выходом ES2015 и постепенно распространились в браузерной и серверной JS-экосистеме. До выхода «нативных» ES-модулей были распространены CommonJS- и AMD-модули, которые сейчас, особенно в контексте браузерного JS, можно считать более не актуальными.
Цель модульного подхода — разделить, декомпозировать большую и сложную программу на отдельные части. Какие от этого подхода преимущества:
- повторяющиеся части можно переиспользовать
- внутренние части модуля недосягаемы извне, внешний интерфейс — явно обозначен
- несвязанные друг с другом части безопасно изолированы и в них по-отдельности проще разобраться
Изначально паттерн Module был задуман для реализации принципа инкапсуляции (сокрытие приватных частей внутри модуля, открытие публичных частей наружу потребителю) для классов.
В JS (ES2015) у модуля тоже могут быть приватные поля и методы (просто живут внутри модуля) и публичные (явно экспортируются из модуля).
// Приватные поля сокрыты внутри модуляconst privateProperty = "private 123";const privateMethod = () => "private 123";
const publicProperty = "public 123";const publicMethod = (text) => console.log(text);
// Публичные поля явно экспортируются наружуexport { publicProperty, publicMethod };// Публичные поля импортируются потребителемimport { publicProperty, publicMethod } from "./module";
publicMethod(publicProperty);// выведет в консоль 'public 123'Такая реализация гарантирует, что приватная информация не утечёт наружу и не случится неявного пересечения с интерфейсами других разработчиков в глобальной области видимости. Публичное API модуля обозначается явно, а всё остальное внутри остаётся приватным.
К недостаткам паттерна можно отнести:
- сложность рефакторинга в случае, если меняется видимость части полей: нужно исправлять во всех местах использования модуля
- невозможность автоматизированно тестировать приватные части модуля
- невозможность расширить приватные поля модуля или пропатчить их в случае, если нужно сделать хотфикс