注意随意提出一个更好的标题,因为我认为“生成代码”和“抽象”可能不是我想问的最佳表达方式:)
我正在寻找一种从某种抽象层生成 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)时可能会出现问题。
我想最优雅的方法是创建Domain Specific Language。不幸的是,构建编译器并不是最简单的任务,而且可能并不总是适合该领域的每个问题。(话又说回来,请随时纠正我:))
TL;博士
我正在寻找一种合适的方式/模式来在(非程序员)最终用户和我的源代码之间建立一个抽象层。解决方案应该采取“简化”的抽象并“生成”相应的代码。