#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");
}
}
Комментариев нет:
Отправить комментарий