Как насчет
public abstract class Calculator {
protected int aggregate(int[] array, int startValue) {
int result = startValue;
for (int i = 0; i < array.length; i++) {
result = this.aggregateSingle(array[i], result);
}
return result;
}
protected abstract int aggregateSingle(int nextValue, int oldAggregation);
}
public class Adder extends Calculator {
public int sum(int[] array) {
return this.aggregate(array, 0);
}
protected int aggregateSingle(int nextValue, int oldAggregation) {
return nextValue + oldAggregation;
}
}
public class Multiplier extends Calculator {
public int multiply(int[] array) {
return this.aggregate(array, 1);
}
protected int aggregateSingle(int nextValue, int oldAggregation) {
return nextValue * oldAggregation;
}
}
Этот подход даже сохраняет структуру класса, что может быть важно в том случае, классы Adder
и Multiplier
используются снаружи (они public
!)
Лично я не считаю, что вся эта деятельность является «улучшением ремонтопригодности» как таковой: она больше LoC и даже более сложна из-за такого характера наследования. Вопрос для меня, похоже, какой-то теоретический вопрос, который должен воспитывать ваш ум в отношении того, как рефакторинг должен быть выполнен, - но точно пропустил самый важный момент: простыми вещами просто, даже если они могут быть немного избыточными.
Почему бы не пройти начальное значение как параметр в одном общем методе? – Turing85
Существует две разные операции. Я не думаю, что здесь много дублирования. Я бы сохранил это как есть. Btw, Adder и Multiplier звучат немного искусственно для меня. Почему бы не создать класс калькулятора с методом sum и multiply? –
Я думаю, что фактическая операция должна быть изолирована от цикла for, но 'result' не находится в том же объеме. –