Anonymous
другой типичный пример - (чистое) подмножество rx
Roman
эту мысль можешь развить? не знаком с этими атрибутами
да,это хуюнит. Ты указываешь у теста эти атрибуты и в мебердату пихаешь статическую пропертю, в которой коллекция входных данных для теста. Эдакий недо FsCheck
Roman
эту мысль можешь развить? не знаком с этими атрибутами
типа такого: public static TheoryData<Period, ZonedDateTime> NotSatisfiedMaxAdvanceSamples => new TheoryData<Period, ZonedDateTime> { { Period.FromDays(30), Now.PlusHours(24 * 31) }, { Period.FromDays(60), Now.PlusHours(24 * 61) }, { Period.FromDays(7), Now.PlusHours(24 * 8) } }; [Theory] [MemberData(nameof(NotSatisfiedMaxAdvanceSamples))] public void ShouldHaveAdvanceBookingRestrictionIfMaxAdvanceIsNotSatisfiedAndNoOtherRestrictions(Period maxAdvance, ZonedDateTime arrival) { var ratePlan = CreateRatePlanForAvailabilityTests(maxAdvance: maxAdvance); ratePlan.HasAdvanceBookingRestriction(Now, arrival).Should().BeTrue(); }
Roman
чем это лучше моков?
тем, что это не завязано на внутреннюю имплементацию и не идет по пизде, когда кто-то вызвал другую перегрузку метода репозитория. Кода меньше в тестах без потери качества тестирования
Roman
То есть это позволяет blackbox тестинг. И тесты не дают false negative, когда ты вообще другую хуйню сбоку прикручивал
Roman
да и вообще, ИО — источник ошибок, и логика тоже. И легче эти ошибки отлавливать поотдельности, а не ковыряться в непонятной куче поломанного говна
Фил Ранжин
и вот эта твоя мембер дата, она ведь тоже завязана на внутреннюю имплементацию
Roman
нет, она завязана на бизнес правила
Roman
а не на то, что дергается конкретный метод где-то в недрах тестируемого кода
Фил Ранжин
справедливо, кстати
Roman
кода меньше, если ты тестируешь много сценариев, а не только 1
Фил Ранжин
да, понял твою мысль
Фил Ранжин
спасибо
Фил Ранжин
насчёт мотивации у тимы
Roman
наздоровье!
Фил Ранжин
у разрабов всегда одна мотивация
Фил Ранжин
хуями поразмахивать
Фил Ранжин
в переносном смысле, если что
Roman
да хз. Встречал много таких, которым все похуям давно
Anonymous
ребят, искренне вас жаль. реально.
Roman
ребят, искренне вас жаль. реально.
если были сомнения, то не переживай, твой звонок очень важен
Anonymous
ну я хотя бы попытался
Vasily
ребят, искренне вас жаль. реально.
Ну доставай, чо. Померяем
Anonymous
так я выше отписал
Anonymous
но без толку
Vasily
так я выше отписал
ОТПИСАЛ <> ДОСТАЛ
Anonymous
нипанятна
Anonymous
Roman
есть 2 стула: мучаться без паттерн матчинга с опшнами в сишарпе или мучаться с вездесущими исключениями в сишарпе. На какой сесть?
Vasiliy
😂😂😂 в c# наверное лучше исключения. ну придет после тебя новый разраба и начнет дальше кодить. Так он хотя бы что то сделает, а в случае с option нахер все сломает и еще скажет что ты дурак
Roman
да вот хер. У нас вся команда ценит детерменированность опшнов
Anonymous
есть 2 стула: мучаться без паттерн матчинга с опшнами в сишарпе или мучаться с вездесущими исключениями в сишарпе. На какой сесть?
а что мешает использовать те же лямбды и инкапсулировать паттерн матчинг в одном месте?
Roman
так я и использую лямбды. Все равно выглядит вырвиглазно по сравнению с фаршем
Roman
и ведь сука все равно кидаю исключение, пушто резалт не завезли! О боги
Roman
ват?
Anonymous
должно выглядить почти также, за исключением мелких синтаксических различий. C#-версия getIther().Then(leftHandler, rightHandler).Then(anotherLeftHandler, anotherRightHangler);
Anonymous
вполне себе нормально выглядит
Roman
допустим, но какое это отношение имеет к чистым функциям?
Anonymous
не говоря уже о том, что кидать исключения - дурной тон
Roman
так ладно я все понял
Roman
я блять и сам знаю, что кидать исключения это дурной тон
Roman
но хули делать без DU
Anonymous
не кидать исключения
Anonymous
у вас на худой конец есть task, у которого есть исключения. и TaskCompletionSOurce, это если совсем своего ничего не хотите писать.
Anonymous
короче, детский сад, не иначе.
Anonymous
Смотря где и зачем кидать.
ну да. если реально тотальный невозможный непредвиденный ахтунг - то кидай себе на здоровье. но это означает, что полный пиздец произошел.
Doge
ну да. если реально тотальный невозможный непредвиденный ахтунг - то кидай себе на здоровье. но это означает, что полный пиздец произошел.
Но вроде бы народ потихоньку отучается использовать исключения там, где ситуация не такая. Или может просто я слишком дофига с ФП кодом работаю.
Hog
Anonymous
ну вон выше целая простыня со статической ересью и потом второй акт с отсутствие якобы выбора в C#
Roman
должно выглядить почти также, за исключением мелких синтаксических различий. C#-версия getIther().Then(leftHandler, rightHandler).Then(anotherLeftHandler, anotherRightHangler);
ага. let validate defenition attr = match defenition, attr with | None, None -> Ok () | Some def, Some a -> Ok () | _ -> Error "message" Попробуй это так же компактно распихать по этим лямбдам definition.Match(d => ..., () => ...) и тд
Anonymous
компакто в каком смысле? у тебя это заняло 5 строк. в те же пять строк я вложусь в C#
Roman
прошу
Anonymous
я тебе выше показал
Hog
прошу
Ограничения на длину строки есть?
Anonymous
единственный яввный минус C# - это руками Either<T1, T2>.Method() задавать типы.
Anonymous
вот и все.
Anonymous
что тоже можно пофиксить, на самом деле.
Anonymous
но там уже чуть хитрее будут api
Roman
я тебе выше показал
херня там показана. Там leftHandler и rightHandler определены заранее. Это тоже строки занимает
Anonymous
ну ту логику, что ты показал - это oneliner'ы
Anonymous
и там, конечно, лямбды
Hog
Ну и строчками меряться - это такоэ :)
Anonymous
та даже по таким злопидорским метрикам
Anonymous
все равно будет почти 1 в 1
Pavel
никому не рассказывай
Vasiliy
😱
Vasiliy
ужас
Фил Ранжин
исключения по мне - безумие
Фил Ранжин
с вэлютипами вообще лучше всего try паттерн
Anonymous
в каждую лямбду подпихивать уже типизированный eitherBuilder
Anonymous
на уровне API сами then/match/continueWith или как вы их там называете
Anonymous
не совсем. у тебя builder уже типизированный <TLeft, TRight>
Anonymous
что-то в стиле .Then((left, builder) => ..., (right, builder) => ...)