Есть код приложения в котором необходимо динамически определить тип файла (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");
}
}
Комментариев нет:
Отправить комментарий