Roman
даже грустно немного
Vasily
@auduchinok , аяяяй : com.jetbrains.rdclient.util.BackendException: Analyzer 'JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers.ColorReferenceAnalyzer' threw the following exception: Ссылка на объект не указывает на экземпляр объекта. --- EXCEPTION #1/2 [NullReferenceException] Message = “Ссылка на объект не указывает на экземпляр объекта.” ExceptionPath = Root.InnerException ClassName = System.NullReferenceException HResult = E_POINTER=COR_E_NULLREFERENCE=80004003 Source = JetBrains.ReSharper.Plugins.FSharp.Psi.Features StackTraceString = “ в JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpVisualElementFactory.getFromAppExpr(IReferenceExpr referenceExpr, IReferenceExpr qualifier) в C:\BuildAgent\work\a8f60b51115c7251\ReSharper.FSharp\src\FSharp.Psi.Features\src\Util\FSharpVisualElementFactory.fs:строка 40 в JetBrains.ReSharper.Daemon.VisualElements.VisualElementHighlighter.CreateColorHighlightingInfo(ITreeNode element) в JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Analyzers.ColorReferenceAnalyzer.Run(IReferenceExpr expr, ElementProblemAnalyzerData analyzerData, IHighlightingConsumer consumer) в C:\BuildAgent\work\a8f60b51115c7251\ReSharper.FSharp\src\FSharp.Psi.Features\src\Daemon\Analyzers\ColorReferenceAnalyzer.fs:строка 15 в JetBrains.ReSharper.Feature.Services.Daemon.ElementProblemAnalyzerRegistrar.ElementAnalyzerDispatcher.Run(ITreeNode element, IHighlightingConsumer consumer) ”
Vasily
Да Василий как всегда
Ну у меня немного другой взгляд на проблемы, к сожалению
Vasily
И проблемы другого характера
Roman
да дело не в твоем взгляде. Ты, по-моему, даже не пытаешься вникнуть в код
Vasily
Не понял, чем код отличается от мутабла
Roman
Создается впечатление, что если подход отличается от твоего, то это бойлерплейт/переусложнение хуе мое
Vasily
Принципиально
Vasily
У меня такое вот наговнякано: [<RequireQualifiedAccess>] module Ctx = let mutable wrap = fun data -> async{ return { Id = 0L; Data = [||];Resend=true} } let mutable setSalt: int64->unit = fun _ -> () let mutable sendPayload: Payload->Result<unit,ChannelError> = fun (payload: Payload) ->Result.Error (ChannelError.EmptyData) let mutable rcvStream = (EventStream<MessageData>().Stream)
Vasily
Чем оно отличается от твоего, не совсем понимаю
Roman
Чем оно отличается от твоего, не совсем понимаю
что будет, если кто-то в коде поменяет в этом модуле что-то в середине жизненного цикла приложения?
Vasily
Точнее, сценарий возможный, но очень маловероятный
Roman
Ctx.wrap <- failwith "vot tak"
Vasily
Все упадет, очевидно
Vasily
Но как бы человек себе сам сознательно конечность отстрелит
Vasily
Так что пока аргумент не принимается
Николай
У меня такое вот наговнякано: [<RequireQualifiedAccess>] module Ctx = let mutable wrap = fun data -> async{ return { Id = 0L; Data = [||];Resend=true} } let mutable setSalt: int64->unit = fun _ -> () let mutable sendPayload: Payload->Result<unit,ChannelError> = fun (payload: Payload) ->Result.Error (ChannelError.EmptyData) let mutable rcvStream = (EventStream<MessageData>().Stream)
Это же скорее ближе к сервис локатору. Неочевидно, какие из этих статических функций нужны в конкретном методе; можно забыть присвоить какой-нибудь из функций нужную реализацию и всё сломается в рантайме; для тестов либо подсовывать везде одну реализацию, либо выполнять тесты последовательно
Vasily
Я прекрасно осознаю все вышеописанное
Vasily
Но когда у меня 1000+ функций, куда надо этот контекст прокинуть
Vasily
Это такое себе
Roman
при том, что "бойлерплейта" не меньше. Где-то ж надо присвоить все эти штуки в твой модуль
Vasily
5 строчек в одном месте
Vasily
Все
Roman
э нет
Vasily
Чо нет, когда да
Vasily
И те, кто с кодом работают, не заморачиваются на тему
Doge
Но когда у меня 1000+ функций, куда надо этот контекст прокинуть
Так есть всегда можно дедовским фп методом - Reader и погнали. И ничего не надо прокидывать руками.
Vasily
А как мне прокинуть это логирование?
Roman
тебе нужно инициализировать все это, а не только вызвать <-
Vasily
Так есть всегда можно дедовским фп методом - Reader и погнали. И ничего не надо прокидывать руками.
Ну не слишком удобно, к сожалению. Хотя, возможно, я до этого подхода еще не дорос
Roman
так что я пока не вижу, как этот подход лютейше экономит мои 150 (сто пятьдесят) строк кода
Vasily
Суммарно
Vasily
Точнее 15
Николай
Но когда у меня 1000+ функций, куда надо этот контекст прокинуть
Если реально такой кейс, что тысячи использующих функций и всего полторы функции в контексте, то тогда, возможно, такое решение с мутабл переменными удобнее постоянного прокидывания зависимостей. С другой стороны, почему бы не завернуть 1000 функций в класс\модуль и прокидывать appEnv один раз в самом верху
Doge
Ну не слишком удобно, к сожалению. Хотя, возможно, я до этого подхода еще не дорос
Смотря куда хочется это прокидывать и как конкретно сделать. Хотя на мобилках есть свои проблемы с тем, что ридер - это лишние аллокации на пустом месте.
Vasily
Ну вот и аллокаций тоже не очень хочется
Vasily
Я пытался к этой проблеме подойти с т.з. Романа - получалось слишком много геморроя без видимых бенефитов
Roman
я пока не вижу, в чем геморрой. В том, чтобы прокинуть 1 параметр?
Roman
или описать пару интерфейсов?
Vasily
Рома , 1000 + функций
Doge
я пока не вижу, в чем геморрой. В том, чтобы прокинуть 1 параметр?
Если это идёт через всё приложение, то будет грустно с этим параметром бегать
Vasily
Ну и неохота с параметром бегать, да
Roman
ну у меня просто нет этих 1000 функций, и я даже не очень представляю, откуда бы им взяться
Vasily
У меня апи развесистый, скажем так
Roman
ну можт у меня, конечно, только такой кейс
Roman
собсно, это тоже решается. Ты просто делаешь 1 мутабельное поле в модуле, вместо всего контекста)
Roman
Зато оно у тебя настраивается атомарно
Roman
а у себя в этих легионах функций так же вызываешь Ctx.env.Logger
Vasily
Ну и начнем с того, что я тупо не понимаю, в чем в данном случае преимущество интерфейса
Roman
Гарантия атомарности настройки окружения
Roman
но я понял, что это не модно
Vasily
Нет такой гарантии
Roman
почему?
Николай
Делать мутабельное поле в каждом модуле - это, наверно, даже хуже, чем один мутабельный контекст. В каждом модуле надо инициализировать свои зависимости и не забыть, что используется внутри модуля; при добавлении новой зависимости придётся добавлять её в каждый модуль, где она нужна
Danil
r/ #BeAmazed Упавшее дерево может послужить галерей для собственных ручных работ
Nuxs🏴‍☠️
)))
Николай
Это решит только проблему того, что можно забыть инициализировать какую-то из функций контекста
Vasily
В общем, о правильности той или иной реализации я спорить не готов
Николай
Если таких функций 5 штук, как у Василия, то какой смысл их заворачивать в интерфейс
Nuxs🏴‍☠️
Выглядит прикольно
Nuxs🏴‍☠️
А препроцессор html там есть?
Nuxs🏴‍☠️
А, там есть DSL для html
Vasily
Красиво :
Vasily
Причем замылен только этот попап
Hog
https://www.amazon.com/dp/B08BDWYNWM
Vasily
ИМХО, тут Бугаенко должен платить, чтобы его читали
Mikhαil
https://www.amazon.com/dp/B08BDWYNWM
Надеюсь там страницы из мягкой трехслойной бумаги с ароматом каким-нибудь
Mikhαil
И с разлагаемой в воде обложкой
Mikhαil
Издательство Zewa
Roman
кто-нить смотрел Love Death Robots?
Shub
эпизод с коммивояжерами в пустыне - топ.