代码坏味道:语句篇

2022-09-24  本文已影响0人  GuangHui

1 滥用控制语句

产生的原因:

和长函数产生的原因类似,平铺直叙地写代码,一点一点追加代码,没有遵循童子军军规,没有做到分离关注点。

坏味道:
存在的问题:

真正的问题在于它们会使代码变得复杂,超出人脑所能理解的范畴。

解决方案:

一个衡量代码复杂度的标准是圈复杂度,我们可以通过工具检查一段代码的圈复杂度。

编程规则:

2 与封装有关的坏味道:过长的消息链和基本类型偏执

坏味道:
解决方案:
请记住一句话:

构建模型,封装散落的代码。

坏味道之火车残骸示例:
String name = book.getAuthor().getName();

注意,当你必须要首先了解一个类的细节,才能写出代码时,这只能说明一件事,这个封装是失败的。

我们很多程序员对封装的理解一直停留在数据结构加算法的层面,这使暴露细节成了常态,而封装反倒成了稀缺。而要想摆脱初级程序员的水平,就要先从少暴露细节开始。

重构之后:

class Book {
...
public String getAuthorName() {
return this.author.getName();
}
...
}


String name = book.getAuthorName();
坏味道之基本类型偏执示例:
public double getDisplayPrice() {
    BigDecimal decimal = new BigDecimal(this.price);
    return decimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}

重构之后:

class Price {
    private long price;

    public Price(final double price) {
        if (price <= 0) {
            throw new IllegalArgumentException("Price should be positive");
        }
    
        this.price = price;
    }
}

一旦有了这个模型,我们还可以再进一步,比如,如果我们想要让价格在对外呈现时只有两位,在没有 Price 类的时候,这样的逻辑就会散落代码的各处,事实上,代码里很多重复的逻辑就是这样产生的。而现在我们可以在 Price 类里提供一个函数:

public double getDisplayPrice() {
    BigDecimal decimal = new BigDecimal(this.price);
    return decimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
上一篇 下一篇

猜你喜欢

热点阅读