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
Уф
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
Парадокс.
Shub
как будет отмазываться автор этого
автор этого, подобно баптистскому пастору, не выходит из дому без DDD made Functional в кармане. и все это было объяснено в соответствии с буквой Писания. не сомневайтесь - сие ездит по рельсам не хуже дрезины обходчика
Диёр
по рельсам которые railway op?
Shub
ага
Диёр
Shub
глядя на эту сигнатуру, я понимаю, что следующие 180 строк рельс будут крайне увлекательными
Shub
у нас кстати |> используется как префикс исполняемой строки. программист на Коболе может сделать Кобол из любого языка
Ayrat
Вот где пирдуха начинается
x
Даже не знаю, радоваться или нет
x
Я всё жду кода из продакшена, проткоторый все скажут «о, это рил фп, тут все классно». И не хеллоуворлд
x
А скидывают ужасы
Ilya
Так была уже ссылка.
Ayrat
Ilya
а пока вы там закатываете солнце вручную, я напомню, что ДДД здорового человека можно пронаблюдать (и даже использовать в проде) вот тут: https://github.com/jet/equinox
Ilya
заодно можно посмотреть, как здоровые люди пишут на F#
Ayrat
Вот да, еквинокс збс
Ayrat
Просто эмоций больше вызывает дичь
Ayrat
Когда я вижу хороший фшарп, во мне ничто не умирает, я даже не улыбаюсь
Ayrat
Поэтому прохожу мимо
Andrew
Andrew
Диёр
@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
Это да. Счастливого дебага
Диёр
Roman
Ayrat
Shub
Рефакторит, надеюсь?
ну как сказать. он сторонник доктрины "если мне это понадобилось хотя бы один раз - это нужно всем"
Shub
а так же "вы ОБЯЗАНЫ это употреблять"
Ayrat
Это Назаров что ли?
Shub
вы можете посмотреть на код fslint, он туда много чего писал
Shub
тут есть другой, маленький, но очень гордый инженер
Ayrat
Не то чтобы я в курсе вашего паноптикума
Ayrat
Так, верхи знаю
Roman
Shub
я не очень понимаю, как это отражается на коде
он абсолютно весь свой код тулит в ту или иную библиотеку. у нас тут есть своя "платформа", его работа структурируется примерно так: 1000 строк в "платформу", одна - в проект
Крылатый
Shub
всего его коммиты в fsharplint - это конкретные юзкейсы на нашем проекте
Крылатый
/me вспомнил платформу на своей работе
Диёр
Платформа тензора
Диёр
Я слышал про нее легенды
Крылатый
Ыыы
Roman
Roman
хотя я не знаю, насколько сама платформа при таком подходе изолирована от всего остального
Диёр
Я слышал про нее легенды
Вагон говна на самых древних технологиях, до сих пор не покрытый до конца тестами и документацией и нет ни одного человека, который до конца знает как она работает
Диёр
Вашей платформе 15 лет вроде
Диёр
Или скоро будет
Крылатый
Ну она меняется. :D
Крылатый
А ваще, про какую именно речь?
Крылатый
Она там интерфейсная есть и бээльная.
Диёр
Не знаю. Работал с челиками, которые в тензоре делали выгрузки годовых отчётов и там никто не может сказать что и как работает.
Крылатый
Крылатый
Я потому рад, что сейчас больше мобильной работы, чем в облаке.
Диёр
Но ваш то точно не такой!
Крылатый
Shub
Диёр
Наш очень автобусный.
Особенно радовало когда говорили что если что-то ломается, то разработчиков зовут в любое время суток и не доплачивают. А если уходишь в отпуск, то ты должен найти дурачка, который согласится выходить вместо тебя.
Крылатый
Крылатый
А так да, фирма обыкновенный буржуй.
Shub
минвайл в корпоративном чатике идет обсуждение этого же куска кода. джун пишет "блин не могу найти, откуда именно пишется сообщение об ошибке, потому что в 13 местах используется 13 идентичных сообщений"