#java #design-patterns
#java #шаблоны проектирования
Вопрос:
Я кодирую утилиту синтаксического анализа каталогов, которая сканирует разные каталоги на наличие файлов разного типа.
Теперь простая реализация побуждает меня сделать следующее. Имейте список каталогов для анализа, перебирайте их и передавайте его методу, который фактически выполняет файловый ввод-вывод и другую логику и возвращает результат.
List<Dir> dirList;
//loop over the list and call parseDirecotry()
parseDirectory(Dir dirToParse){
//do file io
if (filename.matches("pattern"){
//proceed)
}
}
Каждый сканируемый каталог требует, чтобы я отфильтровывал определенные файлы. Итак, теперь
для certails dir шаблон сопоставления будет меняться, теперь я мог бы продолжать добавлять шаблон сопоставления на основе типа каталога в логике if else.
Или
Я мог бы извлечь шаблон, сделать его частью объекта Dir, сделать его абстрактным, чтобы конкретные реализации каталогов содержали конкретный шаблон соответствия.
Таким образом, мне не нужно прикасаться к методу parseDirectory каждый раз, когда у меня появляется новый каталог для сканирования.
Вопрос: есть ли какой-то шаблон проектирования, который я мог бы использовать здесь? Что вы думаете о приведенной выше программе для интерфейса и как вы думаете, имеет ли смысл переместить метод parseDirectory() также в класс абстрактного каталога?
Комментарии:
1. содержит ли каждый каталог разные форматы файлов. Пример: Каталог 1 содержит: .doc, .xls и т. Д., Каталог 2: .doc, .pdf, .jpg и т. Д. ?
2. @saury: скорее всего, другая номенклатура для имен файлов, чем расширений..
Ответ №1:
Я не думаю, что наличие шаблона поиска имени файла как части Dir
является хорошим дизайном. Однако FileSearch
объект, который инкапсулирует Dir
и Pattern
может быть хорошим дизайном.
Еще одна вещь, о которой стоит подумать, это то, что Apache Commons FileUtils
предоставляет такую функциональность в listFiles
методе, используя IOFileFilter
такие экземпляры, как RegexFileFilter
. Вы могли бы создать класс, который переносит an IOFileFilter
для Dir
и a RegexFileFilter
для имени файла.
Комментарии:
1. 1 в подходе
FileUtils
listFiles(). Они решили проблему, и их решение проверено на практике. Используйте его и двигайтесь дальше 🙂2. @John B: Это имеет смысл, IOFileFilter удаляет дополнительное условие if, и если я соединю его с предложением Сайри, фабрика будет решать, какую реализацию создавать, реализация будет знать, какой RegexFileFilter использовать.
Ответ №2:
Хорошо, я предложу свое решение
1) Создайте интерфейс с именем IFileProcessor, имеющий метод processFile 2) Создайте одноэлементные классы, специфичные для типов документов, реализующих IFileProcessor. Таким образом, классами будут DocFileProcessor, XLSFileProcessor и т. Д., И каждый класс будет иметь свою собственную конкретную реализацию processFile API. 3) Создайте фабричный класс, скажем, FileProcessorFactory. У него должен быть вызван API IFileProcessor getFileProcessor(String fileTypeExtension)
. Этот API будет принимать расширение файла в качестве входных данных и возвращать DocFileProcessor, XLSFileProcessor и т.д. Для ввода doc, xls и т.д. 4) В вашем цикле вызовите getFileProcessor из FileProcessorFactory, вводя его. Теперь вызовите processFile для возвращенного экземпляра.
Наличие такого дизайна отделяет логику if-else от фактора, позволяя вашей логике оставаться независимой от типов файлов.
Комментарии:
1. Спасибо за предложение и несколько изменений, с которыми я, вероятно, мог бы работать с этим дизайном. например, используйте реализацию по умолчанию для processFile() в абстрактном классе FileProcesser, оберните dir и RegexFileFilter в это также (как предложил @John B), укажите в конкретных реализациях RegexFileFilter .
Ответ №3:
Несколько моментов:
- Я не буду предлагать использовать шаблон как часть каталога.
- Шаблоны должны быть частью объекта, который реализует некоторый интерфейс, например: IParser, у которого есть метод, который принимает объект каталога и выполняет этот синтаксический анализ по мере необходимости.
- У вас могут быть разные реализации IParser для расширения, длины файла и т.д.