В настоящее время я являюсь частью проекта, в котором есть такой интерфейс:
public interface RepositoryOperation {
public OperationResult execute(Map<RepOpParam, Object> params);
}
В этом интерфейсе около 100 реализаторов.
Чтобы вызвать исполнителя, нужно выполнитьследующее:
final Map<RepOpParam, Object> opParams = new HashMap<RepOpParam, Object>();
opParams.put(ParamName.NAME1, val1);
opParams.put(ParamName.NAME2, val2);
Теперь я думаю, что явно что-то не так с общим объявлением <Something, Object>
.
В настоящее время это заставляет вызывающего OperationImpl
фактическиПрочитайте код операции, чтобы узнать, как построить карту аргументов.(и это даже не худшая из проблем, но я не хочу приводить их все, поскольку они довольно очевидны)
После некоторого обсуждения мне удалось убедить моих коллег позволить мне провести некоторый рефакторинг.
Мне кажется, что самым простым «исправлением» было бы изменение интерфейса следующим образом:
public interface RepositoryOperation {
public OperationResult execute(OperationParam param);
}
После того, как все конкретные операции определят (расширят) свой собственный OperationParam и необходимыйаргументы будут видны всем.(что является «нормальным способом» делать подобные вещи, ИМХО)
Итак, как я вижу, поскольку реализации интерфейса довольно много, у меня есть несколько вариантов:
Попробуйте изменить интерфейс и переписать все вызовы Операции, чтобы использовать объекты вместо карт.Это кажется самым чистым, но я думаю, что, поскольку операций много, на практике может быть слишком много работы.(Вероятно, ~ 2 недели с тестами)
Добавьте дополнительный интерфейс к интерфейсу, например, так:
public interface RepositoryOperation {
public OperationResult execute(Map<String, Object> params);
public OperationResult execute(OperationParam params);
}
и исправьте вызовы карты, когда я сталкиваюсь с ними во времяреализация функциональности.
Жить с этим (пожалуйста, нет!).
Так что мой вопрос.
Кто-нибудь видитлучший подход для «исправления» карт, и если вы это сделаете, вы бы исправили их методом 1 или 2 или не исправили бы их вообще.
РЕДАКТИРОВАТЬ: Спасибо за отличные ответы.Я бы принял ответы как Макса, так и Ридуйделя, если бы мог, но так как я не могу, я склоняюсь немного больше к ответам Ридуиделя.