DTOの可用性


#DTOとは?
DTO(Data Transfer Object)は、MVCストリームでのデータの交換を可能にする階層間データ交換のオブジェクトです。 論理を持たない純粋なオブジェクトはgetter/setterメソッドのみです。

DTOを使用する理由


まず、DTOがMVCストリームでデータを交換する責任を負わないと仮定し、以下の例を示す.
package racingcargame.car;

public class Car {
    private String name;
    private int position;

    public Car(final String name, final int position) {
        this.name = name;
        this.position = position;
    }
    
    ...
}
上記の例はレーシングカーゲームのCar Modelオブジェクトです.
ビューに複数のCarオブジェクト名と位置情報を出力するには、どのような方法がありますか?🤔🤔

  • リストからnameとposition情報をそれぞれ取得する.

  • Mapでkey、value値でnameとpositionを取得します.

  • Carオブジェクトを取得します.
  • 上記の方法があります.しかし、以上の3つの方法には問題があります.(特に3番)
    まず、最初の方法は悪くないように見えますが、Carオブジェクトが30個のグローバル変数を持っている場合、すぐに答えが得られます.
    第1の方法を使用するには、30個のグローバル変数をビューに渡すCarオブジェクトにgetterを作成する必要があります.この場合、30個のgetterは、Car内部のビジネスロジックの読み取り可能性を大幅に低下させる.
    第2の方法も同様の理由で問題がある.
    では、3番の方法は何ですか.第3の方法も可読性の問題を生じ、これよりも大きな問題がある.

    モデルをViewに渡すと?


    CarオブジェクトをViewに直接渡すと、次の問題が発生します.

  • モデルのビジネスロジックをI/Oのみを担当するViewに暴露します.

  • Viewでは、予期せぬエラーが発生し、モデルの状態が変化する可能性があります.
  • ビューでは、モデルのメソッドにアクセスできるため、モデルのステータスに影響を与える可能性があります.
  • CarオブジェクトをそのままViewに渡すと、このような深刻な問題が発生します.

    答えはDTO?


    DTOを使用すると、上記の問題を解決できます.次のサンプルコードを見てみましょう.
    package racingcargame.car;
    
    public class CarDto {
        private String name;
        private int position;
    
        public CarDto(final String name, final int position) {
            this.name = name;
            this.position = position;
        }
    
        public String getName() {
            return name;
        }
    
        public int getPosition() {
            return position;
        }
    
        ...
    }
    上図は、Carオブジェクトの状態情報を取得するCardtoオブジェクトです.
    デフォルトでは、DTOはgetter/setterのみをメソッドとして使用するため、ビジネスロジックの読み取り可能性の欠如を防止するために、Carオブジェクトでgetter/setterを直接実装できます.
    また、DTOはモデルの状態のみを取得し、ビューはモデルの内部論理を露出させず、アクセスもできない.

    に感銘を与える


    エレガントなテクノロジーコース第1週のレーシングカーミッションを行い、初めてDTOに触れる.
    DTOを用いてタスクを実現するとともに,DTOがモデルの可読性を向上させ,モデルとビューを結合する問題を解決できることも感じた.🙂🙂.
    次のミッションからはDTOを積極的に使います!