91. WET稀释了性能瓶颈

来源:互联网 发布:美国博士毕业知乎 编辑:程序博客网 时间:2024/04/29 17:44


WET稀释了性能瓶颈

        DRY原则(Don't Repeat Yourself)的重要性在于它将系统知识的每一部分都应该有单独表现的观点代码化。也就是说,知识应该包含在单独的实现中。DRY的对立面则是WET(Write Every Time)。如果我们的知识编码于不同的实现中,那代码则是WET的。当你考虑它们于某对性能问题的影响时,DRY与WET的性能实质就特别明显了。
        让我们从考虑 我们系统中的某个叫X的特性开始,它是个CPU瓶颈。假定X消耗30%的CPU,有10处不同的实现。平均下来,每处实现消耗3%的CPU。如果我们想要的是快速的解决问题的话,这个水平的CPU消耗不足挂齿,于是就会忽略这是个性能瓶颈。然而,假设我们通过某种方式认识到X是个性能瓶颈,我们现在就会面对查找、修复每一处实现的问题。如果是WET的话,我们有10处不同的实现需要定位和修复;如果是DRY的话,我们会清楚地看到30%的性能瓶颈,并且只用十分之一的代码要修复。而且,我没有提到还要花时间找到每一处实现?
        有一个我们常常由于违背DRY而产生负罪感的使用例子:集合。实现查询的一个通常的技术可能是遍历整个集合并对每个元素应用要返回的查询:

public class UsageExample {    private ArrayList<Customer> allCustomers = new ArrayList<Customer>();    // ...    public ArrayList<Customer> findCustomersThatSpendAtLeast(Money amount) {        ArrayList<Customer> customersOfInterest = new ArrayList<Customer>();        for (Customer customer: allCustomers) {            if (customer.spendsAtLeast(amount))               customersOfInterest.add(customer);        }        return customersOfInterest;    }}

        通过向客户暴露原始的集合,我们违背了封闭的原则。这不仅限制了我们重构的能力,也因为强迫我们代码的用户可能重新实现同样的查询而违反DRY原则。这种情况可以通过利用API来替换暴露原始集合来轻松避免。这个例子引用了一种新的、领域相差的集合类型,称之为“CustomerList”。这个新的类型可以在语义上更符合你的领域。它表现得像所有查询的自然之家一样。
        使用这个新的集合类型,可以让我们更加容易地看到这些查询是否是性能瓶颈。使用它我们在查询中就不再需要暴露我们选择的表现形式,如ArrayList,给客户。这就给我们在不违背客户端约定的情况下修改这些实现的自由:

public class CustomerList {    private ArrayList<Customer> customers = new ArrayList<Customer>();    private SortedList<Customer> customersSortedBySpendingLevel = new SortedList<Customer>();    // ...    public CustomerList findCustomersThatSpendAtLeast(Money amount) {        return new CustomerList(customersSortedBySpendingLevel.elementsLargerThan(amount));    }}public class UsageExample {    public static void main(String[] args) {        CustomerList customers = new CustomerList();        // ...        CustomerList customersOfInterest = customers.findCustomersThatSpendAtLeast(someMinimalAmount);        // ...    }}    

        在这个例子中,遵循DRY让我们在客户端消费水平上通过SortedList引入了一个备选索引。比较这个特定的例子更重要的是,遵循DRY帮助我们定位并修复了一个WET代码很难发现象的性能瓶颈。

原文:WET Dilutes Performance Bottlenecks by Kirk Pepperdine


0 0
原创粉丝点击