Подключение нескольких провайдеров

Рефакторинг для подключения нескольких провайдеров геоданных. Усовершенствование алгоритма выбора.

  • 00:00:13 - Постановка задачи
  • 00:00:51 - Классы для разных сервисов
  • 00:01:59 - Общий интерфейс
  • 00:02:59 - Работа с несколькими реализациями
  • 00:04:02 - Композитный объект
  • 00:05:05 - Тестирование цепочки
  • 00:06:16 - Реализация ChainLocator
  • 00:07:44 - Выбор наиболее точной позиции
  • 00:10:33 - Какие получились классы
  • 00:12:45 - Проблема ошибок сервисов
  • 00:14:23 - Последующие улучшения
Скрытый контент
Комментарии (10)
rodigy

Доброго времени суток. Такой вопрос не по теме, популярно и обосновано ли использование монад в php, пока не очень понимаю преимущества, повсеместно используются только исключения.

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

Это больше используется в функциональных языках. Их использование в PHP пока не популярно.

Ответить
Дмитрий

тест из видео не работает │ ArgumentCountError: Too few arguments to function GEO\Location::__construct(), 1 passed in \tests\ChainLocatorTest.php on line 20 and exactly 3 expected │ │ \src\Location.php:13 │ \tests\ChainLocatorTest.php:20

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

Поменяйте на new Location('Exptected', null, null)

Ответить
uhamurad

Дмитрий, как вам такая идея: дополнить класс Location методом getPrecision(), который будет возвращать точность данных объекта локации - 3, если известен город; 2, если известны только регион и страна; 1, если известна только страна? Тогда реализацию метода ChainLocator::locate() можно упростить.

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

Да, можно инкапсулировать точность в Location:

class Location
{
    ...

    public function getPrecision(): int
    {
        if (empty($this->city)) {
            return 3;
        }
        if (empty($this->region)) {
            return 2;
        }
        if (empty($this->country)) {
            return 1;
        }
        return 0;
    }
}

Это будет удобно в ChainLocator, но не будет использоваться в других.

Ответить
Ruslan

Лучшее изучение патернов, это полезный пример. Спасибо.

Ответить
Максим

Здравствуйте. Не могу найти код данного урока в репозитории deworker pro Не выкладывали данный урок в репозиторий github?

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

К этим скринкастам препозитория нет.

Ответить
Сидредин

В ChainLocator::locate() последний блок if должен быть таким вроде:

if ($result === null || $location->getRegion() !== null) {
    $result = $location;
}
Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

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

Google
GitHub
Yandex
MailRu