10

これはかなり主観的な質問かもしれませんが、もう少し意見を知りたいです。Spring MVC を使用して Rest API サービスを構築し、DTO-Domain-Entity パターンを実装しました。Builder パターンを DTO に実装することについてどう思うか知りたいです。

public class UserResponseDTO
    extends AbstractResponseDTO {

    private String username;
    private Boolean enabled;

    public UserResponseDTO(String username, Boolean enabled) {
        this.username = username;
        this.enabled = enabled;
    }

    public String getUsername() {
        return this.username;
    }

    public Boolean getEnabled() {
        return this.enabled;
    }

    public static class Builder {

        private String username;
        private Boolean enabled;

        public void setUsername(String username) {
            this.username = username;
        }

        public void setEnabled(Boolean enabled) {
            this.enabled = enabled;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }
}

定義によると:

Builder 設計パターンの意図は、複雑なオブジェクトの構築をその表現から分離することです。そうすることで、同じ構築プロセスで異なる表現を作成できます。

私の DTO ケースのほとんど (すべてとは言いません) では、このケースのように、構築するより複雑なオブジェクトはありません。そして、正直なところ、DTO について話している場合、複雑なオブジェクトを構築する例は思い浮かびません。

不変オブジェクトを使いやすくし、コードを明確にするのに役立つパターンの 1 つに Builder パターンがあります。

Builder パターンは、オブジェクトの不変性を提供します。次に、DTOはサービス応答自体であり、これは応答であるため変更すべきではないと考えることができます(少なくともそれが私が考えている方法です)


それで、あなたはどう思いますか?このパターンを DTO に使用する必要がありますか (このケース、およびおそらくそれらのほとんどが複合オブジェクトの原則を満たしていないという事実を考えると)。

4

1 に答える 1

21

私の簡単な答えは、それは好みの問題だということです。Builder パターンの動作が気に入ったら、それを適用してください。このような小さなケースでは、どちらの方法でも問題はないと思います。私の個人的な好みは、あまり価値がないように見えるため、ここでは Builder を使用しないことです。

私のより長い答えは、Builder パターンは、テレスコーピング コンストラクターのようなアンチパターンに頼ることなく、複雑なオブジェクトの構成を容易にするように設計されているということです。この場合、どちらの場合もアンチパターンはありません。どちらのオプションも比較的小さく効率的です。

ただし、設定について話している間は、流暢なインターフェースを使用するビルダー パターンの修正版を好みます。各メソッドは Builder のインスタンスを返すため、メソッド呼び出しを (別々の行ではなく) 連鎖させることができます。これは、リンクした記事の Java の例に似ています。

ビルダーを次のように変更します。

public static class Builder {

        private String username;
        private Boolean enabled;

        public Builder setUsername(String username) {
            this.username = username;
            return this; 
        }

        public Builder setEnabled(Boolean enabled) {
            this.enabled = enabled;
            return this;
        }

        public UserResponseDTO build(){
            return new UserResponseDTO(username, enabled);
        }
    }

したがって、ビルダーを使用すると、次のようになります。

UserResponseDTO ur = new Builder().setUsername("user").setEnabled(true).build();

繰り返しますが、個人的な好みの問題です。

于 2015-08-04T20:16:53.447 に答える