Работали ли вы с Legacy-кодом?

Ответ

Да, много работал с Legacy-кодом. Основные сложности, с которыми сталкивался:

  1. Отсутствие тестов — код без unit-тестов, что затрудняет рефакторинг
  2. Устаревшие зависимости — старые версии фреймворков и библиотек с известными уязвимостями
  3. Нарушение принципов SOLID — большие "божественные" классы, сильные связи между модулями
  4. Устаревшие подходы к безопасности — 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)

Ответ 18+ 🔞

А, блядь, Legacy-код! Ну это же просто ёперный театр какой-то, я тебе скажу. С этим говном работал до овердохуища, так что могу рассказать, на какие грабли обычно наступаешь, пока не набьёшь себе все шишки.

Смотри, основные засады, которые тебя там ждут — это просто пиздец рулю.

Первое — тестов нихуя нет. Вообще. Ноль. Пустота. Ты пытаешься что-то поменять, а у тебя волнение ебать — сломаешь что-нибудь или нет? Как будто идёшь по минному полю в полной темноте. Доверия к этому коду — ноль ебать.

Второе — зависимости старые, как говно мамонта. Какие-то библиотеки, которые последний раз обновлялись, когда Путин ещё президентом не был. Уязвимости известные, дыры размером с чёрную дыру, но трогать страшно — всё держится на соплях и изоленте.

Третье — про SOLID там нихуя не слышали. Классы — это такие монстры на тысячу строк, которые знают всё на свете и делают всё подряд. Связи между модулями — как в борделе на раздаче: всё со всем перепихано, и кто от кого зависит — хуй поймёшь.

Четвёртое — безопасность на уровне детского сада. SQL-инъекции цветут махровым цветом, данные не валидируются — в общем, рай для хакера и ад для того, кто это потом чинит.

А вот как я с этим обычно воюю:

// Было (пиздец рулю, legacy-подход):
$userId = $_GET['user_id']; // О, бля, прям из GET, без всяких там...
$query = "SELECT * FROM users WHERE id = $userId"; // Да, ёпта, строкой, как в 2002-м году
$result = mysql_query($query); // mysql_*, Карл! Это же просто ядрёна вошь!

// Стало (после того, как я это всё впендюрил):
$userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT);
if (!$userId) {
    throw new InvalidArgumentException('Invalid user ID'); // Чувак, иди нахуй со своим кривым ID
}

$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :userId");
$stmt->execute([':userId' => $userId]);
$user = $stmt->fetch();

Ключевые фишки, которые реально работают:

— Сначала, бля, тесты накидываю на то, что уже есть. Хоть какие-то. Чтобы было хоть какое-то понимание, что я ничего не сломал. Иначе потом объяснять, почему всё легло — это отдельный пиздец.

Рефакторю по чуть-чуть. Не пытаюсь всё переписать за раз — это путь в никуда. Шаг за шагом, модуль за модулем. Иначе сам от себя охуеешь от объёма работы.

Статические анализаторы — мои лучшие друзья. PHPStan, Psalm — они как старшие товарищи, которые тычут тебя мордой в твоё же дерьмо. Неприятно, но полезно.

Документирую всё, что делаю. И создаю эту самую "карту долгов" — где что плохо, что нужно переписать в первую очередь, а что может подождать. Иначе через месяц сам забудешь, что и где чинил.

В общем, работа с Legacy-кодом — это как разминирование старой бомбы: одно неверное движение, и будет вам хиросима. Но если делать всё с умом и без паники — можно и не взорваться.