再構築-不要なオブジェクトを作成しない

7596 ワード

#概要

  • この機能java ITEM 6のトピックは、「不要なオブジェクトの作成を避ける」です.
    詳細については、リンクを参照してください.

  • クライアントから入力データを処理する検証中に、
    関連する内容があるので、応用してみたいです.
  • #検証
    サービスロジックは、
  • クーポン数の値または入力されていない値の検証を処理しています.DTOオブジェクトでJavaのValidationを使用して、ロールをコントローラレイヤに移動します.
  • CouponDto
  • @Getter
    @Setter
    public class CouponDto {
    
        ...
    
        @NotNull(message = "필수로 입력해야 합니다.")
        @Max(message = "할인율은 100 미만이여야 합니다.", value = 99)
        @Min(message = "할인율은 0 초과여야 합니다.", value = 1)
        private Long discountRate;
    
     
        @NotNull(message = "필수로 입력해야 합니다.")
        @Max(message = "수량은 1000 미만이여야 합니다.", value = 999)
        @Min(message = "수량은 0 초과여야 합니다.", value = 1)
        private int totalCount;
    
    		...
    }

  • 問題は、totalCountに値が入力されていない場合、次のエラーメッセージが表示されることです.


  • エラー内容はStringをint型に変換できないエラーです.

  • @ModelAttribute宣言を使用して、クライアントから要求されたデータを
    Setterを使用して、指定したクラスに値をバインドします.
    JavaのValidationが有効になる前に、バインド時にエラーが最初にトリガーされ、指定されたメッセージが出力されず、Springのエラーメッセージがそのまま露出します.
  • totalCountのタイプをIntegerに変更すると、正常に動作します.
  • #取引終了
    パフォーマンス:

  • また、機能Javaからの不要なオブジェクトの作成も避ける必要があります.
    COUPONDtoオブジェクトを作成するたびに、Long타입의 discountRateInteger 타입의 totalCountが生成されます.

  • また、割引率を計算するロジックとクーポン数を減らすロジックのため、自動追跡はパフォーマンスの低下を招きます.

  • もちろん,クーポン生成要求自体はadminアカウントのみが許可され,クーポンの種類がいくら多くても数百個は生成されない.
  • 可用性
  • ユーザが値を入力していない場合、未知のエラー情報をユーザに表示することは、サービスにおいて非常に重要である.開発者でない限り、このエラーメッセージを見て値を入力しなかったとは思いません.
  • n/a.結論

  • つまり、パフォーマンスとサービスの可用性の面で取引が中断されています.
    機能javaからも、「最近のJVMでは、何もしない小さなオブジェクトの作成と回収に大きな負担はありません.プログラムの明確性、簡潔性、機能のために追加のオブジェクトを作成したり回収したりするのは、通常良いことです.」という言葉がある

  • これは、プログラムの明確性、機能性、可用性のためにより多くのオブジェクトを作成する必要があることを意味します.discountRatetotalCountのタイプがWrapperタイプとして発表された.
  • CouponDto
  • @Getter
    @Setter
    public class CouponDto {
    
        ...
    
        @NotNull(message = "필수로 입력해야 합니다.")
        @Max(message = "할인율은 100 미만이여야 합니다.", value = 99)
        @Min(message = "할인율은 0 초과여야 합니다.", value = 1)
        private Long discountRate;
    
     
        @NotNull(message = "필수로 입력해야 합니다.")
        @Max(message = "수량은 1000 미만이여야 합니다.", value = 999)
        @Min(message = "수량은 0 초과여야 합니다.", value = 1)
        private Integer totalCount;
    
    		...
    }