将HTML解析器实现与搜索算法分离

时间:2015-11-27 15:40:53

标签: oop decoupling

我正在设计一个从HTML页面中提取实体的程序。 我有一个草图设计,但我对它不满意,因为它强烈地将我的算法类与我选择使用的HTML解析器结合起来。 我很高兴听到更好设计的建议。

我的设计如下:

public interface HTMLSearcherInterface
{
    void readHTML(URI);
    List<SearchResultInterface> searchContent(predicate<String>);
}

public interface SearchResultInterface
{
    String getResultText();
    Node getResultNode();
}

我有EntityExtractor,它包含HTMLSearcherInterface,并使用它在HTML文件中搜索关键词,并在其周围查找其他详细信息。 这就是我需要搜索结果中的getResultNode的原因。

1 个答案:

答案 0 :(得分:0)

在输入这个问题时,我想到了解决方案:

必须将Node返回到算法以搜索它,表明我的HTMLSearcherInterface不够好,因为我与HTML的每次交互都应该由它调解,我不应该发现自己遍历树来搜索它我的算法。

因此将其更改为:

public interface HTMLSearcherInterface
{
    void readHTML(URI);
    void searchContent(predicate<String>);
    void searchInResultSiblings(SearchResultInterface,predicate<String>);
    void searchInResultParents(SearchResultInterface, int maxDistance,predicate<String>);
    void searchInResultChildren(SearchResultInterface, int maxDistance,predicate<String>);
    SearchResultInterface getNextResult();
    bool hasNextResult();

}

public interface SearchResultInterface
{
    String getResultText();
    long id getResultId();
}

解决了与HTML解析库强耦合的问题。 这个解决方案的缺点是使用搜索功能并获得结果不再是线程安全的。

但是如果线程安全很重要,可以使用搜索器的多个实例,如果这是一个非常大的文档(我怀疑存在),可以通过利用工厂模式在搜索者之间共享同一文档。