例如,让我们假设以下数据结构都实现了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的角度来看,哪种结构对于不同的透明度水平最有意义。
答案 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。这有利于降低不正确使用它的可能性(例如向键阵列添加元素)。它还允许您在需要时更改底层实现细节。