Clean Code 读书笔记八

简单设计四规则:

• 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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值