首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合DTO还是扁平DTO?

复合DTO还是扁平DTO?
EN

Software Engineering用户
提问于 2019-03-28 09:48:48
回答 1查看 1.4K关注 0票数 1

在决定从DTO中使用这2种结构时,我遇到了问题:

备选案文1是:

代码语言:javascript
复制
@Data
class Lines{
  private final Line[] lines;
}

@Data
class Line{
  private final String[] specifiers;
  private final Set<String> container;
}

如下所示:

代码语言:javascript
复制
//Single
Lines lc1 = new Lines(new Line[]{
    new Line(new String[]{"m:123"}, new HashSet<>(Arrays.asList("1", "2", "3")))
});

//Composite
Lines lc2 = new Lines(new Line[]{
    new Line(new String[]{"m:161", "l:1"}, new HashSet<>(Arrays.asList("1", "2", "3"))),
    new Line(new String[]{"m:161", "l:2"}, new HashSet<>(Arrays.asList("1", "2", "3")))
});

当序列化产生这些jsons时:

代码语言:javascript
复制
//Single
[
    {
        "specifiers": ["m:591"],
        "container": ["1","2","3"]
    }
]

//Composite
[
    {
        "specifiers": ["m:161", "l:1"],
        "container": ["1","2","3"]
    },
    {
        "specifiers": ["m:161", "l:2"],
        "container": ["1","2","3"]
    }
]

或备选案文2,即:

代码语言:javascript
复制
interface ComponentLine{}

@Data
@Accessors(fluent = true)
class Line implements ComponentLine {
  private final String specifier;
  private final Set<String> container;
}

@Data
@Accessors(fluent = true)
class CompositeLine implements ComponentLine{
  private final String specifier;
  private final Set<ComponentLine> lines;
}

如下所示:

代码语言:javascript
复制
//Single
Line l1 = new Line("m:123", new HashSet<>(Arrays.asList("1", "2", "3")));

//Composite
Set<Line> lines = new HashSet<>();
  lines.add(new Line("l:1", new HashSet<>(Arrays.asList("1", "2", "3"))));
  lines.add(new Line("l:2", new HashSet<>(Arrays.asList("1", "2", "3"))));
  CompositeLine cl1 = new CompositeLine("m:161", lines);

当序列化产生这些jsons时:

代码语言:javascript
复制
//Single
{
    "specifier": "m:591",
    "container": ["1","2","3"]
}

//Composite
{
    "specifier": "m:161",
    "lines": [
                {
                    "specifier": "l:1",
                    "container": ["1","2","3"]
                },
                {
                    "specifier": "l:2",
                    "container": ["1","2","3"]
                }
             ]
}

到目前为止,在研究这两种选择时,我可以看到这两种方法的一些好处:

  • 选项1更统一,这意味着我可以在同一结构中传递复合行或单行--可能有更容易编写的代码用于处理和反序列化。另外,我不需要像选项2那样有单独的反序列化检查(如果object有属性行->反序列化为复合,否则反序列化为简单行)。
  • 选项2更紧凑,因为我不必每次重复相同的数据(就像在选项1中,我必须重复2次字符串"m:161"),而且由于这是DTO,大小确实很重要。

有谁对这种DTO-s有更多的经验,从这两件事中我能找到更多的好处吗?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-03-28 12:26:04

有几个因素涵盖了决定哪些DTO对象最适合您的目的:

  • 适合于目的:什么是你发送的数据的最合适的特征,以及你要发送的目的?这应该是你最关心的问题。
  • 容易消费:生产或消费这些数据有多容易?这应该是一个主要关切问题。
  • 数据效率:打包相同的信息需要多少字节?如果您有两种格式是同样合适的,那么您可以使用此标准作为平局。

底线是,您必须实际看到包含实际数据的格式。这将帮助你对它的工作有多好的感觉。该过程还将帮助您了解生成数据是多么容易。之后,您可以看到您的平均消息大小。

考虑到我不知道您的数据传输需求的具体情况,我所能做的就是给您提供一般的指导,以帮助您选择。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/389359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档