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