Предложение по рефакторингу класса клиента / оболочки API [closed]

Первый вопрос здесь, и я понимаю, что это очень открытый вопрос.

Несколько лет назад я принял клиент API на основе PHP, который используется для взаимодействия с API платформы управления сетью UniFi, предоставляемой Ubiquiti. Этот клиент использует cURL, со временем он значительно вырос благодаря моим вкладам и моим собственным усилиям и стал довольно популярным с более чем 33 КБ загрузок.

API, с которым общается этот клиент, частично является RESTful, но большая часть маршрутов — нет. В дополнение к этому, API официально не документирован, хотя я получал внутренние документы от поставщика за последние пару лет. Кроме того, существует несколько незначительных вариаций API (немного отличающиеся структуры URL-адресов и методы аутентификации), которые клиент может идентифицировать и соответственно обрабатывать. Вот пример из основного login() функция:

        /**
         * first we check whether we have a "regular" controller or one based on UniFi OS,
         * prepare cURL and options
         */
        if (!($ch = $this->get_curl_resource())) {
            return false;
        }

        $curl_options = [
            CURLOPT_HEADER => true,
            CURLOPT_POST   => true,
            CURLOPT_NOBODY => true,
            CURLOPT_URL    => $this->baseurl . "https://codereview.stackexchange.com/",
        ];

        curl_setopt_array($ch, $curl_options);

        /**
         * execute the cURL request and get the HTTP response code
         */
        curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if (curl_errno($ch)) {
            trigger_error('cURL error: ' . curl_error($ch));
        }

        /**
         * we now proceed with the actual login
         */
        $curl_options = [
            CURLOPT_NOBODY     => false,
            CURLOPT_POSTFIELDS => json_encode(['username' => $this->user, 'password' => $this->password]),
            CURLOPT_HTTPHEADER => ['content-type: application/json'],
            CURLOPT_REFERER    => $this->baseurl . '/login',
            CURLOPT_URL        => $this->baseurl . '/api/login'
        ];

        /**
         * specific to UniFi OS-based controllers
         */
        if ($http_code === 200) {
            $this->is_unifi_os         = true;
            $curl_options[CURLOPT_URL] = $this->baseurl . '/api/auth/login';
        }

Репо можно найти здесь: https://github.com/Art-of-WiFi/UniFi-API-client

Меня беспокоит то, что размер класса вырос до более чем 3900 строк: https://github.com/Art-of-WiFi/UniFi-API-client/blob/master/src/Client.php

В дополнение к этому, я бы хотел заменить использование trigger_error() с Исключениями для улучшенной обработки ошибок.

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

Также приветствуются другие отзывы.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *