Clean Code読書ノート8


単純設計四規則:


•Runs all the tests•Contains no duplication•Expresses the intent of the programmer•Minimizes the number of classes and methods(著者が考えている金の鍵)

すべてのテストを実行


低結合高凝集による結果は,より多くのクラスと方法があることである.独立したユニットテストをより簡単に作成できます.

繰り返し不可


重複は重複するコードだけでなく、もちろん他の形式の存在を指す.たとえば
int size() {}
boolean isEmpty() {}

別々に実現できます.
boolean isEmpty() {
return 0 == size();
}

これを見て、少量の繰り返しを見逃さないでください.
public void scaleToOneDimension(
float desiredDimension, float imageDimension) {
    if (Math.abs(desiredDimension - imageDimension) < errorThreshold) return;
    float scalingFactor = desiredDimension / imageDimension;
    scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
    RenderedOp newImage = ImageUtilities.getScaledImage(
    image, scalingFactor, scalingFactor);
    image.dispose();
    System.gc();
    image = newImage;
}
public synchronized void rotate(int degrees) {
    RenderedOp newImage = ImageUtilities.getRotatedImage(
    image, degrees);
    image.dispose();
    System.gc();
    image = newImage;
}

再構築後:
    public void scaleToOneDimension(float desiredDimension, float imageDimension) {
        if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
            return;
        float scalingFactor = desiredDimension / imageDimension;
        scalingFactor = (float) (Math.floor(scalingFactor * 100) * 0.01f);
        replaceImage(ImageUtilities.getScaledImage(image, scalingFactor,
                scalingFactor));
    }

    public synchronized void rotate(int degrees) {
        replaceImage(ImageUtilities.getRotatedImage(image, degrees));
    }

    private void replaceImage(RenderedOp newImage) {
        image.dispose();
        System.gc();
        image = newImage;
    }

大規模な多重化は、小規模な多重化の理解から開始する必要があります.-テンプレートモードTEMPLATE METHOD patternを使用して重複を排除する:
public class VacationPolicy {
    public void accrueUSDivisionVacation() {
        // code to calculate vacation based on hours worked to date
        // ...
        // code to ensure vacation meets US minimums
        // ...
        // code to apply vaction to payroll record
        // ...
    }
    public void accrueEUDivisionVacation() {
        // code to calculate vacation based on hours worked to date
        // ...
        // code to ensure vacation meets EU minimums
        // ...
        // code to apply vaction to payroll record
        // ...
    }
}

共通のコードを抽象的な方法で実装し、それぞれの継承クラスでそれぞれの異なるコードを実装します.
abstract public class VacationPolicy {
    public void accrueVacation() {
        calculateBaseVacationHours();
        alterForLegalMinimums();
        applyToPayroll();
    }
    private void calculateBaseVacationHours() { /* ... */
    };
    abstract protected void alterForLegalMinimums();
    private void applyToPayroll() { /* ... */
    };
}
public class USVacationPolicy extends VacationPolicy {

    @Override
    protected void alterForLegalMinimums() {
        // US specific logic
    }
}
public class EUVacationPolicy extends VacationPolicy {

    @Override
    protected void alterForLegalMinimums() {
        // EU specific logic
    }
}