В настоящее время я выполняю рефакторинг библиотеки для внутреннего использования в Java.
Библиотека получает XML-документ и возвращает структуру данных Result.
Учитывая, что:
- Для этой библиотеки есть два клиента, один из которых имеет XML-документ в качестве InputStream, а другой - путь к файлу в виде String.
- Класс, который используют клиенты, передается внутри библиотеки перед фактической обработкой
какая это лучшая архитектура для обработки файла?
В настоящее время это обрабатывается следующим образом (несвязанные детали опущены, имена классов изменены):
public class ILuvUsers {
public Result getResult(String path) {
return getResult(ElementsLoader.loadIntermediateType(path));
}
public Result getResult(InputStream stream) {
return getResult(ElementsLoader.loadIntermediateType(stream));
}
private Result getResult(IntermediateType itype) {
//... do stuff and return Result
}
}
public class ElementsLoader {
public static IntermediateType loadIntermediateType(final InputStream is) {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
return doSomethingWithDocument(doc);
}
public static IntermediateType loadIntermediateType(final String path) {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(path);
return doSomethingWithDocument(doc);
}
}
То, как мне нужно создавать перегрузки в каждом классе для InputStream и String, кажется мне запахом кода.
Что если на следующий день мне нужно будет поддерживать использование типа «Файл»?
Оптимально я хотел бы как-то автоматически поддерживать каждую перегрузку для методов разбора DocumentBuilder.
Поскольку в Java это не представляется возможным, и все это кажется достаточно распространенным случаем, каковы наилучшие методы решения этой проблемы? Вы видели какие-нибудь хорошие решения?