@symfony_php

Страница 13 из 1418
Sergey
07.12.2016
22:14:42
ну скажем XML

на вход и выход

Sergey
07.12.2016
22:15:17
один класс клиент с тремя публичными методами и возможно больше одного интерфейса. У него будет зависимость которая собирает/разбирает xml

далее зависит от сложности задачи

Google
Sergey
07.12.2016
22:16:16
но в целом если у меня все это будет в одном классе у меня SRP не будет нарушен, так как причина для изменений у меня только одна - что-то поменялось в работе с внешним сервисом

Sergey
07.12.2016
22:16:34
чтобы более конкретно, давай возьмем какой-нибудь FedEx, это для доставки методы: получение размеров коробки на заданные параметры получение ценников на заданную коробку/коробки оформление заказа на доставку коробок

Sergey
07.12.2016
22:17:06
скорее всего да

во всяком случае не имея больше деталей я бы не стал дробить больше

Sergey
07.12.2016
22:17:33
а сам сервис будет заниматься еще отправкой запроса на апи?

или куда-то делегировать?

Sergey
07.12.2016
22:17:44
преждевременное дробление нужно для упрощения жизни в ситуациях, когда ты можешь предсказать изменения

а сам сервис будет заниматься еще отправкой запроса на апи?
зависит от того что ты подразмеваешь. Но да, вся работа с сетью будет зашита в еще один сервис

по поводу "предсказать изменения" - ну мол попробовать представить себе "какие более менее вероятные причины для изменений"

Sergey
07.12.2016
22:19:22
ок, в итоге мы на данный момент имеем класс с 3я публичными методами такими же как и у апи, интерфейсы на каждый метод 2 зависимости: - на парсинг и распарсинг запросов и ответов - на самого клиента который отправляет запросы по http

так?

Sergey
07.12.2016
22:19:27
скажем если ты используешь сервис гугла ты можешь не беспокоиться что они "внезапно" перейдут с tcp на http

Google
Sergey
07.12.2016
22:19:36
или наоборот

а если ты используешь какой-то APNS с наркоманским бинарным API поверх сокетов

Алексей
07.12.2016
22:19:56
Sergey
07.12.2016
22:20:06
я уже приводил пример почему эти суффиксы плохо

Sergey
07.12.2016
22:20:30
А что плохого в этих суффиксах?
это в кодстайле симфони прописано плохого - они не нужны)

Sergey
07.12.2016
22:20:49
ну то есть это не то что "плохо"....

это лишний информационный мусор

который не дает тебе никакой пользы

Sergey
07.12.2016
22:21:10
@fes0r возвращаясь к теме) как ты на все это дело будешь писать тесты?

Sergey
07.12.2016
22:21:24
а еще ты не можешь взять и заменить класс на интерфейс без грязи в дифе коммитов

Sergey
07.12.2016
22:21:40
у тебя есть дока по апи, примерные запросы и ответы, но тебе не желательно делать заказы на отправку через апи

Sergey
07.12.2016
22:21:53
@fes0r возвращаясь к теме) как ты на все это дело будешь писать тесты?
в смысле? работа с внешним миром у нас изолирована в отдельной фигне. Разбор/сбор xml - отдельная херня

все спокойно мокается

Sergey
07.12.2016
22:22:17
ну вот интересно что и в каком порядке ты будешь тестить

Sergey
07.12.2016
22:22:19
модуль полностью изолирован

при помощи моков я бы составил требования к интерфейсам сервисов зависимостей

и покрыл бы их тест кейсами исходя из нужд клиента (ну то есть кода который их юзает)

Sergey
07.12.2016
22:24:13
тесты этого класса будут выглядеть примерно так замокали сервис для парсинга и для клиента который отправляет запросы и на каждый метод - проверяем вызов сервиса для сборки запроса, вызов клиента и опять парсинга. все?

Google
Sergey
07.12.2016
22:24:23
класс же получается ничего кроме этого не делает?

Sergey
07.12.2016
22:24:49
ну этим занимается парсер ответа ведь?

Sergey
07.12.2016
22:24:59
ну нет, он просто избавляет от необходимости работы с XML

Алексей
07.12.2016
22:25:08
который не дает тебе никакой пользы
Хз. Лично мне это позволяет быстрее ориентироваться по иерархии файлов проекта и четко понимать, что "вот тут вот у меня завязка на интерфейс, а не реализацию" не переходя к другому файлу.

Sergey
07.12.2016
22:25:44
да и тебе должно быть пофиг это интерфейс или конкретная реализация

Алексей
07.12.2016
22:26:51
А что это тебе дает? Чем плохо если там будет класс а не интерфейс?
Тем что завязка на конкретную реализацию, а не абстракцию.

Sergey
07.12.2016
22:27:02
refactor -> rename (Catalog -> DoctrineCatalog) refactor -> extract interface (Catalog)

в diff коммита у тебя будет

1 изменение в файле

и один новый файл

а с суффиксами - либо втупую лепить интерфейсы где надо и где нет, либо потом страдать из-за больших diff-ов

late binding это важно конечно, но не тогда когда он тебе не нужен

Алексей
07.12.2016
22:29:54
Значит, видимо, мне не приходилось работать с достаточно сложными проектами, если я не боюсь длинных diff.

Sergey
07.12.2016
22:30:14
да просто код ревью неудобно делать

Google
Sergey
07.12.2016
22:30:28
Я и не говорил, что везде его пихать.
> Тем что завязка на конкретную реализацию, а не абстракцию.

говорил)

Алексей
07.12.2016
22:32:05
Я не это имел в виду, но ладно. Я с телефона в срач ударяться не хочу. Пока из минусов вижу только diff - и то только если класс на интерфейс поменяли.

Sergey
07.12.2016
22:32:30
еще ты фокусируешься на различиях - интерфейс и класс, хотя разницы нет

у класса есть интерфейс (или контракт который он обязан соблюдать) и без явного указания какого-то интерфейса

интерфейсы как сущность всего-лишь дают тебе возможность объявлять этот контракт вне контекста конкретной реализации

Алексей
07.12.2016
22:33:21
Я это понимаю.

Sergey
07.12.2016
22:33:31
но коду, который будет юзать эти зависимости должно быть глубоко на это насрать

Sergey
07.12.2016
22:33:53
ну у тебя будет либо Catalog, CatalogInterface либо CatalogImpl, Catalog либо CatalogDefault, Catalog но мне чет 1й вариант больше до сих пор нравится)

Sergey
07.12.2016
22:33:58
что что его волнует - это соблюдение некой штукой некого контракта

наприме штука которая что-то делает

Sergey
07.12.2016
22:34:36
подправил

Sergey
07.12.2016
22:35:08
почему не App\Service\Doctrine\ProductRepository implements Catalog

Taras
07.12.2016
22:35:13
Блин, как приятно на канале!))

Sergey
07.12.2016
22:35:49
ооок, MergerInterface

Sergey
07.12.2016
22:35:58
ээээм.... он же не тупо мерджит)

ну вот тебе приведу кейс из одного из своих проектов

у меня есть две апишки

Sergey
07.12.2016
22:36:39
там где много реализаций может быть - все просто)

Google
Sergey
07.12.2016
22:36:41
1-ая выдает статистику по продажам в ресторанам, вторая тоже выдает статистику, но уже другую по тем же рестаранам

Sergey
07.12.2016
22:36:43
а там где только 1?

Sergey
07.12.2016
22:37:00
а там где только 1?
но у тебя же есть название апишки?)

Sergey
07.12.2016
22:37:22
ну вот как с Merger, он 1 и хоть убейся)

Sergey
07.12.2016
22:37:30
короч в примере с двумя апишками у меня интерфейс будет что-то типа RestaurantReportProvider

пример с одной апишкой...

Sergey
07.12.2016
22:37:40
ок! UserService)

Sergey
07.12.2016
22:37:40
во

у меня на проекте есть чаты

для них я использую Layer.com

и у меня соответственно есть интерфейсы ConversationRegistry, BanList, BadgeProvider

Sergey
07.12.2016
22:38:29
там где разные адаптеры или несколько стратегий - ок, названия разные в любом случае будут

Sergey
07.12.2016
22:38:37
и класс LayerUsers, LayerConversation

ок! UserService)
что он делает?

Sergey
07.12.2016
22:39:40
пусть будет регать юзера и искать юзера? ок ладно скажешь это 2 интерфейса

Sergey
07.12.2016
22:39:51
прикол в том что спустя 3 месяца разработки мы скорее всего будем пилить свою реализацию этих чатов на ноде и мне придется потом переходить на другие чаты. А на них завязан солидный кусок системы

блин

не

просто UserRepository

и DoctrineUserRepository

у меня за регистрацию юзеров всегда отвечает один сервис - RegisterUserHandler

Страница 13 из 1418