簡體   English   中英

我們應該有類似的DTO嗎?

[英]Should we have similar DTOs?

我有2個dto,它們的用法不同,但是它們具有相似的字段。 例如, MyIdESDto使用信息從MyIdDto 后一個對象是用數據庫中的數據構建的,而MyIdESDto是用MyIdDto構建的,並用MyIdDto數據完成的。

我認為應該只有1個DTO,並且該代碼在DTO中設置了所需的任意多個字段。 其他人說MyIdESDto應該擴展MyIdDto。 其他人也同意這種實現方式,說如果刪除某些功能,它不會破壞代碼。 哪個更好用? 能給我您選擇的理由嗎?

    @Data
    @NoArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class MyIdESDto {
      private String name;
      private Integer id;
      private Integer age;


     public MyIdESDto(MyDto dto) {
        this.name = dto.getName();
        this.id = dto.getId();
        this.aage = 42;
     }
}




@Data
    @NoArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class MyIdDto {
      private String name;
      private Integer id;
   }

由於第三組給出的相同原因,我將繼續使用當前的實現。

對我而言,繼承不是一個好主意,因為在這里我看不到is-a關系。 它們只是具有一些相似且有些相關的屬性。

繼承是表達A is-a B的手段 這並不意味着要防止代碼重復。

所以,如果你能找到一個有意義的解釋,為什么MyIdEDto 也是 MyIdDto -然后繼承是天作之合。 如果不是,則留在兩個不同的類中。

另一方面, 有時實用主義也能提供良好的指導。 因此,如果您的大多數團隊都認為繼承解決方案“更好”,那就去做吧。

換句話說:這確實是一個“樣式”問題。 沒有“更好”的選擇,也沒有硬道理可循。 因此:選擇最適合負責代碼的人員的解決方案。 分別針對受此決定影響最大的人(這兩個群體並不總是相同的)。

DTO只是屬性集(即沒有業務邏輯)。 因此,通過引入DTO層次結構避免的唯一重復是setter和getter的重復,這可能會導致多行代碼,但其本身並不復雜。

如果每個DTO建模不同的概念,並且兩個類都不打算在相關代碼中使用(可以從某種OO抽象中受益), 則代碼設置所需的字段數將使您難以跟蹤已初始化的字段隨時。 (例如,很明顯, MyIdDto沒有age ,但是如果我們使用MyIdESDtoage=0 ,我們將必須跟蹤DTO的來源,以便知道我們是否可以信任的價值。 MyIdESDto.age )。

面對此問題,我通常會考慮以下方式(我同意,可能會引起爭議):

在某些情況下,重復代碼可以保持軟件體系結構的清潔和易於理解。 重復項還可以用於防止難以理解的復雜抽象進入系統(...)。為解決兩個或多個相似但單獨發展的需求而被抽象的代碼可能難以修改。

“克隆被認為是有害的”被認為是有害的:軟件的克隆模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM