正在阅读:函数式组合子逻辑Java parser框架(一)函数式组合子逻辑Java parser框架(一)

2004-12-02 16:42 出处:CSDN 作者:ajoo 责任编辑:linjixiong


  这个实现判断这个字符串是否和制定的字符串相等。

  类似的基本实现还可以有很多。

  下面,假如我们希望实现一个Spredicate,它要判断“这个字符串是个小写字符串,或者等于hello”。
  我们怎么办呢?

  我们当然可以这样:


  class Predicate1 implements Spredicate{
  Boolean is(String v){
  Return v.isLowercase() || v.equals(“hello”);
  }
  }

  只不过,这样一来,我们没有重用IsEqual和IsLowercase这两个类的代码,虽然逻辑上我们是和这两个类有重叠。

  我们当然也可以直接调用IsEqual和IsLowercase的代码,如:

  class Predicate1 implements Spredicate{
  Boolean is(String v){
  return new IsEqual().is(v) || new IsLowercase().is(v);
  }
  }


  只不过,这样的代码是过程式的,非常死板。
  如果我再有一个IsEqual或者IsCapitalized的逻辑呢?还要再写一个Predicate2类么?
  如果你OO有一定功底,一定可以看出,这个代码不符合IOC原则,在不该new的地方new了。

  好,知错就改,根据IOC原则,我们重构如下:


  class OrPredicate implements Spredicate{
  private final Spredicate p1;
  private final Spredicate p2;
  public Boolean is(String s){
  return p1.is(s) || p2.is(s);
  }
  }

  构造函数我就不写了。

  如此,Predicate1我们就可以写成new OrPredicate(new IsLowercase(), new IsEqual(“hello”));

  类似的,我们可以加上AndPredicate, NotPredicate, XorPredicate.
  这样,基本上就可以覆盖所有的布尔操作了。

  我们在写我们自己的Predicate的时候,就根本不必写is函数,甚至可以忘记is函数的存在。我们面对的不再是一个有着一个boolean is(String)签名的接口,而是一个可以通过各种规则组合的类型。

  一个Predicate可以简单如new NotPredicate(p),也可以复杂如:

  new AndPredicate(new OrPredicate(a,new XorPredicate(b,c), d));

  擦擦眼睛,现在,我们等于自己制造出一个可以用一些特定规则组合的类型,而Spredicate的签名甚至都不再重要了。我们的客户程序从操作字符串变成了操作各种Spredicate对象,这已经是更高一级的抽象了。

  为了表现这一点,让我们把Spredicate改成abstract class, 并把is()函数改成包私有(这样我们外面的用户程序就再也看不到这个函数了)。




察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品