#c_sharp #шаблоны_проектирования #проектирование #инспекция_кода #solid
Есть код приложения в котором необходимо динамически определить тип файла (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("Ответы
Ответ 1
Я вижу следующие проблемы в вашем коде. Метод 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"); } }
Комментариев нет:
Отправить комментарий