Проблема
У меня есть большой класс (около 1500 LOC), и он использует разные «стратегии» для преобразования данных из одного объекта в другой. У меня есть представление этого класса:
public class FooService implements FooProcessing {
FooRequestTransformer fooRequestTransformer;
AnotherService anotherService;
InstanceVar1 iVar1;
InstanceVar2 iVar2;
...
Существует интерфейс (внешний по отношению к классу), который использует этот класс:
interface TransformerStrategy {
public FooRequest transform(FooResponse response);
}
Что передается в этот метод (внутри класса FooService):
private FooResponse getResponse(FooResponse fooResponse, TransformerStrategy transformerStrategy) {
FooRequest fooRequest = transformerStrategy.transform();
fooResponse = anotherService.bar(fooRequest);
return fooResponse;
}
Здесь находится точка входа, которая использует метод getResponse()
и анонимно создает TransformerStrategy
:
public List<Foo> getFooForSomeFlow1(Param1 param1, Param2 param2, ...){
FooResponse fooResponse = anotherService.baz(fooRequest);
TransformerStrategy myTransformerStrategy = new TransformerStrategy() {
public FooRequest transform(FooResponse fooResponse) {
fooRequestTransformer.transform(param1, param2, iVar1, iVar2)
}
}
FooResponse fooResponse = getResponse(fooResponse, myTransformerStrategy);
...//other code
}
Теперь проблема в следующем: есть несколько методов, таких как getFooForSomeFlow1()
(внутри FooService
), которые имеют собственную анонимную реализацию TransformerStrategy
и впоследствии вызывают getResponse()
. Как вы можете себе представить, это очень запутанно, а также сбивает с толку при отладке (т. е. вы входите в getResponse()
, а затем внезапно возвращаетесь в getFooForSomeFlow1()
)
Возможное решение
Одно из возможных решений (которое приходит на ум) состоит в том, чтобы организовать эти разные стратегии в класс «Поставщик», который каким-то образом сгруппирует их вместе. Как ни странно, этот класс уже включает класс Provider такого типа:
protected class StrategyProvider {
public ABCTransformerStrategy newABCTransformerStrategy(FooRequestTransformer transformer, Param1 param1, Param2 param2) {
return new ABCTransformerStrategy(transformer, param1, param2);
}
}
protected class ABCTransformerStategy implements TransformerStrategy {
protected FooRequestTransformer transformer;
protected Param1 param1;
protected Param2 param2;
//...constructor here
//...overridden transform method as above
}
В одном из комментариев говорится: «Преобразование анонимного класса во внутренний класс для целей тестирования». Однако они преобразовали только один из них, а остальные оставили. Получается, что они начали процесс рефакторинга и остановились посередине.
Итак, я подумал, что могу завершить процесс рефакторинга и переместить все анонимные классы во внутренние классы, а затем, наконец, переместить эти классы и StrategyProvider
во внешние классы. Проблема в том, что «преобразование анонимного во внутреннее» добавляет больше шаблонного кода (см. ABCTransformerStrategy
выше; я должен передать все данные в конструктор), и я не совсем уверен, сколько я выиграю, выполняя этот процесс рефакторинга.
У меня есть два вопроса:
- Должен ли я продолжать этот подход?
- Или есть другой шаблон проектирования, который я могу применить, который будет более подходящим и действительно упростит этот код?
Спасибо