Павел
А в остальном все решается и без излишней кривоты с должными знаниями
The Ant
Не думаю, что % любящих подрочиться с каким-нибудь говном выше нормальных адекватных людей, которые ценят свои нервы и время.
The Ant
Ну, т.е. потратить неделю чтобы допилить срань это не дрочево? )
The Ant
как по мне самое настоящее
Павел
Ну, т.е. потратить неделю чтобы допилить срань это не дрочево? )
Почему неделю? Если бы ты захотел, уже написал быстрее чем тут обсуждаем
Павел
Мы обсждаем отсутсвие сахара на 50 строк кода
The Ant
нет, я бы окунулся с головой в бочку с дерьмомсолидом и начал хуячить никому не нужные абстракции *fix
The Ant
ради абстракций, симфони вей же
Павел
Даже тут максимум 2 - входной файл , да и все наверное, т.е. даже 1. Можно его разделить на два вход/ выход. конец
Павел
Не делай простое сложным. А сложное делай простым. Изи вей )
The Ant
Даже тут максимум 2 - входной файл , да и все наверное, т.е. даже 1. Можно его разделить на два вход/ выход. конец
чтобы вышло универсально и опционально, мне много где надо файлики качать. тут нада скармливать пачку урлов, получать на выходе файлы. попутно параллелить пачками, если файлов больше 20, например(опционально). Обрабатывать ошибки, логировать.
The Ant
да тут точно на неделю
Павел
да тут точно на неделю
Тебе виднее сколько тебе надо и на какую задачу)
Павел
@theantt ну а если уж писать нормально, то тебе в любом случае нужна будет абстракция над либой. А что будет внутри (газл, симфа, курл ...) уже 100% насрать.
The Ant
Нет, если я всегда юзаю газл, то абстранции над ним мне не нужны
Павел
Нет, если я всегда юзаю газл, то абстранции над ним мне не нужны
Ну если тебе ок с таким мнением, че спорить ) Потом газл отваливается по той или иной причине и ты сосешь большую бибу, а если с абстракцией - то маленькую
The Ant
тут вопрос вероятностей всего-лишь, если пакет меняется раз в пятилетку, то можно забить
Павел
Твой предметный код не должен работать с газлами, другими клиентами. Он должен работать с каким нить FileDownloader или с HttpClient В целом можно юзать и их интерфейсы основные, потом в случае чего в composer прописать на свою реализацию через psr4
The Ant
на всякий случай писать абстракции для достаточно надежных пакетов такое себе
The Ant
по сути ты предлагаешь обернуть каждый сторонний пакет в свою обертку
Павел
The Ant
и как часто вы меняете пакеты на альтернативные или заменяете своей реализацией? есть метрики?
Павел
Ну по крайней мере что не сильно жжет по попке
Павел
и как часто вы меняете пакеты на альтернативные или заменяете своей реализацией? есть метрики?
Да это банально удобно даже для того, чтобы мокать, чтобы работать с своими исключениями
Павел
Зачем мне в коде ловить везде и обрабатывать какой то guzzleException ?
The Ant
сорян, но у меня нет времени думать над своими абстракциями, чтобы предусмотреть возможность сменя пакета и адаптацию под новый возможной
Павел
У каждого свой путь джедая)
The Ant
взять к примеру газл, чтобы написать к нему адекватную обертку с применением той же опции синк, я должен заглянуть в будущее, чтобы узнать, если что-то подобное у еще не вышедшего пакета?
The Ant
как например вот у симфоневского, у которого даже близко ничего такого нет
The Ant
заодно посмотреть возможные варианты из других пакетов, чтобы безболезненно сделать опции в своем адаптере
Павел
Ты должен смотреть, какой функционал нужен твоему коду, какие нужны ответы, с чем ты будешь работать
The Ant
крч такое себе
The Ant
Ты должен смотреть, какой функционал нужен твоему коду, какие нужны ответы, с чем ты будешь работать
потому что у хттп клиента могут быть разные опции\параметры, и мы должны учитывать это в возможных реализациях, чтобы не трогать нашу обертку
Павел
Пишешь себе эту асбтракцию, например AsyncFileDownloader. Потом: какие ошибки могут быть и важны для меня? Какие входы, выходы. Что ты будешь юзать
Павел
И потом пишешь под это клент на газле, симфе
The Ant
т.е. под каждое действие у меня будет свой клиент?
Павел
Павел
т.е. под каждое действие у меня будет свой клиент?
Зависит что тебе надо , если у тебя обычный запрос просто обычный request(.. . .. .) как у газла, этого хватит
The Ant
Зависит что тебе надо , если у тебя обычный запрос просто обычный request(.. . .. .) как у газла, этого хватит
у обычного запроса разные параметры, у газла, у симфы, у уии, какого там еще есть.
The Ant
т.е. обычный реквест мы обязаны стандартизировать
Павел
Твоему коду это важно? Который этот клюент (твой интерфейс) юзает? нет
Павел
Я возможно некорректно объясняю )
Павел
НУ для примера. Не говорю что это правильный путь
Павел
Коду который юзает этот клиент насрать, что там внутри: газл, симфони, курл, мок
Павел
Response тоже мой
The Ant
т.е. ты мапишь респонс от адаптера на свой? )
Павел
т.е. ты мапишь респонс от адаптера на свой? )
Да, это дает мне отличную возможность адекватно мокать, в случае тестировании логики
Павел
А не мокать газл билдер, газл респонс и прочую цепочку
The Ant
т.е. смотри, для использования хттп клиента ты делаешь адаптер со своим интерфейсом, где стандартизируешь опции\параметры под запросы.
The Ant
попутно пилишь свои респонс\реквесты, которые тоже адаптеры
Павел
попутно пилишь свои респонс\реквесты, которые тоже адаптеры
В данном случае реквеста нет, но мысль верная
The Ant
затем добавляешь свои исключения, какие-то сервисные штуки по типу промисов газла(или как ты там делаешь это?)
The Ant
т.е. по сути пишешь полный прокси клиент
Павел
затем добавляешь свои исключения, какие-то сервисные штуки по типу промисов газла(или как ты там делаешь это?)
Ну я асинк не делал, но мысль верная да. В респонсе я храню необходимое нужное для моего кода
The Ant
ок
Павел
т.е. по сути пишешь полный прокси клиент
Я пишу интерфейс минимально необходимый для моего кода. А не все пытаюсь реализовать
The Ant
допустим тебе надо поменять с газзла на симфу, где вообще всё по другому устроено, чо делать будешь? )
The Ant
другие опции. другие методы, другие исключения
Павел
У меня абстракция которой насрать на клиент
The Ant
ну вот синк этот сраный, придется же реализовывать, а если не влезет?
Павел
Есть AsyncDownloadManagerInterface. У него есть входной параметр File($url, $pathToLocal). У него допустим есть методы isSuccess():bool , getError():?string - ну это прям вообще на пофиг пример. Эти методы будут вызываться после выполнения startDownload Есть метод AsyncDownloadManager->startDownload(File ...$files) Например нашему коду который юзает AsyncDownloadManagerInterface важны какие то два экзепшена, мы их тоже пишем SuperErrorException, ClientConnectionException Есть SymfonyDownloadManager Есть GuzzleDownloadManager У нас что есть проблемы как вытащить из File данные и применить в любом из них? Есть проблемы как их экзепшен преобразовать в SuperErrorException?
Павел
Меняй туда сюда и в ус не дуй, пиши третий , пиши мок. Входные выходные данные у всех одинаковые - то главные.
The Ant
свой адаптер на полчища клиентов, или заюзаешь контретный?
Павел
это понятно, вопрос в том, что ты заинжектишь в каччестве клиента в AsyncDownloadManager
AsyncDownloadManager это интерфейс. В нем уже конкретная работа с либой без адаптера
The Ant
The Ant
я думал ты предлагаешь сделать адаптер под сраный газл и юзать его во всех подобных сервисах
Павел
я думал ты предлагаешь сделать адаптер под сраный газл и юзать его во всех подобных сервисах
Ну смотри) этот кейс просто узкий. Я выше скидывал пример httpClient для обычных запросов. Т.е. над газлом обертка есть
Павел
Чтобы мы во всем нашем коде, не юзали газлвский клиент 20 раз, а юзали например 2 раза, а 18 наш интерфейс.
Павел
Например я пишу клиент для доступа к какому любо апи
Павел
Я в нем работаю не с гащлом а скаким нить своим httpClient