等等!你可能发现了,现在我们虽然可以自由组合不同的Spredicate对象,但是组合之后有什么用呢?is函数看不见了,难道我们就是为了组合而组合吗? 不错,一个完整的组合子,还缺最后一小块。 让我们在predicates包内部再加上一个utility函数:
好了,功德圆满,我们可以用这个runPredicate函数来执行一个组合好了的Spredicate对象,而不用关心这个对象内部的is函数。 你可能有点怀疑。RunPredicate(p, s)和p.is(s)有什么区别? 呵呵,现在是没什么区别。下面我们来看看什么时候这种封装有明显的好处。 假设根据实现需要我们的Spredicate.is函数不是现在看到的这么简单,它可能是: Boolean is(String s, PredicateContext ctxt); PredicateContext对象负责存储并传递一些包局部的信息。 此时,我们很有可能不希望把这个签名对外公布。因为这个签名非常有可能变化,它是一个包的实现细节。PredicateContext甚至都是个包私有的类型。 此时,把is函数隐藏起来就是必要的了。对外,我们只公开一个runPredicate工具函数:
好,现在客户程序可以随意组合各个Predicate对象,最后用runPredicate函数运行。而包内部在演化时,完全可以根据需要随时改动is函数的签名,增加新的状态。 这,就是一个完整的组合子的例子。 |
正在阅读:函数式组合子逻辑Java parser框架(一)函数式组合子逻辑Java parser框架(一)
2004-12-02 16:42
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键