PHP:从抽象生成代码(xml,json,数据库,......)

时间:2014-08-26 11:54:48

标签: php code-generation dsl abstraction model-driven-development

注意随意提出一个更好的标题,因为我认为“生成代码”和“抽象”可能不是我想要问的最佳表达方式:)

我正在寻找一种良好的模式/标准方式来从某种抽象层生成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; DR

我正在寻找一种合适的方式/模式来在(非程序员)最终用户和我的源代码之间构建一个抽象层。解决方案应采用“简化”抽象并“生成”相应的代码。

1 个答案:

答案 0 :(得分:2)

您正在尝试做的事情被称为&#34;模型驱动开发&#34;

查看Eclipse模型到文本(M2T)项目中的各种开源子项目。我最喜欢的是JET,但还有其他一些具有不同的规格和运行时特性。

尽管我非常喜欢使用模型驱动开发来解决这类问题,但我想提醒您使用这些技术(或您自己的实现)来解决这个特定问题。如果您的目标受众真的是一群非程序员,那么他们在学习您的DSL(语法和关键字)时会遇到与您试图隐藏的原始语言一样多的麻烦。如果有原始语言的开发工具(调试器,编辑器等),则比较(DSL与原始语言)会变得更糟。当应用于需要自动化工作的专业开发人员时,模型驱动技术往往更成功,而不是应用于寻求奇迹的不太专业的开发人员。