java - 复杂数据结构: simplicity vs transparency

标签 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包含并操纵上述结构之一。

该列表从最透明和复杂到最不透明和最简单;但是,我不确定从面向对象的角度来看哪个最好。当你沿着列表往下看时,尽管更加简洁并且语法更加简单,但弄清楚发生了什么变得越来越困难。

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

编辑:
我没有思考也没有考虑可变键的问题。假设我正在使用 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/

相关文章:

c# - 使用枚举器在数组中显示结构

algorithm - 作为树的高度函数的可能二叉树的数量之间是否存在联系?

javascript - 为什么我的 setInterval 函数只被调用一次?

java - Axis2 生成的 stub 是线程安全的吗?

java - 使用 Java 和 Spark 将本地镜像的序列文件写入 HDFS

java - Java 中的 Tail -n 1000(Apache commons 等)

matlab - 如何在 Matlab 中向量化结构上的操作?

java - 内部类可在 Java 中运行

oop - 在 OOP 编程风格中,为什么我们要隐藏对象的数据成员以防止其他人直接访问

c++ - 具有不同成员变量的多个 Action 的通用类