PHP: генерировать код из абстракции (xml, json, база данных, ...)

Примечание. Не стесняйтесь предлагать лучший заголовок, поскольку я думаю, что "сгенерировать код" и "абстракция" могут быть не лучшим выражением того, о чем я хочу спросить:)

Я ищу хороший шаблон / стандартный способ для генерации PHP-кода из некоторого уровня абстракции.

пример

Я построил набор классов, которые действуют как фильтры обработки текста. Эти фильтры могут быть объединены в цепочку для преобразования некоторого входного текста в некоторый другой выходной текст, например

Input "Hello 'CRUEL' World" 
>> RegexFilter('(.*?)') [extract everything between '']
>> ToLowerFilter [lowercase the extracted text]
Output: cruel

Результирующий код

Соответствующий исходный код выглядит примерно так:

$input = "Hello 'CRUEL' world";
$pattern = "#(.*?)#";
$first = new RegexFilter($pattern);
$second = new ToLowerFilter();
$first->setNextFilter($second);
$ouput = $first->Transform($input);
echo $output; // cruel

Я хотел бы создать некоторый уровень абстракции, чтобы конечный пользователь (не программист) мог создать свою собственную цепочку фильтров без написания кода самостоятельно. Под "абстракцией" я подразумеваю что-то вроде XML, JSON, хранимых в базе данных и т. Д.

Пример XML (предложение)

<filters>
 <filter name='Regex'>
  <properties>
   <property name='pattern'>'(.*)'</property>
  </properties>
  <nextfilter name='ToLower'>
   <properties/>
  </filter>
 </filter>
</filters> 

Примечание: пример очень упрощенный. Подумайте о более сложных вещах, таких как "сложные объекты как свойства для фильтров", "наследование фильтров" (вышеупомянутый фильтр может получить имя "RegexToLowerFilter" и на него могут ссылаться другие фильтры) и т. Д.

Подходы / Идеи

Есть ли стандартный способ решения этой проблемы? До сих пор я думал о создании собственного XML, JSON и т. Д. Сериализатора / десериализатора для каждого фильтра, но это кажется большой работой и потенциально подвержено ошибкам, потому что это делается индивидуально для каждого фильтра. Кроме того, я предполагаю, что это потребовало бы, чтобы все возможные зависимости были также сериализуемыми таким же образом, что может быть проблематично при использовании сторонних библиотек (например, JsonPath).

Полагаю, самым элегантным способом было бы создание предметно-ориентированного языка. К сожалению, создание компилятора не самая простая задача и, вероятно, не всегда подходит для каждой проблемы в этом пространстве. (Опять же, не стесняйтесь поправлять меня:))

TL; DR

Я ищу подходящий способ / шаблон для построения уровня абстракции между конечным пользователем (не являющимся программистом) и моим исходным кодом. Решение должно взять "упрощенную" абстракцию и "сгенерировать" соответствующий код.

1 ответ

То, что вы пытаетесь сделать, называется "Разработка на основе моделей"

Посмотрите на различные подпроекты с открытым исходным кодом в проекте Eclipse модель-текст (M2T). Мой фаворит - JET, но есть другие с другими спецификациями и характеристиками времени выполнения.

Несмотря на то, что я действительно большой поклонник использования управляемой моделями разработки для решения подобных проблем в целом, я хочу предупредить вас об использовании этих технологий (или вашей собственной реализации) для решения этой конкретной проблемы. Если ваша целевая аудитория действительно группа непрограммистов, то у них будет столько же проблем с изучением вашего DSL (синтаксиса и ключевых слов), сколько и с исходным языком, который вы пытаетесь скрыть. Сравнение (DSL с исходным языком) ухудшается, если для исходного языка есть средства разработки (отладчики, редакторы и т. Д.). Технологии, основанные на моделях, как правило, более успешны, когда применяются к более опытным разработчикам, которым нужна автоматизация их работы, чем к менее опытным разработчикам, которые ищут чудо.

Другие вопросы по тегам