为了账号安全,请及时绑定邮箱和手机立即绑定

如果我想在这种情况下减少样板代码,我应该使用继承吗?

如果我想在这种情况下减少样板代码,我应该使用继承吗?

子衿沉夜 2022-11-02 16:13:14
我有一个 Pojo 类,它对应于数据库中的一个表。Report.java 类有几个字段:class Report {   public Date createDate;   public String creator;   public String description;   public String id;}从第一个需求开始,我需要使用 id 返回 Report 对象以在数据库中搜索它。响应应该只包含这 4 个字段。但是现在他们想要另一个 REST 端点,这样使用 id,我需要在响应中返回额外信息,例如 Date validUntil;我正在考虑为此使用继承,例如:class ExtendedReport extends Report {  public Date validUntil;}我不确定这是减少样板的最佳方法还是我应该做另一种方法?谢谢你。
查看完整描述

4 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

如果两个 REST 端点必须返回相同的报告但公开不同数量的信息,那么您可能会发现@JsonView它很有用。


这是示例http://rsdn.org/forum/flame.politics/7430262


public class Views {

    public static class Public {

    }


    public static class Internal extends Public {

    }

}


public class Item {


    @JsonView(Views.Public.class)

    public int id;


    @JsonView(Views.Public.class)

    public String itemName;


    @JsonView(Views.Internal.class)

    public String ownerName;

}



@JsonView(Views.Public.class)

@RequestMapping("/items/{id}")

public Item getItemPublic(@PathVariable int id) {

    return ItemManager.getById(id);

}


@JsonView(Views.Internal.class)

@RequestMapping("/items/internal/{id}")

public Item getItemInternal(@PathVariable int id) {

    return ItemManager.getById(id);

}


查看完整回答
反对 回复 2022-11-02
?
皈依舞

TA贡献1851条经验 获得超3个赞

我从“领域驱动设计”中学到的东西:不要试图找到一个“银弹”模型。总是有不同的方式来表达你的概念。模型总是依赖于上下文。

在这里,您report的存储方式是一种表示形式。您的 REST 客户端想要读取它的方式是另一种表示。您可以想象每个用例都有一个表示。

在这种情况下,我不会为每个应用层之间或域有界上下文之间的映射编码经济。

另外,我会避免继承,如有必要,更喜欢一些接口,接受一些代码冗余。


查看完整回答
反对 回复 2022-11-02
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

通常在应用程序的不同层之间存在对象分离,这意味着您可以拥有一个直接映射到数据库的 Report 对象,但还有一组用于与客户端通信的不同对象,您还可以拥有第三个对象一组对象,您的业务对象,它将包含与您的应用程序相关的逻辑。请注意,您将需要维护在这些对象之间转换的逻辑,可能是构建器模式或类似的东西。作为一个小例子,让我们考虑您的情况,您可以:

  1. 报告:类与数据库的 1 对 1 映射,便于保存和检索对象

  2. ReportDAO:包含与 Report 相同的字段,但具有应用程序在处理这些报告时可能使用的附加功能(现在想不出任何东西)

  3. ReportDTO/ExtendedReportDTO:您可以拥有多个继承或不继承的类,这些类将仅包含字段 + getter/setter,并用于与客户端进行通信。

现在使用这个简单的示例可能并不明显,但是分离您的对象将使以后扩展和修改您的应用程序变得更加容易。目前,您可能在所有级别都拥有相同的信息,但稍后可能会发生变化,而且最好不要公开您的业务对象,因此如果您在应用程序中使用 Report 类,则共享不是一个好主意例如,它在 API 中。所以我想说你可以在这里使用继承,但至少对我来说,我认为在应用程序和数据库级别拥有这些相同的对象不是一个好主意。


查看完整回答
反对 回复 2022-11-02
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

如果该类将数据库对象与数据库对象进行 1 对 1 映射,并且您使用的是ORM映射,那么最好将两个类拆分并获得所有继承优势。

作为通用方法,我谦虚地建议将模型(映射存储库,例如关系数据库)细分到视图模型,即返回给客户端的对象。


查看完整回答
反对 回复 2022-11-02
  • 4 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信