Функцію ядра бере на себе патерн Медіатор (він же Посередник). Використання цього шаблону виключає прямі взаємодії між незалежними об'єктами за рахунок введення об'єкта-посередника. Коли будь-якої з модулів змінює свій стан, він сповіщає про це ядро програми, а то в свою чергу повідомляє про зміни всіх інших модулів, які повинні знати про це.
Що собою представлятиме ядро (Медіатор / Посередник) в модульній архітектурі?
Уявімо, що у нас є два дуже простих модуля, які ми хочемо додати в свій проект: один отримує два параметри у вигляді цифр, після чого повертає їх суму, а другий отримує параметр і виводить його на екран.
Перш я хочу сказати пару слів про паттерне Фасад. Як я писав раніше: модуль - це самовизивающаяся функція, змінні і методи якої приховані від користувача, крім тих змінних і тих методів, які ми самі хочемо зробити публічними. Ці публічні дані і називається фасадом, за яким знаходиться архітектура модуля.
Давайте розглянемо це на прикладі. Нехай змінна Namespace буде нашим простором імен, в якому буде об'єкт modules. в ньому і будуть зберігається модулі.
Проробимо тугіше операцію зі-другим модулем.
Як бачите, нічого складного: один модуль складає два числа, другий - виводить дані на екран. Я намагався спростити всі якомога більше, так як зараз головне розібратися в самій архітектурі модульних додатків і зрозуміти, як вона повинна працювати.
Модулі готові, тепер підготуємо ядро, яке буде імпортувати ці модулі і працювати з ними.
Як ви пам'ятаєте, Namespace.modues - це статична змінна, яка зберігає в собі модулі, іншим словом - це простір імен.
Раз у нас вже є одна глобальна змінна Namespace. то на ній і зупинимося. Запишемо в неї функцію, яка буде приймати два параметри. Перший - масив з модулями, а другий - функція зворотного виклику, яка ці самі модулі та буде використовувати за своїм призначенням.
З ядра додатка ми не повинні змінювати наші модулі, функція Namespace буде повертати тільки копії.
Отже, коли ми розуміємо, що саме ми хочемо від функції Namespace. то давайте її реалізуємо.
А ось і ядро нашого застосування, він же патерн Медіатор, він же патерн Посередник.
Чого не вистачає функції Namespace?
- Завантаження файлів. Адже цей код не дуже добре виглядає: