Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Принцип открытости/закрытости при динамическом определении типа файла

Есть код приложения в котором необходимо динамически определить тип файла (HTML или TXT) по содержимому и в зависимости от полученного типа файла вызвать соответствующий алгоритм обработки.
interface IFileType { void Process(); } class HtmlFile : IFileType { public void Process() { Console.WriteLine("HTML"); } } class TxtFile : IFileType { public void Process() { Console.WriteLine("TXT"); } } class FileTypeHandler { public static IFileType Define(string fileContent) { var file = fileContent.IndexOf("class Program { static void Main(string[] args) { FileProcessor fileProcessor = new FileProcessor(); fileProcessor.ProcessFile(@"d:\index.html"); Console.ReadKey(); } }
Вывод:
HTML
Все работает как мне надо. Меня интересует насколько гибок мой код к появлению в будущем новых типов файлов, к примеру JSON. Ведь с появлением нового класса реализующего интерфейс IFileType, также изменится алгоритм определения типа по содержимому в классе FileTypeHandler.
Все ли я правильно спроектировал, касательно принципа открытости/закрытости?


Ответ

Я вижу следующие проблемы в вашем коде.
Метод FileTypeHandler содержит логику определения, для всех форматов. На данном этапе это не страшно, т.к. их не много, но если их количество будет увеличиваться, метод станет запутанный и тяжел в расширении.
Рекомендую, создать сущности, для каждого формата, и в них реализовывать определение. Это позволит избежать запутанности и облегчит добавление новых.
Приведу код, как я бы в данной ситуации реализовал. В нем есть небольшие упрощения. Написал, на java, но думаю вы разберетесь.
enum FormatTypes { TXT("txt", new TxtDetector()), HTML("html", new HtmlDetector());
public final String name; private final Detector detector;
FormatTypes(String name, Detector detector) { this.name = name; this.detector = detector; } }
interface Detector { boolean isCorrectType(String fileName, String content); }
class TxtDetector implements Detector { }
class HtmlDetector implements Detector { }
class DetectorHandler { public static String getType(String fileName) { String content = //чтение содержимого
for (FormatTypes types : FormatTypes.values()) if (types.detector.isCorrectType(fileName, content)) //просто возвращает название формата, //можно при необходимости в FormatTypes положить какую то логику return types.name;
throw new IllegalArgumentException("type is not supported"); } }

Комментариев нет:

Отправить комментарий