首页 > 解决方案 > 使两个包尽可能松耦合的模式

问题描述

所以我正在学习为软件设计入门课程构建解析器。

我已经构建了一个标记器包,它将我的输入字符串拆分为具有值和类型的 getter 的 Token 对象。我还可以为当前令牌的值和类型返回一个原始字符串。

我的 Tokenizer 面向公众的界面目前看起来像这样。

public Tokenizer(Grammar rules, String input)
public Token getCurrentToken() {...} // Token has public getters similar to the two methods below
public String getCurrentValue() {...}
public String getCurrentType() {...}
public void nextToken() throws InvalidTokenException {...}
public void previousToken() {...}

在我的 Parser 类中,我还有一个 TokenReceiver(interface) 和一个 TokenizerAdapter 类(实现 Receiver 和我的特定标记器)

  public void next();
  public Token getToken();
  public String getType();
  public String getValue();
  public Token getToken();
}

规则是解析中的每个不同步骤都必须使用与其他包的任何实现细节尽可能松散耦合的不同包完成,即解析器理论上应该与我找到的任何标记器一起工作(例如在 Github 上),而不仅仅是我自己的 Tokenizer 实现,只要我为它制作一个适配器。

如果我从 Tokenizer 发回 Token 对象,那么我的解析器将必须知道 Token 对象(特别是 getter 方法),这增加了我的 Tokenizer 实现的耦合。

直接返回值和类型的字符串,然后在 Parser 包中创建另一个 Token 类并重新创建 Tokens 对象对我来说直觉上是错误的。适配器类中 Token 的匿名内部类会是一个好的解决方案吗?

我正在寻找什么样的模式或概念可以帮助我从 Tokenizer 引用我的 Token,同时保持与我的特定 tokenizer 实现的松散耦合。

抱歉,如果问题真的很愚蠢而答案真的很明显,设计模式对我来说仍然非常抽象,我们正在学习其中的很多东西,我很难知道在不同的情况下使用哪一种。

标签: javadesign-patternslexical-analysis

解决方案


您是否考虑过以下问题

public interface Token {
   String getType();
   String getValue();
}

public interface Tokenizer {
   // either 
   Iterable<Token> parse(String input);

   // or
   Stream<Token> parse(String input);
}

public class GrammarTokenizer implements Tokenizer {
   private final Grammar grammar;

   // constructor 

   // method implementations 
} 

推荐阅读