Вопрос проверяет умение проектировать систему, которая принимает разные форматы файлов с разной структурой.
Лучше всего создать абстракцию над обработкой файлов: единый интерфейс парсера и отдельные классы для каждого формата. При импорте определяется поставщик (или формат) файла и выбирается соответствующая стратегия обработки. Это может быть паттерн «Стратегия» или «Фабрика». Система становится расширяемой: добавление нового поставщика — это добавление нового обработчика, без изменения остального кода.
Когда разные поставщики присылают Excel-файлы разных структур (разные колонки, порядок, названия), нужен гибкий слой абстракции.
Если код парсера ожидает конкретные колонки:
[A] name
[B] email
[C] amount
Но поставщик B присылает:
[1] fio
[2] summa
[3] contact_email
— обычный парсер сломается.
Стратегия — выделение алгоритмов в отдельные классы и выбор нужного в рантайме.
Создаётся интерфейс:
php
interface ExcelFormatParser {
public function parseRow(array $row): array;
}
php
class SupplierAParser implements ExcelFormatParser {
public function parseRow(array $row): array {
return [
'name' => $row['A'],
'email' => $row['B'],
'amount' => (float)$row['C'],
];
}
}
class SupplierBParser implements ExcelFormatParser {
public function parseRow(array $row): array {
return [
'name' => $row['fio'],
'email' => $row['contact_email'],
'amount' => (float)$row['summa'],
];
}
}
php
class ParserFactory {
public static function forSupplier(string $supplier): ExcelFormatParser {
return match ($supplier) {
'A' => new SupplierAParser(),
'B' => new SupplierBParser(),
default => throw new Exception("Unknown supplier")
};
}
}
При обработке больших файлов:
определяется поставщик
выбирается парсер
каждая строка подаётся на вход парсеру
результат отправляется в батч-обработку
Можно вынести схему в конфиг:
yaml
supplierA:
name: A
email: B
amount: C
И использовать одну универсальную реализацию.
Но для более сложных кейсов лучше отдельные классы.
легко расширяем
каждый формат инкапсулирован
нет условных конструкций в коде
легко тестировать
изменения не ломают другие форматы
Поддержка множества Excel-форматов достигается через стратегию парсинга: одна абстракция + множество реализаций. Это обеспечивает расширяемость и стабильность импорта.