[CLEAN CODE]オブジェクトとデータ構造


データ抽象
資料を詳しく公開するより抽象的な概念で表現したほうがいい.
クエリー/設定関数を意図せずに追加する方法が最悪です.
資料/オブジェクト非対称
それでもデータ構造は公開されており、他の関数は提供されていません.
public class Square {
    public Point topLeft;
    public double side;
}

public class Rectangle {
    public Point topLeft;
    public double height;
    public double width;
}

public class Circle {
    public Point center;
    public double radius;
}

public class Geometry {
    public final double PI = 3.141592653589793;

    public double area(Object shape) throws NoSuchShapeException {
        if (shape instanceof Square) {
            Square s = (Square) shape;
            return s.side * s.side;
        } else if (shape instanceof Rectangle) {
            Rectangle r = (Rectangle) shape;
            return r.height * r.width;
        } else if (shape instanceof Circle) {
            Circle c = (Circle) shape;
            return PI * c.radius * c.radius;
        } else {
            throw new NoSuchShapeException();
        }
    }
}
オブジェクトは、抽象化された後に資料を処理する関数のみを公開します.
public class Square implements Shape {
    private Point topLeft;
    private double side;

    public double area() {
        return side * side;
    }
}

public class Rectangle implements Shape {
    private Point topLeft;
    private double height;
    private double width;

    public double area() {
        return height * width;
    }

}

public class Circle implements Shape {
    private Point center;
    private double radius;
    public final double PI = 3.141592653589793;

    public double area() {
        return PI * radius * radius;
    }
}
コンテキスト関連コードオブジェクトコード向けの新しい関数の追加が困難新しいデータ型の追加が困難
オブジェクト向けのコードとプログラムコードには相補的な特徴がある.
ディミットの法則
ディミットの法則は周知の人間化であり、モジュールは自分が操作した対象の内幕を知らなければならない.
  • ディミの法則に違反する例
  • final String outputDir = xtxt.getOptions().getScratchDir().getAbsolutePath();
    列車が衝突する
    上のコードは次から次へと列車のように見えるので、列車衝突と呼ばれています.
    粗いと思われる方法なので避けたほうがいいですが、以下に分けたほうがいいです.
    Options opts = ctxt.getOptions();
    File scratchDir = opts.getScratchDir();
    final String outputDir = scratchDir.getAbsolutePath();
    上記の例が公制法則に違反しているかどうかは、資料構造かオブジェクトかによって異なります.
    ヘテロ構造
    半分が客体で、半分が資料構造の雑種構造である場合がある.
    ヘテロ構造には、重要な機能を実行する関数もあれば、公開変数や公開クエリー/設定関数もあります.
    公開クエリー/設定関数には、非公開変数がそのまま表示されます.
    したがって,プログラム的プログラミングの資料構造法のように,非公開変数を用いる誘惑に陥りやすい.
    構造体を隠す
    前のコード例が本物のオブジェクトである場合、一時ディレクトリの絶対パスをどのように取得すればよいのでしょうか.
    // 첫번째 방법. ctxt 객체에 공개해야 하는 메서드가 너무 많아짐
    ctxt.getAbsolutePathOfScratchDirectoryOption(); 
    
    // 두번째 방법. 자료 구조를 반환한다고 가정하면 썩 내키지 않음
    ctxt.getScratchDirectoryOption().getAbsolutePath();
    ctxtオブジェクトに一時ファイルを作成する方法があります.
    ctxtは内部構造を表示しません.モジュール内で知らない複数のオブジェクトをナビゲートする必要はありません.したがって、パラメータ法則に違反しません.
    BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
    データ転送オブジェクト
    資料構造体の典型的な形式は,公開変数のみで関数のないクラスである.
    このようなデータ構造は、データ転送対象(Data Treansfer Object,DTO)と呼ばれることがある.
    特に、ソケットから受信したメッセージの構文をデータベースと通信したり分析したりするのに役立ちます.
    通常、DTOは、データベースに格納された未加工情報をアプリケーションコードで使用するオブジェクトに変換する一連のステップで最初に使用される構造である.
    アクティビティレコード
    アクティビティレコードはDTOの特殊な形式です.
    公開変数または非公開変数を有するクエリー/設定関数を有するデータ構造であるが、カニsaveまたはfindに類似したナビゲーション関数も提供される.
    n/a.結論
    対象公開アクション、隠し資料.
    したがって、既存の動作を変更することなく、新しいオブジェクトタイプを追加するのは簡単です.
    既存のオブジェクトに新しいアクションを追加するのは難しいです.
    資料の構造は特に動作しないで資料を露出します.
    したがって、既存の関数に新しいデータ構造を追加することは困難であり、
    既存の資料構造に新しいアクションを追加するのは簡単です.
    システムを実施する際、
    新しいデータ型の柔軟性を高める必要がある場合は、オブジェクトが適しています.
    新しい動作の柔軟性を高める必要がある場合は、資料構造とプログラムコードが適切です.