【问题标题】:Is it bad practice to use same variable for two purpose in DTO在 DTO 中为两个目的使用相同的变量是不好的做法吗
【发布时间】:2017-03-11 05:26:03
【问题描述】:
@JsonRootName(value = "studentInfo")
@JsonInclude(value = Include.NON_EMPTY)
public class StudentInfo {
    private String student;
    @JsonProperty("address")
    private String address;

    @JsonProperty("studentName")
    public String getStudent() {
        return student;
    }

    @JsonProperty("studentUserId")
    public void setStudent(String student) {
        this.student = student;
    }
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

这是我的Student 课程,我在与学生相关的 API 中将此对象用作 DTO。 在这里,我以这样一种方式使用了 student 字符串变量,当调用 POST/PUT/ API 并传递 studentUserId 时,它将被设置为 student 字符串变量,但每当 StudentInfo 对象作为响应实体返回时,它将返回实际存储在用户表中的学生姓名。

我只想知道,我使用 student 字符串变量和@JsonProperty 的方式是正确的使用方式还是错误的做法?

【问题讨论】:

  • 是的,这是不好的做法。您的班级中应该有一个单独的 userId 字段。对不同的数据使用相同的字段只是等待发生的错误。当其他人稍后再看课程时,也会感到非常困惑。
  • 如果字段的语义取决于它所使用的上下文,那么为该类编写测试也是一场噩梦。

标签: java jersey jackson dto


【解决方案1】:

不仅适用于 DTO,而且适用于所有课程、程序和语言(基本上是在现实的非学术生活中),在编程时,每个变量和属性都有自己的用途和仅用于此

如果您遵循此规则,您还将遵循以下约定:

  • 命名(每个变量都有一个唯一的描述性名称)
  • 可读性(不仅您,其他人也会看到并知道每个变量的用途)
  • 可维护性(当某些事情发生变化时-是的,它会改变-,您不需要划分或制造丑陋的变通方法来进行更改或解决问题)
  • 可测试性如果字段的语义取决于它所使用的上下文,那么为类编写测试是一场噩梦。(@Fildor)

还有一些其他的。无论如何,这只是约定而不是强制性规则,语法会令人困惑但正确,因此您可以使用它。我的建议是:不要! ;)

【讨论】:

  • 我想在该列表中添加可测试性。
  • 你是对的。并非不可能,但非常丑陋和复杂。鉴于问题中的场景:我必须编写测试,以便考虑上下文(用作响应/用作查询)。当然,有人可能会争辩说,该字段仅经过测试,因为它包含我给它的实际值,但可能还有更多。所以我是在笼统的基础上发言。一个更好的例子是有界的数值字段。根据上下文,它可能具有不同的有效边界,必须在考虑上下文的​​情况下对其进行测试。导致一个丑陋的不稳定测试......至少在我的拙见中。
猜你喜欢
  • 2013-03-24
  • 2012-02-01
  • 2011-11-16
  • 2020-01-16
  • 1970-01-01
  • 2011-08-06
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多