Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076

Интерфейс для сидера?

15.09.2021, 22:14. Показов 1625. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть сидер, работает
PHP
1
2
3
4
5
6
7
8
9
private function seedEntities(string $apiAddress)
    {
        $request = json_decode(file_get_contents($apiAddress, true));
        $entitiesToSeed = $request->results;
        addEntities($entitiesToSeed);
        if ($request->next) {
            $this->seedEntities($request->next);
        }
    }
Как можно обеспечить в случае необходимости стягивание данных с другого источника(не важно с какого источника, может и вообще не в формате апи). Т.е. нужно сделать интерфейс и я не очень представляю, как это все завернуть в интерфейс. Хотя в одном методе и получение данных из вне и запись в БД - уже наверное не очень хорошо, но как их разделить? Проблема - в порционности данных, а именно, что нужно проверять, если ли еще данные. И неизвестно, будет ли в другом источнике также разбиение на порции, и как оно будет организовано.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2021, 22:14
Ответы с готовыми решениями:

Как передать переменную из сидера в factory?
У меня в сидере есть цикл: public function run() { for ($i = 0; $i < 100; ++$i) { ...

Интерфейс Comparable, Интерфейс Comparator, Интерфейс List
Добрый день, прошу подсказать с решением задачи. Или натолкнуть в какую сторону нужно думать. Не могу освоить второй пункт задачи. 1....

Программа/интерфейс для работы с XML-шлюзом на сайте для пользователей
Добрый день, вопрос к знающим. Значит есть доступ к XML-шлюзу туроператора(туры, даты, отели, экскурсии). Подскажите что требуется (может...

5
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
16.09.2021, 08:50
Цитата Сообщение от СергейСереб Посмотреть сообщение
нужно сделать интерфейс и я не очень представляю, как это все завернуть в интерфейс
Делаете форму, в которой у вас поле "адрес сайта" и кнопка "Стянуть".
При нажатии на кнопку идёт вызов вашего метода и из поля "адрес сайта" вставляется в него URL.

Цитата Сообщение от СергейСереб Посмотреть сообщение
Хотя в одном методе и получение данных из вне и запись в БД - уже наверное не очень хорошо, но как их разделить?
Дело вкуса, конечно хорошо каждую мини-программу выполнять в отдельных методах. Для чего? Для того, чтобы можно было использовать конкретный код во-1 в разных местах и много раз, во-2 у вас может поменяться логика и последовательность. Проще ведь поменять методы местами, чем весь код перелопатить через пару месяцев не работы с ним.

Цитата Сообщение от СергейСереб Посмотреть сообщение
Проблема - в порционности данных, а именно, что нужно проверять, если ли еще данные. И неизвестно, будет ли в другом источнике также разбиение на порции, и как оно будет организовано.
Тут не подскажу. Если парсите какие-то конкретные сайты, то лучше писать для каждого отдельный парсер. Так проще будет контролировать с какого сайта у вас что-то не забирается и решать проблему в меньшем размере.
0
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
16.09.2021, 09:28  [ТС]
Цитата Сообщение от Миушник Посмотреть сообщение
Делаете форму, в которой у вас поле "адрес сайта" и кнопка "Стянуть".
При нажатии на кнопку идёт вызов вашего метода и из поля "адрес сайта" вставляется в него URL
Речь не о пользовательском интерфейсе а о реализации кода. Интерфейс - чтобы можно было используя интерфейс, можно было бы переключаться между разными реализациями получения данных.

Я не зря открывал тему в разделе ларавеля, т.к. и проект на ларавеле и где-то краем глаза видел, что подобное можно реализовать с помощью artisan команд. Правда, хорошая ли и это идея, да и пока не в курсе, как с этим работать.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
18.09.2021, 05:41
Лучший ответ Сообщение было отмечено СергейСереб как решение

Решение

СергейСереб, Мне кажется вы хотите придумать интерфейс ради интерфейса.
Я в ларавеле не силен. Для абстрагировании от получения данных можно использовать генераторы yield выкидывая по одной записи и получая через foreach. Так же в Ларавеле можно использовать LazyCollection

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class DataSource
{
    private $apiAddress;
 
    public function __construct($apiAddress)
    {
        $this->apiAddress = $apiAddress;
    }
 
    public function getCollection(): LazyCollection
    {
        return LazyCollection::make(function () {
            $href = $this->apiAddress;
 
            while ($href) {
                $request = json_decode(file_get_contents($href, true));
 
                foreach($request->results as $item) {
                    yield $item;            
                }
 
                $href = $request->next ?? null;
            }
        });
 
    }
}
0
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
18.09.2021, 21:55  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Мне кажется вы хотите придумать интерфейс ради интерфейса.
Я не знаю, насколько такое часто может быть востребовано но вроде задача вполне прозрачная - сегодня получаем данные с апи, через месяц с БД, еще через месяц опять с апи. Не переписывать же код каждый раз.
Практически попробовал на генераторах - да, обошлось без интерфейсов, работает, даже вроде как относительно быстро. Спасибо за идею. Про ленивые коллекции поверхностно читал, но руки еще не дошли изучить.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
19.09.2021, 01:15
СергейСереб, Любую службу в любой момент можно переделать на интерфейс.

PHP
1
2
3
4
interface DataSource
{
    public function getCollection(): LazyCollection;
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Seeder
{
    private $source;
 
    public function __construct(DataSource $source)
    {
        $this->source = $source;
    }
    
    public function seed()
    {
        $collection  = $this->source->getCollection();
        
        // ...
        
    }
}
Есть такие принципы как YAGNI и KISS. Задумываться наперед "а что если..." это гиблое дело. Будете только постоянно закапываться в простейших модулях, усложняя архитектуру. Которую придется все это время поддерживать, а к тому моменту когда появится второй источник все еще 10 раз поменяется. Если что всегда есть такой инструмент, как рефакторинг.

В книге "Чистая архитектура" Роберта Мартина есть отдельная тема о проведении границ. И приводился пример, когда бралась простая программа, состоящую из 200 строчек и раздували до огромных размеров, проводя все-возможные границы, которые только придут в голову)

Куда более важно отразить код как он работает на данный момент, чтоб любой программист мог в нем разобраться и внести изменение. Всегда нужно помнить о целесообразности. Вот вы сейчас допустим тратите кучу времени, когда может действительно будет проще заменять сам сидер.

Мое мнение, что интерфейсы нужно добавлять только когда есть такая необходимость, т.е. появляется вторая реализация. Службы нужно проектировать таким образом, чтоб внутренняя логика не вытекала наружу, тогда не будет проблемы с заменой класса интерфейсом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.09.2021, 01:15
Помогаю со студенческими работами здесь

Описать интерфейс ILogWriter с методами. Создать классы реализующие этот интерфейс.
Описать интерфейс ILogWriter с методами void LogInfo(string message) void LogWarning(string message) void LogError(string message) ...

Как на диаграмме классов (UML) обозначить интерфейс, вложенный в интерфейс
Есть интерфейс public interface LoginInteractor { interface OnLoginFinishedListener { void onUsernameError(); ...

Iptables, правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс eth0
Добрый день, подскажите, пожалуйста, как Iptables написать правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс...

Определить и использовать интерфейс IFigure (Фигура). В интерфейс включить методы вычисления площади
Реализовать иерархию классов из индивидуального задания. Определить и использовать интерфейс IFigure (Фигура). В интерфейс включить методы...

Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс
Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс. Т.е. что-то вроде этого: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru