【发布时间】:2015-08-10 15:39:01
【问题描述】:
我进退两难了。我有一个接口 Parser 和实现它的类将解析具体的文件格式。例如 - CSVParser 将解析 CSV 文件,XMLParser 将解析 XML 文件等等。
因此,接口 Parser 将是:
public interface Parser{
public SomeObject parseFile(String pathToFile);
}
另一方面,一些解析器会有额外的参数,例如,一个告诉他们在文件中跳过哪些行的数组。现在这让我很困惑,我是否应该扩展 Parser 并添加方法,例如:
public interface BetterParser extends Parser{
public SomeObject parseFileConsideringParameter(String pathToFile, int[] whichLinesToSkip)
}
或者我应该聚合它们以便我的班级需要同时实现这两者:
public class concreteParser implements Parser, BetterParser{
}
我想在管道中有解析器不可知的部分,你会说:
Parser parser = ParserFactory.giveMeParser(type);
SomeObject so = parser.parseFile(path);
问题是,在某些情况下,我不会有告诉我要跳过哪些行的参数。
我知道我只能创建一个带有两个参数的方法,所以一些实现会传递另一个参数,而其他实现会传递 null,但这看起来很难看。
我真的很想避免局限于具体的实现,但是我该如何克服这个问题呢?也许我错过了什么?
【问题讨论】:
-
是否依赖于跳行格式?是特定于特定解析器的东西,还是无论格式如何都需要做的事情?
-
感谢您的关注。是的,它取决于格式。有些文件不需要,但有些文件需要。
-
那么它应该是具体解析器的一部分,即不是接口的一部分。当您实例化解析器或让解析器以某种方式“检测”这些东西时,让它成为一个参数。在最坏的情况下,您可能会在解析器中注入一个“服务”,可以像
svc.GetCSVLinesToSkip()一样调用它
标签: oop design-patterns