Ayrat
начало функции let rec evaluateBasketRec (inputs: MemberPriceCalculationInputsDependencies) originalOffersByRsku requestContext (prioritites: ( (Rank * FcRank list) list) option) (twoDayFcNamesForZipCode:Set<NodeName>) (twoDayFcNodesForZipCode:Set<NodeId>) (getPromoCodes: PromoCodeReadRequestInfo [] -> Async<PromoCodeTypes.PromoCodesToApply>) (isOnePNode:NodeId->bool) (memberPrices:(string * MemberPriceTypes.MemberPriceData option)[]) (savingsStrategyByRskuId: Map<string, SavingsStrategy>) (inventoryPools:InventoryPoolsItem[]) (basket:Basket) (nonPriceableAccumulator:NonPriceable list) (merchantSelector: MemberPrice.MemberPrice.MemberPriceCalculationInputsDependencies -> (((Rank * FcRank list) list) option) -> Map<FCName,Set<string>> -> Map<ZipCode, Set<FCName>> -> Map<string,JetSkuCartData> -> (string * MemberPriceTypes.MemberPriceData option)[] -> Basket -> Async<Choice<CustomerOrder * CustomerOrderPrice * List<NonPriceable> * Map<string, FulfillmentNode> * (string * Offer[]) list, string, _>>) shippingEstimatorV2 (inventoryReservator:BasketId -> InventoryReservationRequest[] -> Async<(Choice<InventoryReservation,InventoryReservation>)[]>) (inventoryUpdator:BasketId->InventoryReservation seq->Async<unit>) (inventoryOrderModifier: InventoryReservations.PantherReservations.Order -> Async<(Choice<ModifyOrderReservation, ModifyOrderReservation>)[]>) (oldReservationOrder: InventoryReservations.PantherReservations.Order option) (modifyOrderInventoryUpdator:string->ModifyOrderReservation seq->Async<unit>) (getSellableOverride: MartId -> RetailSkuId -> Async<bool option>) (getMerchantsInfo: MerchantId[] -> Async<(string * Merchant) []>) (reserveInventory:bool) (jetSkus:Map<string, JetSkuCartData>) (currentInventoryReservationRetryCount:int) (jetMerchantId:string) (calcShippingConfigs:bool) (stormBundleMap:Map<BundleId,StormBundle option>) (pricePersistenceBlackList:Map<string,DateTime>) (defaultCosts:Map<int,Superman.Domain.Types.DefaultShipCost[]>) (paymentMethodDiscounts: Map<Superman.Domain.InputsTypes.PaymentMethod*Superman.Domain.InputsTypes.PaymentType*Superman.Domain.InputsTypes.CardType,decimal>) (jetFcsToZipCodeInclusions:Map<FCName,Set<string>>) (jetFcsWithFulfillmentInclusionsByZip: Map<ZipCode, Set<FCName>>) deliveryWindowFee originalDeliveryWindowFee featureFlags calcDeliveryOptions = async { … }
Ilya
Уф
x
в фп тоже есть паттерны
Но почему-то на любой кусок из прода начинается ор что фуфу.
Ilya
С другой стороны, красивый код достаточно редко скидывают.
Ilya
Ну а зачем? Посмотрите, как я круто описал бизнес-логику?
Ilya
(кто-нибудь смог посчитать количество параметров у функции выше?)
Vladislav
начало функции let rec evaluateBasketRec (inputs: MemberPriceCalculationInputsDependencies) originalOffersByRsku requestContext (prioritites: ( (Rank * FcRank list) list) option) (twoDayFcNamesForZipCode:Set<NodeName>) (twoDayFcNodesForZipCode:Set<NodeId>) (getPromoCodes: PromoCodeReadRequestInfo [] -> Async<PromoCodeTypes.PromoCodesToApply>) (isOnePNode:NodeId->bool) (memberPrices:(string * MemberPriceTypes.MemberPriceData option)[]) (savingsStrategyByRskuId: Map<string, SavingsStrategy>) (inventoryPools:InventoryPoolsItem[]) (basket:Basket) (nonPriceableAccumulator:NonPriceable list) (merchantSelector: MemberPrice.MemberPrice.MemberPriceCalculationInputsDependencies -> (((Rank * FcRank list) list) option) -> Map<FCName,Set<string>> -> Map<ZipCode, Set<FCName>> -> Map<string,JetSkuCartData> -> (string * MemberPriceTypes.MemberPriceData option)[] -> Basket -> Async<Choice<CustomerOrder * CustomerOrderPrice * List<NonPriceable> * Map<string, FulfillmentNode> * (string * Offer[]) list, string, _>>) shippingEstimatorV2 (inventoryReservator:BasketId -> InventoryReservationRequest[] -> Async<(Choice<InventoryReservation,InventoryReservation>)[]>) (inventoryUpdator:BasketId->InventoryReservation seq->Async<unit>) (inventoryOrderModifier: InventoryReservations.PantherReservations.Order -> Async<(Choice<ModifyOrderReservation, ModifyOrderReservation>)[]>) (oldReservationOrder: InventoryReservations.PantherReservations.Order option) (modifyOrderInventoryUpdator:string->ModifyOrderReservation seq->Async<unit>) (getSellableOverride: MartId -> RetailSkuId -> Async<bool option>) (getMerchantsInfo: MerchantId[] -> Async<(string * Merchant) []>) (reserveInventory:bool) (jetSkus:Map<string, JetSkuCartData>) (currentInventoryReservationRetryCount:int) (jetMerchantId:string) (calcShippingConfigs:bool) (stormBundleMap:Map<BundleId,StormBundle option>) (pricePersistenceBlackList:Map<string,DateTime>) (defaultCosts:Map<int,Superman.Domain.Types.DefaultShipCost[]>) (paymentMethodDiscounts: Map<Superman.Domain.InputsTypes.PaymentMethod*Superman.Domain.InputsTypes.PaymentType*Superman.Domain.InputsTypes.CardType,decimal>) (jetFcsToZipCodeInclusions:Map<FCName,Set<string>>) (jetFcsWithFulfillmentInclusionsByZip: Map<ZipCode, Set<FCName>>) deliveryWindowFee originalDeliveryWindowFee featureFlags calcDeliveryOptions = async { … }
x
В ООП есть ПАТТЕРНЫ
Забыл сказать, что ещё есть ФАБРИКИ и ДЕПЕНДНСИ ИНЖЕКШИОН
x
а в ФП этом вашем лишь отрицание всего
x
Но в проде внезапно опять же фабрики и инжекшон
x
Парадокс.
Shub
как будет отмазываться автор этого
автор этого, подобно баптистскому пастору, не выходит из дому без DDD made Functional в кармане. и все это было объяснено в соответствии с буквой Писания. не сомневайтесь - сие ездит по рельсам не хуже дрезины обходчика
Диёр
по рельсам которые railway op?
Shub
ага
Диёр
Shub
глядя на эту сигнатуру, я понимаю, что следующие 180 строк рельс будут крайне увлекательными
Shub
у нас кстати |> используется как префикс исполняемой строки. программист на Коболе может сделать Кобол из любого языка
Ayrat
Но в проде внезапно опять же фабрики и инжекшон
Я вон тебе скинул выше функцию без этого вашего DI Ты ещё вызов не видел
Ayrat
Вот где пирдуха начинается
x
Даже не знаю, радоваться или нет
x
Я всё жду кода из продакшена, проткоторый все скажут «о, это рил фп, тут все классно». И не хеллоуворлд
x
А скидывают ужасы
Ilya
Так была уже ссылка.
Ilya
а пока вы там закатываете солнце вручную, я напомню, что ДДД здорового человека можно пронаблюдать (и даже использовать в проде) вот тут: https://github.com/jet/equinox
Ilya
заодно можно посмотреть, как здоровые люди пишут на F#
Ayrat
Вот да, еквинокс збс
Ayrat
Просто эмоций больше вызывает дичь
Ayrat
Когда я вижу хороший фшарп, во мне ничто не умирает, я даже не улыбаюсь
Ayrat
Поэтому прохожу мимо
Диёр
@omgszer на свитч alien isolation вышла
Диёр
откладывать кирпичи теперь можно будет в правильном месте
Ayrat
@omgszer на свитч alien isolation вышла
Я люблю дрочильни, жрпг и Саус парк. Хороры чот не очень, там бояться надо
Диёр
ты в айти работаешь
Диёр
тут каждый день бояться надо
Диёр
и даже пока спишь тебе могут позвонить и сказать "там чет наебнулось можешь глянуть?"
Ayrat
Ну эт не страшно.
Denis
ладно позвонить, это не так страшно, страшно когда могут написать а ты не увидишь
Диёр
начало функции let rec evaluateBasketRec (inputs: MemberPriceCalculationInputsDependencies) originalOffersByRsku requestContext (prioritites: ( (Rank * FcRank list) list) option) (twoDayFcNamesForZipCode:Set<NodeName>) (twoDayFcNodesForZipCode:Set<NodeId>) (getPromoCodes: PromoCodeReadRequestInfo [] -> Async<PromoCodeTypes.PromoCodesToApply>) (isOnePNode:NodeId->bool) (memberPrices:(string * MemberPriceTypes.MemberPriceData option)[]) (savingsStrategyByRskuId: Map<string, SavingsStrategy>) (inventoryPools:InventoryPoolsItem[]) (basket:Basket) (nonPriceableAccumulator:NonPriceable list) (merchantSelector: MemberPrice.MemberPrice.MemberPriceCalculationInputsDependencies -> (((Rank * FcRank list) list) option) -> Map<FCName,Set<string>> -> Map<ZipCode, Set<FCName>> -> Map<string,JetSkuCartData> -> (string * MemberPriceTypes.MemberPriceData option)[] -> Basket -> Async<Choice<CustomerOrder * CustomerOrderPrice * List<NonPriceable> * Map<string, FulfillmentNode> * (string * Offer[]) list, string, _>>) shippingEstimatorV2 (inventoryReservator:BasketId -> InventoryReservationRequest[] -> Async<(Choice<InventoryReservation,InventoryReservation>)[]>) (inventoryUpdator:BasketId->InventoryReservation seq->Async<unit>) (inventoryOrderModifier: InventoryReservations.PantherReservations.Order -> Async<(Choice<ModifyOrderReservation, ModifyOrderReservation>)[]>) (oldReservationOrder: InventoryReservations.PantherReservations.Order option) (modifyOrderInventoryUpdator:string->ModifyOrderReservation seq->Async<unit>) (getSellableOverride: MartId -> RetailSkuId -> Async<bool option>) (getMerchantsInfo: MerchantId[] -> Async<(string * Merchant) []>) (reserveInventory:bool) (jetSkus:Map<string, JetSkuCartData>) (currentInventoryReservationRetryCount:int) (jetMerchantId:string) (calcShippingConfigs:bool) (stormBundleMap:Map<BundleId,StormBundle option>) (pricePersistenceBlackList:Map<string,DateTime>) (defaultCosts:Map<int,Superman.Domain.Types.DefaultShipCost[]>) (paymentMethodDiscounts: Map<Superman.Domain.InputsTypes.PaymentMethod*Superman.Domain.InputsTypes.PaymentType*Superman.Domain.InputsTypes.CardType,decimal>) (jetFcsToZipCodeInclusions:Map<FCName,Set<string>>) (jetFcsWithFulfillmentInclusionsByZip: Map<ZipCode, Set<FCName>>) deliveryWindowFee originalDeliveryWindowFee featureFlags calcDeliveryOptions = async { … }
а там ты видишь это
Ayrat
Это да. Счастливого дебага
Диёр
Интригует!
Shub
Вот да, еквинокс збс
только торопитесь, потому что автор кода выше уже коммитит и в эквинокс
Shub
Рефакторит, надеюсь?
ну как сказать. он сторонник доктрины "если мне это понадобилось хотя бы один раз - это нужно всем"
Shub
а так же "вы ОБЯЗАНЫ это употреблять"
Ayrat
Это Назаров что ли?
Shub
вы можете посмотреть на код fslint, он туда много чего писал
Shub
Это Назаров что ли?
не, он не пишет код практически
Shub
тут есть другой, маленький, но очень гордый инженер
Ayrat
Не то чтобы я в курсе вашего паноптикума
Ayrat
Так, верхи знаю
Shub
я не очень понимаю, как это отражается на коде
он абсолютно весь свой код тулит в ту или иную библиотеку. у нас тут есть своя "платформа", его работа структурируется примерно так: 1000 строк в "платформу", одна - в проект
Shub
всего его коммиты в fsharplint - это конкретные юзкейсы на нашем проекте
Крылатый
/me вспомнил платформу на своей работе
Диёр
Платформа тензора
Диёр
Я слышал про нее легенды
Крылатый
Ыыы
Roman
хотя я не знаю, насколько сама платформа при таком подходе изолирована от всего остального
Диёр
Я слышал про нее легенды
Вагон говна на самых древних технологиях, до сих пор не покрытый до конца тестами и документацией и нет ни одного человека, который до конца знает как она работает
Диёр
Вашей платформе 15 лет вроде
Диёр
Или скоро будет
Крылатый
Ну она меняется. :D
Крылатый
А ваще, про какую именно речь?
Крылатый
Она там интерфейсная есть и бээльная.
Диёр
Не знаю. Работал с челиками, которые в тензоре делали выгрузки годовых отчётов и там никто не может сказать что и как работает.
Крылатый
Я потому рад, что сейчас больше мобильной работы, чем в облаке.
Диёр
Но ваш то точно не такой!
Крылатый
Но ваш то точно не такой!
Наш очень автобусный.
Диёр
Наш очень автобусный.
Особенно радовало когда говорили что если что-то ломается, то разработчиков зовут в любое время суток и не доплачивают. А если уходишь в отпуск, то ты должен найти дурачка, который согласится выходить вместо тебя.
Крылатый
А так да, фирма обыкновенный буржуй.
Shub
минвайл в корпоративном чатике идет обсуждение этого же куска кода. джун пишет "блин не могу найти, откуда именно пишется сообщение об ошибке, потому что в 13 местах используется 13 идентичных сообщений"