首页 > 解决方案 > 对具有不同返回值和类型的函数使用 DRY 原则

问题描述

说我有两种方法

public int findPages() {
    return this.selectors
        .getPagesSelector()
        .map(selector -> {
            Elements htmlElement = this.htmlPage.select(selector);
            return NumberUtils.toInt(htmlElement.text(), 1);
        })
        .orElse(1);
}
private String findPercent(Element product, double oldPrice, double newPrice) {
    return this.selectors
        .getPercentSelector()
        .map(selector -> {
            Elements htmlElement = product.select(selector);
            return StringUtils.defaultIfEmpty(htmlElement.text(), calculatePercent(oldPrice, newPrice));
        })
        .orElse(calculatePercent(oldPrice, newPrice));

两者做不同的事情并返回不同的类型,但共享代码结构。为了更简洁的代码,我应该将方法重构为更抽象的方法,还是这不违反 DRY 原则?谢谢!

标签: javadry

解决方案


DRY(不要重复自己)原则,顾名思义,就是不要对同一事物进行多个实现。你有两种方法,findPagesfindPercent。总的来说,这两种方法做的事情非常不同,因此它们不会相互重复。所以我们寻找部分匹配,但是,如果我们查看代码,我们会发现一些差异,所以它也不是真正的部分匹配。一个是调用pagesSelector,另一个是调用percentSelector. 您可以进行一些重构,例如获取选择器名称并返回正确选择器的方法,但这将是一项庞大而复杂的工作,除非您有充分的理由并且进行如此庞大的工作,否则不值得这样做和小增益,有两个看起来相似的代码不是一个正当的理由。如果您必须编写这种代码可能 100 次,那么重构您的代码或编写代码生成器并用它生成您的方法是有意义的。


推荐阅读