Изящная обработка нескольких файловых механизмов ввода - PullRequest
2 голосов
/ 04 августа 2010

В настоящее время я выполняю рефакторинг библиотеки для внутреннего использования в 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 это не представляется возможным, и все это кажется достаточно распространенным случаем, каковы наилучшие методы решения этой проблемы? Вы видели какие-нибудь хорошие решения?

1 Ответ

2 голосов
/ 04 августа 2010

Это не так уж и плохо.Домен ограничен и не растет быстро.

Однако вы обнаружили проблему, в которой вам нужно найти «наименьший общий знаменатель» для входных данных.

Обычно это какой-тоInputStream.

Учитывая String, вы хотите открыть Stream и использовать Stream Loader.

Учитывая Stream, вы золотой.

Учитывая File, вы захотите открыть Stream и использовать Stream Loader.

Это должно охватывать почти все возможные базы, так как AFAIK вы можете сделатьInputStream практически ни из чего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...