API определяется как посредник между приложением и отдельно разработанным функционалом. Само по себе ядро API обладает только служебными функциями. Приложение вызывает из ядра методы, ориентируясь лишь на открытые интерфейсы этих методов. Для выбора конкретной реализации интерфейса функциональности используется класс-фабрика, выполняющаяся в контексте ядра API, которое по сути является классом-адаптером.
[интерфейс] -> [реализация] -> [фабрика] -> [ядро] -> [приложение]
В соответстие с данной схемой: =======================
1) Описываются интерфейсы разных областей функциональности - хранилища, шаблоны и пр.
2) Создаётся класс-реализация (или множество различных классов-реализаций) каждого интерфейса.
3) Создаются классы-фабрики для каждого интерфейса: задача фабрики - выбрать конкретный класс-реализацию.
4) Создаётся каркас класса-ядра, в котором регистрируются все фабрики. Ядро принимает от приложения параметры инстанцирования реализаций, данный параметры передаются в фабрики, фарики инстанцируют реализации и возвращяют реализации в ядро, где те хранятся в виде свойств.
5) Работа приложения с функционалом осуществляется через свойства ядра, которые являтся классами-реализациями, инстанцированными с необходимыми параметрами; формат вызовов полностью сответствует интерфейсам.
Таким образом, приложение, опираясь на априорно известные форматы вызовов, получает посредством ядра всю необходимую функциональность, не вникая в особенности раелизации данной функциональности (реализация может быть, например, синглтонной или несинглтонной - об этом знает лишь фабрика, самому приложению знать этого не нужно).
При реализации данной модели API на PHP нужно учесть 2 важных момента: =======================================================
1) Т.к., РНР является языком с динамической типизацией, необходимо создание и введение в ядро класса-результата, иначе в некоторых случаях будет крайне сложно отличить нулевой результат (например, корректный возврат false) от крахового завершения исполнения метода.
2) Само ядро API лучше всего раелизовать синглтоном: понятно, что на одном вызове может работать только 1 экземпляр ядра.
|