例如,假设以下数据结构都实现了 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
包含并操纵上述结构之一。
该列表从最透明和复杂到最不透明和最简单;但是,我不确定从面向对象的角度来看哪个最好。当你沿着列表往下看时,尽管更加简洁并且语法更加简单,但弄清楚发生了什么变得越来越困难。
我知道这个问题可能有点主观,但我想知道在处理此类问题时是否有标准的行业惯例。
编辑:
我没有思考也没有考虑可变键的问题。假设我正在使用 ImmutableList
每个 Guava 。尽管如此,我的问题的重点是,从面向对象编程的角度来看,对于不同级别的透明度,哪种结构最有意义。
最佳答案
我会创建一个
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;
}
这提供了透明度,同时也向调用者隐藏了 map ,例如只想要与某个键关联的所有单词的列表,而不关心如何从底层 map 中获取它
关于java - 复杂数据结构: simplicity vs transparency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17433399/