-
Разбор архитектурных ошибок кода проверки пароля и создания сессии пользователя
Исходный код Что не так в исходном коде Самая крупная ошибка в этом коде заключается в хранении паролей в БД в открытом виде. Шифрование паролей — это стандарт, который обсуждается только в смысле способа, как лучше шифровать. Другая крупная ошибка — архитектуре сессии. При успешном логине запоминать нужно не пароль, а идентификатор сессии, который должен…
-
Пример рефакторинга «извлечение класса» из кода для работы с веб-формой
Исходный код Что не так в исходном коде Мне колоссально нравится, что знания о реализации каждого вида валидации спрятаны в отдельные функции — вот образец идеального разделения ответственностей. Однако лесенка из операторов if всё-таки выглядит устрашающе. Как мелкий недочёт можно отметить название функции: это не функция-команда, а функция-запрос, ей больше подойдёт название isFormValid. Более значимый недочёт: эта функция…
-
Рефакторинг адского сопоставления имени файла с регулярными выражениями
Исходный код Что не так в исходном коде Совершенно нечитаемая конструкция. После косметического форматирования хотя бы становится понятным смысл алгоритма. Тут мы пытаемся из строки, содержащей путь файла, извлечь расширение. Теперь можно проанализировать недочёты. Имя переменной filename выбрано не очень удачно, более точное название — filepath. Литералы регулярных выражений — это тоже магические литералы, и они должны быть…
-
Пример рефакторинга «извлечение функции» и улучшение имён переменных при инкременте 36-ричного числа
Исходный код Что не так в исходном коде Если в названии функции присутствует глагол, то он должен стоять на первом месте: надо что-то типа increaseLevel или incrementLevel. Однако с моей точки зрения эта функция не функция-команда, а функция-запрос, поэтому глагол здесь не особо нужен. Можно nextLevel. Алгоритм инкремента опирается не на фактическую длинну полученного кода, а на допущение, что…
-
Разбор ошибок в коде метода получения текста из заданного поля ввода
Исходный код Что не так в исходном коде Очень похоже на фрагмент лабораторной работы — так много здесь элементарных ошибок. После return нет смысла писать ещё и break. Вместо адского switch следует использовать массив указателей. Название параметра flag не годится — это не флаг, а номер поля. Название метода GetParam тоже не блещет — нужно прояснить, что это за параметр такой. Теория
-
Добавление рекурсии в алгоритм раскрытия родительских узлов дерева
Исходный код Что не так в исходном коде Рекурсивный по сути алгоритм реализован в виде линейного кода. Здесь также присутствует запах «завистливый метод», который слишком много знает о внутреннем устройстве узла дерева. Устранять его следует с помощью извлечения метода. Вариант рефакторинга исходного кода Извлечение процедуры сделало очень простым превращение алгоритма в рекурсивный. Теория
-
Пример рефакторинга «извлечение метода» при получении играющих команд
Исходный код Что не так в исходном коде Чувствуется явный запах завистливой функции. Справиться с ним можно снова с помощью рефакторингов «извлечение метода» и «перемещение метода». Запах относится к фрагменту $Bet->CBetType[$Bet->betTypeIndex]->CTeam: тут посторонний код «проникает» в секреты объекта $Bet, касающиеся получения доступа к репозиторию команд. Совершенно необходимо спрятать реализацию этого секретного знания в методе объекта $Bet. Есть также…
-
Пример инлайнового разделения ответственностей в коде рендеринга таблицы правильных ответов
Исходный код Что не так в исходном коде Запросы к БД внутри цикла Так делать ни в коем случае не стоит. Правильно сначала собрать все идентификаторы в массив, сделать запрос через where id in (…), а потом запустить цикл по полученным из БД строкам. Неудачный способ передачи массива через поля формы Существует более оптимальный способ: При…
-
Пример рефакторинга «извлечение метода» для алгоритма поиска точек в массиве
Исходный код Что не так в исходном коде Не очень понятно, что происходит в исходном коде, хотя и как происходит — тоже не сильно ясно. Навскидку здесь поиск двух специфических точек P1, P2 в массиве ArrPoint, причём этот поиск инкрементный и взаимозависимый (значения с предыдущей итерации влияют на следующую, P1 влияет на P2 и наоборот). Чтобы начать распутывать этот клубок, разберусь сначала с данными. Итак, на…
-
Пример рефакторинга «извлечение метода» при вычислении геометрии лучей
Исходный код Что не так в исходном коде Первое, что бросается в глаза — что ничего не понятно и всё смешано в кучу. Непонятен смысл условий typ == 4, mirror == 0, typ == 0 || typ == 2 || typ == 3. Непонятен смысл величин dd[0] и dd[0][“value”], beems[0], да и сами переменные mirror, Size_N, Size_M не очень понятны. Непонятен смысл вычислений, а особенно лихорадочных преобразований…