Полиморфизм и, возможно, абстракция и инкапсуляция - ваши друзья здесь.
Вы должны уточнить, какие инструкции у вас есть на .... // do some things
части. Если вы всегда используете одну и ту же информацию, но делаете с ней разные вещи, решение довольно просто, используя простой полиморфизм. Смотрите мой первый пересмотр этого ответа. Я предполагаю, что вам нужна разная информация для выполнения конкретных задач в каждом конкретном случае.
Вы также не указали, находятся ли эти функции в одном классе / модуле или нет. Если это не так, вы можете использовать наследование, чтобы разделить общие части и полиморфизм, чтобы ввести другое поведение в конкретной части. Если они находятся в одном классе, вам не нужны ни наследование, ни полиморфизм.
В разных классах
С учетом того, что вы задаете вопрос, который может потребоваться для вызова функций с разными сигнатурами в зависимости от подкласса реализации (например, передача a
или b
в качестве параметра в зависимости от случая), и предполагая, что вам нужно что-то сделать с промежуточными локальными переменными (например, a
и b
) в конкретных реализациях:
Короткая версия : Полиморфизм + Инкапсуляция: передать все возможные параметры in & out , которые могут понадобиться каждому подклассу, в абстрактную функцию. Может быть менее болезненным, если вы заключите их в объект.
Длинная версия
Я бы сохранил промежуточное состояние в элементе общего класса и передал бы его методам реализации. В качестве альтернативы вы можете получить State из методов реализации вместо передачи его в качестве аргумента. Затем вы можете создать из него два подкласса, реализуя метод doSpecificStuff(State)
и извлекая необходимые параметры из промежуточного состояния в суперклассе. При необходимости суперклассом, подклассы также могут изменять состояние.
(подробности Java, извините)
public abstract class Generic {
private State state = new State();
public void a() {
preProcess();
prepareState();
doSpecificStuf(state);
clearState();
return postProcess();
}
protected void preProcess(){
a = getA;
b = getB;
b.doStuff();
}
protected Object postProcess(){
b.send()
return a - b;
}
protected void prepareState(){
state.prepareState(a,b);
}
private void clearState() {
state.clear();
}
protected abstract doSpecificStuf(State state);
}
public class Specific extends Generic {
protected doSpecificStuf(State state) {
state.getA().doThings();
state.setB(someCalculation);
}
}
public class Specific2 extends Generic {
protected doSpecificStuf(State state) {
state.getB().doThings();
}
}
В том же классе
Другой возможностью было бы заставить метод preProcess()
возвращать переменную State
и использовать ее в реализациях a1()
и a2()
.
public class MyClass {
protected State preProcess(){
a = getA;
b = getB;
b.doStuff();
return new State(a,b);
}
protected Object postProcess(){
b.send()
return a - b;
}
public void a1(){
State st = preProcess();
st.getA().doThings();
State.clear(st);
return postProcess();
}
public void a2(){
State st = preProcess();
st.getB().doThings();
State.clear(st);
return postProcess();
}
}