Aleksandr
Никто так и не объяснил почему
Vladislav
Vladislav
Но чем лучше собирать все руками вместо тупой регистрации мне не понятно
Vladislav
Кроме мнимой типобезопасности
Aleksandr
Не такой уж и мнимой. Уж сколько раз ломал и чинил приложения по причине: незареген сервис
Roman
Никто так и не объяснил почему
классический сервис локатор работает так: у тебя есть большая свалка, в которую динамично можно добавлять и оттуда доставать сервисы. И ты вместо конкретных зависимостей прокидываешь этот мешок, и на лету в каком-нить методе сервиса оттуда достаешь ту зависимость, которую надо.
Проблема этого подхода в одновременной динамичности и неявности. Неявность в том, что неочевидно, где какие зависимости нужны, и какие вообще следует регистрировать. Динамичность — пушто и регистрация и резолвинг происходит в рантайме.
В итоге у тебя все компилится, куча тестов работает, но иногда в рантайме совершенно неожиданно отъебывает, пушто вдруг какого-то сервиса не нашлось. И от этого надежной защиты в сервис локаторе нет
Vladislav
Хз, переизобретение колёса и не более
Roman
А так, тебе все равно плюс минус руками композишн рут собирать. С динамическим контейнером тебе немного проще написать код собирания зависимостей, но существенно сложнее отслеживать, что никто не забыт ничто не забыто
Roman
Aleksandr
Vladislav
ок как скажешь
Ну ты сделал портянку интерфейсов с аггрегатом в виде обычного ди
Anatoly
Roman
Vladislav
Посмотрим когда зависимостей много
Vladislav
Что будет
Vladislav
Roman
Roman
зарезолвить на стадии компиляции?
Anatoly
Да, я не вижу проблему это сделать во время сборки проекта
Roman
пост билд ивентом чтоль?
Anatoly
Да какая разница как? Мы реализацию что ли пишем? Например, пост билд эвентом, но возможно другим. Там много стадий, я на память не помню
Roman
ну это уже не стадия компиляции
Anatoly
Да даже на стадии компиляции можно
Roman
Это автомтизировано, так что это лучше, чем ничего
Anatoly
Метод резолв - он обычно один
Vasily
С моей точки зрения, подобные подходы только добавляют сложности, к сожалению
Aleksandr
А как бы нам тогда в модуль регистрации зависимостей прокинуть конфиги?
Anatoly
Вон, в 3.0 завезли вроде проверку
Vasily
Короче
Vasily
С этими DI, конечно, играться можно
Vasily
Но проблема возникает, когда необходимо что-то переписать
Vasily
Ща мне, канеш, начнут говорить, что надо правильно проектировать
Anonymous
та тогда уже лучше все зависимости явно в конструкторе принимать и не выебываться. никаких тебе IEnv, а просто явные зависимости. если их много - то сгруппировать в рекорд, да и все.
Vasily
Но, к сожалению, правильное проектирование с первой итерации - оксюморон
Aleksandr
ahaha waterfall go wooooshhh
Vasily
Но у меня область специфическая - надо быстро и чтобы работало
Vasily
Особо времени на архитектурные изыски нет
Vasily
Roman
интерфейсы к нему еще 20 строк
Roman
Roman
остальные чистые
Vasily
Ну не знаю
Vasily
Короче, вопрос холиварный
Roman
ну как хотите
Vasily
@atsapura , ты просто придерживаешься убеждения, что надо по максимуму формализовывать все, что есть, кмк. У меня жизненный опыт говорит о другом
Roman
почему все?
Stanisλav
С какого сообщения читать про тайпклассы vs DI?
Roman
Я всего лишь пытаюсь упростить себе жизнь. Мне проще 1 раз подумать подольше и написать предельно говорящий и явный код, чем побыстрее что-нить пушнуть в мастер сейчас, но потом ковыряться в логах в поисках ответа на вопрос "как возникла такая хуйня" и "почему тут отъебнуло"
Roman
ну в фшарпе сегодня тайпклассов нет, так что сорян. Со скалой/хаскелем у меня опыта нет, поэтому я и тайпкласс-то в руках не держал
Vasily
Просто аргумент "чтобы все можно было протестировать" - он такой себе
Vasily
Благими намерениями, как известно
Vasily
Сам знаешь куда дорога вымощена
Roman
это все слишком абстрактные философствования. Было бы применимо, если б я замутил лютый овер инжиниринг во имя чего-то маловероятного. А так у меня код прост как 5 копеек, и его вряд ли даже больше, чем ушло бы на регистрацию компонентов
Roman
т.е. я пока не услышал даже конкретных недостатков подхода кроме "ну такое себе" и "по-мойму колесо"
Vasily
Я всегда задаюсь вопросом, насколько такая формализация усложняет разработку
Vasily
Ну т.е. сколько там бойлерплейта, в котором надо разобраться, как оно работает
Андрей
бойлерплейт спрятаный в библиотеку не перестает таковым быть, плюс все "течет", все "изменяется"
Roman
Ну т.е. сколько там бойлерплейта, в котором надо разобраться, как оно работает
type ICatalogDb =
abstract member GetProductItem: string -> Async<ProductItem option>
abstract member GetItems: string seq -> Async<ProductItem[]>
abstract member GetPrices: string seq -> Async<ProductItemPrice[]>
abstract member GetInventories: string seq -> Async<Inventory[]>
type IProductBlob =
abstract member SaveProduct: ProductId -> Localized<LocalizedCompleteProduct> -> Async<Result<unit, exn>>
type IAppEnv =
abstract member CatalogDb: ICatalogDb
abstract member ProductBlob: IProductBlob
abstract member Logger: ILogger
abstract member Config: CatalogConfig
abstract member ActorSystem: ActorSystem
abstract member UpdateRouter: IActorRef<UpdateRouterMessage>
abstract member UtcNow: DateTimeOffset
Vasily
Ну вот уже как-то дохера
Vasily
Хотя, возможно, я просто ничего в этом не понимаю
Hog
Андрей
конфиги на типклассах это примерно то, что описывает Роман. Дают больше уверенновсти уже при компиляции, и к тому же короче того что возможно в дотнетах
Anatoly
Николай
Roman
Vladislav
Здрасьте
mark
Привет
Vasily
Однако. бойлерплейт подъехал
Николай
Тут ведь из бойлерплейта по сути только создания объекта. Функции-мемберы в любом случае где-то будут реализованы. Либо сгруппированы в одну зависимость как здесь, либо где-то в модуле, либо где-то ещё
Roman
Да Василий как всегда