Roman
разве весь код на алголе говнокод?
ты мне че-нить ответишь-то?)
Roman
а то че-то за алгол какой-то ололо срач пошел
Roman
напиши на сишарпе тогда, пока не понятно, чем тебе мой вариант не понравился
Ilya
напиши на сишарпе тогда, пока не понятно, чем тебе мой вариант не понравился
полей, пользователь меняет 1 поле и остальные пересчитываются. поля зависят друг от друга и вычисления могут быть асинхронные
Roman
что такое асинхронные вычисления?
Roman
в базу слазить?
Roman
и ты опять на русском пишешь, а я просил на сишарпе!
Vladyslav
алгол-хуйгол, дело не в нем, а в том что "говнокод можно на любом языке писать как и хороший код" это вообще не аргумент, который опровергается выходом новых языков
Ilya
в базу слазить?
например, но пусть будет просто вызов Task.Delay(100)
Ayrat
у меня был домен где в середине торчали асинк колы - херовая идея конечно
Roman
например, но пусть будет просто вызов Task.Delay(100)
type T = { A: string; B int } with member this.SlazijVBazu() = task { do! Async.Sleep 100 return A + B }
Roman
ты решение предложи)
решение уже давно известно — луковая архитектура, pushing persistence to the edges
Ayrat
МОЖНО БЕЗ?!11
ага, просто убери
Roman
кек, буду знать
Ayrat
type Foo = { A: string B: int } member this.SlaziyVBazu() = task { do! Task.Delay 100 return this.A + this.B }
Ilya
type T = { A: string; B int } with member this.SlazijVBazu() = task { do! Async.Sleep 100 return A + B }
и ты считаешь, что это хорошее решение?
Ilya
каждый раз вычислять
Ilya
у тебя есть какой то пример из продакшен кода?
Ilya
если конечно есть F# на проде
Roman
и ты считаешь, что это хорошее решение?
Я сразу написал, что делать ИО вызовы в пропертях это ебанько, особенно с триггером на смену значения в полях. Совершенно не ясно, при чем тут вообще язык только
Ilya
в исходных данных не было ничего про проперти
Roman
т.е. ты сначала просишь меня сделать говно, а потом такой "А тебе не кажется, что это говно?!!1111" ну да, просил говно — получил говно. А виноват фшарп?
Roman
Ну так может ты уже перестанешь страдать хуйней и покажешь на сишарпе, что ты имеешь ввиду?
Ayrat
О, я ж могу теперь джетовскими сорцами делиться
Ayrat
щас я вам простыни говнокода буду кидать
Roman
а то я че-то уже начинаю терять самообладание и тянусь к банхаммеру!
Ayrat
let getPriceControl priceControlOverride priceControlBrandRules priceControlCategoryRules priceControlsManufacturerCatalog priceControlDefaultRule taxonomyItems (approvedCompetitiveSourcesMap: Map<RegionId, string Set>) (isOnePNode: NodeId->bool) (brandOption: string option) (offersMap: Map<RegionId, OfferAndShippingCost[]>) (retailSku: SlimmedRetailSku) (marginBasedPricingMap: Map<RegionId, MarginBasedPricingCalculationResults>) : Map<RegionId, PriceControlResult option> = let invertMapLevel mapLevel = match mapLevel with | PriceControlPolicies.Constants.Msp -> 1 | PriceControlPolicies.Constants.Map -> 2 | PriceControlPolicies.Constants.NoPrice -> 3 | _ -> 4 let sortOffers maybeMarginTarget offers = offers |> Seq.choose (fun offer -> if offer.sourceSkuMapLevel = PriceControlPolicies.Constants.Map then if Options.checkIfNoneOrNonPostivieDecimal offer.sourceSkuMapPrice then None else let mapPrice = offer.sourceSkuMapPrice.Value * offer.originalSourceSkuFactor Some { offer with offerKind = OfferKind.Price mapPrice } else match offer.offerKind with | OfferKind.Price price -> Some { offer with offerKind = OfferKind.Price (price * offer.originalSourceSkuFactor) } | OfferKind.CostWithOptionalPrice (cost, Some price) -> Some { offer with offerKind = OfferKind.CostWithOptionalPrice (cost, price * offer.originalSourceSkuFactor |> Some) } | OfferKind.CostWithOptionalPrice (_, None) -> Some offer ) |> Seq.map (fun offer -> // Amazon 3P offers should have shipping included in their price. match (offer.source = Sources.Indirect) && (offer.merchantId <> Constants.AmazonMerchantId) with | true -> match offer.offerKind with | OfferKind.Price price -> { offer with offerKind = OfferKind.Price (price + Option.getValueOr 0m offer.shippingAmount) } | OfferKind.CostWithOptionalPrice _ -> offer | false -> offer) |> Seq.sortBy(fun offer -> let priceControlPrice = Offer.tryGetPriceOrTargetPrice offer maybeMarginTarget |> Option.getValueOr Decimal.MaxValue priceControlPrice, invertMapLevel offer.sourceSkuMapLevel) AllRegions |> Seq.map ^fun regionId -> //check global override first. This should apply to all regions no matter what checkPriceControlOverride priceControlOverride retailSku.id |> Option.orElseWith ^fun _ -> maybe { let maybeMarginTarget = marginBasedPricingMap.TryFind regionId |> Option.map (fun x -> x.marginTarget) let! notSortedOffers = offersMap.TryFind regionId let offers = notSortedOffers |> Seq.map ^fun x -> x.offer |> sortOffers maybeMarginTarget |> Seq.toArray
Ayrat
return! //check manufacturer which is region specific checkManufacturerCatalog priceControlsManufacturerCatalog offers maybeMarginTarget |> Option.orElseWith ^fun _ -> maybe { let retailSkuCategory: CategoryId = int retailSku.category let! merchants = approvedCompetitiveSourcesMap.TryFind regionId let approvedCompOffers = offers |> Array.filter ^fun offer -> merchants.Contains offer.merchantId || offer.source = OfferSource.Indirect let directApprovedCompOffers = approvedCompOffers |> Array.filter ^fun offer -> offer.source = OfferSource.Merchant || offer.source = OfferSource.Jet return! //check brand override which is region specific checkBrandOverride priceControlBrandRules taxonomyItems brandOption offers approvedCompOffers directApprovedCompOffers retailSkuCategory maybeMarginTarget ////check category override which is region specific |> Option.orElseWith ^fun _ -> checkCategoryOverride priceControlCategoryRules taxonomyItems offers approvedCompOffers directApprovedCompOffers retailSkuCategory maybeMarginTarget ////check other overrides which is region specific |> Option.orElseWith ^fun _ -> checkOtherSources priceControlDefaultRule isOnePNode approvedCompOffers directApprovedCompOffers maybeMarginTarget } } |> tuple2 regionId |> Map.ofSeq
Roman
ну зачем же так делать, когда можно в гист?
Ayrat
да я чот думал что поместится
Ayrat
если чо, то джетовский код просто пример дикого прода на фшарпе, взлетело за год
Roman
да я чот думал что поместится
илья тоже думал, да в бан попал
Ayrat
у него некоторые пассажи прям намекают
Roman
пример простой
и ты считаешь, что это нормальный код?
Ilya
let getPriceControl priceControlOverride priceControlBrandRules priceControlCategoryRules priceControlsManufacturerCatalog priceControlDefaultRule taxonomyItems (approvedCompetitiveSourcesMap: Map<RegionId, string Set>) (isOnePNode: NodeId->bool) (brandOption: string option) (offersMap: Map<RegionId, OfferAndShippingCost[]>) (retailSku: SlimmedRetailSku) (marginBasedPricingMap: Map<RegionId, MarginBasedPricingCalculationResults>) : Map<RegionId, PriceControlResult option> = let invertMapLevel mapLevel = match mapLevel with | PriceControlPolicies.Constants.Msp -> 1 | PriceControlPolicies.Constants.Map -> 2 | PriceControlPolicies.Constants.NoPrice -> 3 | _ -> 4 let sortOffers maybeMarginTarget offers = offers |> Seq.choose (fun offer -> if offer.sourceSkuMapLevel = PriceControlPolicies.Constants.Map then if Options.checkIfNoneOrNonPostivieDecimal offer.sourceSkuMapPrice then None else let mapPrice = offer.sourceSkuMapPrice.Value * offer.originalSourceSkuFactor Some { offer with offerKind = OfferKind.Price mapPrice } else match offer.offerKind with | OfferKind.Price price -> Some { offer with offerKind = OfferKind.Price (price * offer.originalSourceSkuFactor) } | OfferKind.CostWithOptionalPrice (cost, Some price) -> Some { offer with offerKind = OfferKind.CostWithOptionalPrice (cost, price * offer.originalSourceSkuFactor |> Some) } | OfferKind.CostWithOptionalPrice (_, None) -> Some offer ) |> Seq.map (fun offer -> // Amazon 3P offers should have shipping included in their price. match (offer.source = Sources.Indirect) && (offer.merchantId <> Constants.AmazonMerchantId) with | true -> match offer.offerKind with | OfferKind.Price price -> { offer with offerKind = OfferKind.Price (price + Option.getValueOr 0m offer.shippingAmount) } | OfferKind.CostWithOptionalPrice _ -> offer | false -> offer) |> Seq.sortBy(fun offer -> let priceControlPrice = Offer.tryGetPriceOrTargetPrice offer maybeMarginTarget |> Option.getValueOr Decimal.MaxValue priceControlPrice, invertMapLevel offer.sourceSkuMapLevel) AllRegions |> Seq.map ^fun regionId -> //check global override first. This should apply to all regions no matter what checkPriceControlOverride priceControlOverride retailSku.id |> Option.orElseWith ^fun _ -> maybe { let maybeMarginTarget = marginBasedPricingMap.TryFind regionId |> Option.map (fun x -> x.marginTarget) let! notSortedOffers = offersMap.TryFind regionId let offers = notSortedOffers |> Seq.map ^fun x -> x.offer |> sortOffers maybeMarginTarget |> Seq.toArray
то есть вот это считается отличным читаемым кодом?
Ilya
и ты считаешь, что это нормальный код?
он значительно упрощен, но в целом да
Roman
ты в write only сидишь?
Roman
щас я вам простыни говнокода буду кидать
Roman
то есть вот это считается отличным читаемым кодом?
Ayrat
то есть вот это считается отличным читаемым кодом?
ну учитывая сложность домена, я не знаю что тебе сказать. это просто работало
Roman
он значительно упрощен, но в целом да
штош, ясно. А чем это лучше пропертей?
Igor
Ilya
штош, ясно. А чем это лучше пропертей?
тем что это не проперти, а описание того, как надо рассчитывать те или иные свойства
Ilya
и в том числе они могут быть асинхронные
Ayrat
Не благодари (gist) 😏
у тебя тоже не поместилось!
Ilya
короче, судя по всему люди тут не приемлют возможность того, что можно написать нормальный код не на F# или другом функциональном языке
Ilya
всё таки принятие аргументов - вещь субъективная
Roman
тем что это не проперти, а описание того, как надо рассчитывать те или иные свойства
какая нахуй разница, в проперти описывать или в билдере? Ну кроме того, что тут мы еще либу подключили для этого.
Ayrat
там вообще люди не стремались функции с 50ю параметрами писать
Ayrat
и асинками посередине
Ayrat
жалко у меня нет всей истьории
Igor
не, это я тут рефакторнул уже, этот код был сильно больше
Шош ты на локальный функции не разбил 🤔
Roman
жалко у меня нет всей истьории
а там хуяк — и асинки илья впилил
Ilya
но согласен, что в F # у меня не достаточно экспертизы
Ilya
но утверждать что надо срочно бросать C# и бежать на F# - как минимум непрофессионально
Roman
яснопонятно) можем на этом закончить)
нет, ты объясни, в чем практическая разница
Igor
пример простой
какой-то обрывок кода но на f# будет тоже самое, лямбды только выглядят чуть по другому
Ilya
и говорить, что на F# будет значительно лучше, потому что это F# как минимум странно
Ilya
а профессионально знать только 1 язык и парадигму?
мы вроде не об этом, но я знаю не один язык, если ты про меня
Roman
и говорить, что на F# будет значительно лучше, потому что это F# как минимум странно
ну давай еще сравним языки на примере сложения чисел. И будем потом всем рассказывать, что разницы нет
Ayrat
как я тебя закенселил, а!