Я пытаюсь сосредоточиться на том, как бы я решил эту конкретную проблему. У нас есть внешний API, который выполняет некоторую логику и возвращает результат этой логики. К сожалению, API возвращает новый объект в результате, в отличие от той части, которая мне интересна. Например, код будет выглядеть примерно так:
public class ComplexObject {
//lots of fields
}
public interface LogicApplier {
LogicResult applyLogic(ComplexObject obj);
}
public class LogicResult {
ComplexObject result;
public ComplexObject getResult();
}
public class FirstImplementation {
private LogicApplier _applier;
public Implementation(LogicApplier applier) {
_applier = applier;
}
public ComplexObject mainImplementation (ComplexObject apply) {
LogicResult logicResult = _applier.applyLogic(apply);
ComplexObject newComplexObject = logicResult.getResult();
//Do some other stuff with new ComplexObject
}
}
Итак, вопрос в том, как лучше всего ограничить «власть» LogicApplier над FirstImplementation? Например, наша мотивация для вызова логики в первую очередь состоит в том, чтобы получить пропущенное поле, скажем, «имя». Это поле может потенциально отличаться, скажем, во SecondImplementation, где эта реализация теперь пытается получить «уличный адрес» из LogicApplier API. Однако ничто не мешает LogicApplier изменить другое поле, например, «idNumber».
Лучше ли это решить путем добавления интерфейса для наших конкретных реализаций и сопоставления полей вручную? Что-то вроде:
public interface SecondImplementationLogicApplier {
public String deriveAddress(ComplexObject o);
}
public class LimitedImplementationLogicApplier implements FirstImplementationLogicApplier, SecondImplementationLogicApplier {
LogicApplier _applier;
public LimitedImplementationLogicApplier(LogicApplier applier) {
_applier = applier;
}
public String deriveFirstName(ComplexObject o) {
LogicResult res = _applier.applyLogic(o);
return res.firstName;
}
public String deriveFirstName(ComplexObject o) {
LogicResult res = _applier.applyLogic(o);
return res.address;
}
}