复杂的数据结构:简单与透明

时间:2013-07-02 18:44:49

标签: java oop data-structures

例如,让我们假设以下数据结构都实现了Lemmas-> PartsOfSpeech-> ListOfWords的映射(主题选择是任意的,与问题无关):

Map<ArrayList<Lemma>, Map<PartOfSpeech, ArrayList<Word>>> mainMap = new HashMap<>();

Map<ArrayList<Lemma>, PartOfSpeechWordMap> mainMap = new HashMap<>();

LemmaMap mainMap = new LemmaMap();

PartOfSpeechWordMap包含并操纵Map<PartOfSpeech, ArrayList<Word>>LemmaMap包含并操纵上述结构之一。

该清单从最透明和最复杂,到最不透明和最简单;但是,从面向对象的角度来看,我不确定哪个最好。从列表中可以看出,尽管语法更简洁,语法更简单,但仍然越来越难以弄清楚发生了什么。

我知道这个问题可能有点主观,但我想知道在处理这样的事情时是否有标准的行业惯例。

编辑:
我没有思考,也没有考虑可变键的问题。我们假设我每个Guava使用ImmutableList。尽管如此,我的问题的关键在于,从OOP的角度来看,哪种结构对于不同的透明度水平最有意义。

2 个答案:

答案 0 :(得分:2)

我会创建一个

class LemmaMap implements Map<List<Lemma>, Map<PartOfSpeech, List<Word>>>

其中LemmaMap包裹HashMap,但也提供了一些其他方法,例如。

public List<Word> getAllWords(List<Lemma> key) {
    List<Word> returnValue = new ArrayList<>();
    for(List<Word> list : map.get(key).values()) {
        returnValue.addAll(list);
    }
    return returnValue;
}

这提供了透明度,同时也隐藏了来自例如呼叫者的地图。只想要与关键字相关联的所有单词的列表,而不关心如何从基础地图中获取它

答案 1 :(得分:1)

我会说这不是这个问题的合适网站,但我相信大多数人会建议使用最简单的API。这有利于降低不正确使用它的可能性(例如向键阵列添加元素)。它还允许您在需要时更改底层实现细节。