Задонатить и смотреть →
Открой безлимитный доступ к 100+ полезных скринкастов и получай скидки на все предстоящие мероприятия

Рефакторинг сеттеров и интерфейсов

Открываем новую рубрику практического рефакторинга. Сегодня у нас разбор кода компонента OAuth 2.0 Server. Сделаем форк репозитория и настроим локальный запуск тестов перед отправкой Pull Request.

Займёмся упрощением кода сервера. Найдём и устраним избыточность интерфейсов. Удалим неиспользуемый код. Увидим неудобство наличия сеттеров в сервисе и рассмотрим способы избавления от них. Избавимся от зависимости от конкретного класса путём внедрения интерфейса. И сделаем интерфейсы компактными.

  • 00:00:35 - Примут или нет Pull Request
  • 00:02:32 - Делаем Fork и клонируем
  • 00:04:25 - Подключение upstream
  • 00:07:12 - Локальный запуск
  • 00:10:12 - Рабочая версия PHP
  • 00:11:52 - Обзор компонента
  • 00:16:33 - Формирование ответов
  • 00:18:51 - Неудобство кода с сеттерами
  • 00:20:38 - Формирование редиректов
  • 00:22:16 - Избыточность интерфейса
  • 00:23:27 - Разделение интерфейсов
  • 00:25:39 - Устройство сервера ресурсов
  • 00:29:51 - Неиспользуемые параметры
  • 00:31:36 - Упрощение создания валидатора
  • 00:34:39 - Скрытая неожиданность
  • 00:36:45 - Альтернативы промежуточных сеттеров
  • 00:39:36 - Интерфейс для сеттера
  • 00:44:45 - Верить ли процентам тестового покрытия
  • 00:49:00 - Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (10)
Руслан

Спасибо!

Ответить
Владимир

Очень полезно, спасибо

Ответить
d.arnautov

Спасибо, полезный материал

Ответить
Андрей

Дмитрий, подскажите пожалуйста, а почему мы не можем из объекта доставать константу прямым путем, а только через метод геттер? Я от коллег слышал что это правильный подход, но не получил информации от том почему нельзя доставать напрямую.

Ответить
Дмитрий Елисеев

Здесь стоит разобраться, зачем одному объекту понадобилась чужая константа из другого объекта.

Можете привести пример?

Ответить
Андрей
$branch = BranchFactory::createBranch($authUser, $stepsCompletedField);

$this->branchName = $branch::BRANCH_NAME; 

Сказали, что так делать дурно, но я хотел услышать более конкретные аргументы.

Ответить
Дмитрий Елисеев

Выигрыша по сравнению с вызовом $branch->getName() здесь никакого нет.

А из неудобств это только добавляет лишнюю мороку с определением константы в интерфейсе и возможные проблемы с подменой значения константы для стаба или мока в юнит-тестах.

Ответить
Андрей

Спасибо

Ответить
kekc

было бы здорово запоминать выбранное разрешение и скорость...утомительно каждый раз переключать :-\

Ответить
gfdgdf

00:39 это и есть реализация принципа interface segregation из SOLID. спасибо большое

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu
  • 1Рефакторинг сеттеров и интерфейсов