Ответ
Да, много работал с Legacy-кодом. Основные сложности, с которыми сталкивался:
- Отсутствие тестов — код без unit-тестов, что затрудняет рефакторинг
- Устаревшие зависимости — старые версии фреймворков и библиотек с известными уязвимостями
- Нарушение принципов SOLID — большие "божественные" классы, сильные связи между модулями
- Устаревшие подходы к безопасности — SQL-инъекции, отсутствие валидации входных данных
Мой подход к работе с Legacy-кодом:
// Пример рефакторинга уязвимого кода
// Было (legacy-подход):
$userId = $_GET['user_id'];
$query = "SELECT * FROM users WHERE id = $userId";
$result = mysql_query($query);
// Стало (после рефакторинга):
$userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT);
if (!$userId) {
throw new InvalidArgumentException('Invalid user ID');
}
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :userId");
$stmt->execute([':userId' => $userId]);
$user = $stmt->fetch();
Ключевые практики:
- Сначала добавляю тесты для существующей функциональности
- Использую постепенный рефакторинг ("шаг за шагом")
- Внедряю статические анализаторы (PHPStan, Psalm)
- Документирую все изменения и создаю "карту долгов" (technical debt map)