【发布时间】:2013-07-30 16:57:39
【问题描述】:
我正在尝试为扑克手历史编写一个解析器系统。有些会使用正则表达式,有些会使用 XML,等等......
目前我有这个:
abstract class Parser {
abstract protected GameContext findGameContext();
public void parse() {
GameContext gameContext = findGameContext();
}
}
还有:
class RegexParser {
protected GameContext findGameContext() {
// find game context by using some regex...
}
}
我对此很满意。如果我想要另一种解析器,我将 Parser 子类化并实现抽象方法。
但是,我知道我可以使用依赖注入来做同样的事情。
像这样的:
class Parser {
private IDataType<GameContext> gameContextFinder;
public setGameContextFinder(IDataTypeFinder<GameContext> finder) { this... = ... }
public parse() {
GameContext gameContext = this.GameContextFinder.find();
...
}
地点:
interface IDataTypeFinder<T> {
public T find();
}
class GameContextFinder implements IDataTypeFinder {
public GameContext find() {
// some regex...
}
}
还有:
class RegexParser extends Parser {
public RegexParser() {
this.setGameContextFinder( new GameContextFinder() );
}
}
你怎么看这两种方式? 到目前为止,我发现 DI 对单元测试很有用。 但是抽象继承感觉更“自然”……
【问题讨论】:
-
我认为第一种方法更好更干净。第一种方法在这里也是可单元测试的。第一种方法不需要依赖注入。您可以轻松地模拟解析器和上下文。
标签: inheritance dependency-injection abstract-class