将DRY原理用于具有不同返回值和类型的函数

时间:2019-06-16 09:38:16

标签: java 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原理?谢谢!

1 个答案:

答案 0 :(得分:2)

顾名思义,DRY(不要重复自己)原理是关于同一件事的几种实现。您有两种方法,findPagesfindPercent。总体而言,这两种方法在做的事情上有很大不同,因此它们不会彼此重复。因此,我们寻找部分匹配,但是,如果我们查看代码,就会发现一些差异,因此它也不是真正的部分匹配。一个正在呼叫pagesSelector,另一个正在呼叫percentSelector。您可以进行一些重构,例如一种方法,该方法将获得选择器的名称并返回正确的选择器,但这将是一项庞大而复杂的工作,除非您有充分的理由并且需要如此大的工作,否则这是不值得的和小收益,拥有两个看起来相似的代码不是正确的理由。如果您可能必须编写100次此类代码,则可以重构代码或编写代码生成器并使用该代码生成方法。