Это копия, сохраненная 3 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для игр
— https://ru.stackoverflow.com/a/609901/422180
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
6. Годные ютуб-каналы
— https://www.youtube.com/c/CODEBLOG
— https://www.youtube.com/c/AndreyShyrokoriadov
— https://www.youtube.com/c/DevJungles
— https://www.youtube.com/user/Shmachilin
Шапка: https://pastebin.com/HT7Hi6FD
Прошлый тред: >>2515951 (OP)
Ты можешь иметь всего одну подписку, которая будет добавляться в новый бутон при событии его активации, и удаляться из старого бутона, если она в нём была.
> 1. Validation takes place (automatically) before controller action no matter the attribute. I was a bit unclear on that point before.
> 2. In monolith web apps (e.g. returning Razor pages) code should check if the model is valid (as you’ve shown), but it’s only a check against already established (validated) model state, not a validation itself.
> 3. With [ApiAttribute] you get automatic 400 response with a list of validation errors.
> Since we’ve established validation takes place before any controller action, then you will never reach IsValid() check unless the model is already valid, thus making it redundant.
Почему в таком случае в 90% примеров веб апи продолжают включать проверку валидности модели?
В какой язык стоит погрузиться для изучения? Выбор стоит между C# и C++.
В С++ есть концепты с темплейтами, которые гибче дженериков. Есть умные указатели и в принципе в 2к23 можно на С++ писать без ручного управления памятью. На С++ можно писать маленькие крошечные программы-утилиты, в то время как на C# хелловорд будет весить 300 мб, либо же потребует от пользователя устанавливать фреймворки из интернета. На C++ написано больше кода и больше всяких либ. С++ намного более свободен и не зависит от одной корпорации. Вся инфраструктура языка открыта. С++ намного быстрее. А используя современные подходы к программированию на С++ уже не придётся сталкиваться с UB и утечками, как это было 10-20-30 лет назад. С++ полностью мультиплатформенный, хоть для БЭСМ пиши. С# - это винда + вялые имиджевые потуги на линух, в которые никто не верит. C# - это по большей части макакоразработка, в то время как на С++ есть и жирные вакансии на 700-1000к во всяких финтехах, трейдинге и крипте, и фундаментальные интересные задачи. С++ является батей C#, потому что весь рантайм C# написан на С++.
Почему в 2к23 нужно выбирать C#, а не С++?
> Почему в 2к23 нужно выбирать C#, а не С++?
Потому что кресты никому нахрен не нужны и работы для джуна там нет. А ещё в крестопараше нет нормальной системы управления зависимостями, на каждый пук нужно катать портянку в мейк файле, если что-то пошло не так тебе выдадут ошибку на несколько страниц, и разбирайся как хочешь. Также в крестах нет нормальной инфраструктуры, стандартная библиотека очень скудная, не завезли даже работу с сетями. В языке нет рефлексии, а значит и нормальной сериализации. Продолжать можно долго. Кресты уступают шарпу во всём, кроме скорости.
> С# - это винда + вялые имиджевые потуги на линух, в которые никто не верит
Толсто, пошёл нахуй.
Кроссплатформенный аналог С++ - это Java, а не C#. Именно она унаследовала всё, за что любят C/C++. Работает принцип: один раз написал - работает везде (на 4 миллиардах устройств без перекомпиляции).
А C# - это наследник Delphi с PascalCase-конвенцией. Название не должно сбивать с толку. Это обман.
>в принципе в 2к23 можно на С++ писать
Что ты собрался писать в 2к23-м? Основная работа разработчика сейчас это поддержка и доработка готового. А это значит, что ты погрязнешь в отладчике разбирая код хорошо если 2003-го стандарта. А что-то новое глобальное начинать на C++ слишком рисково, и мало кто решиться вкладывать бабки в такое. Так что хуй тебе, а не новые фишечки.
>в то время как на С++ есть и жирные вакансии на 700-1000к во всяких финтехах,
До-о-о, и берут конечно же пиздюков вчера только начавших учить плюсы. Ты лет десять будешь учиться и ебашить пока хотя бы запах таких вакансий почувствовать сможешь.
>трейдинге и крипте,
Тут проще в казино сходить, шансов больше. Ну и плюсы там вроде никому нахуй не сдались сейчас.
>фундаментальные интересные задачи
К которым тебя без корочки, а то и двух никто не подпустит.
>Почему в 2к23 нужно выбирать C#, а не С++?
Ты опоздал с выбором года на 3 где-то. В 2к23 совершенно похуй уже, что выбирать. Разве что только для хобби.
>в крестах нет нормальной инфраструктуры,стандартная библиотека очень скудная, не завезли даже работу с сетями
Boost является по факту стандартной либой, если тебе такое надо. Там есть всё как в дотнете. Но при этом есть и возможность и не тащить с собой то, что не нужно.
>В языке нет рефлексии, а значит и нормальной сериализации.
Потому что это никому не нужно, кроме ошивающихся рядом макак. Сохранение и чтение состояния пишется ручками и обычно его делают эффективным.
>что-то новое глобальное начинать на C++
Где нужна производительность - выбирают С++. Не карбон же, не раст брать. Они ещё сырые и разрабов нема. А что ещё брать-то?
>До-о-о, и берут конечно же пиздюков вчера только начавших учить плюсы.
Так можно про любой язык сказать. Речь о том, что время пройдёт, и ты уже будешь опытным разработчиком. И крестовик с 10 годами опыта намного ценней, чем такой же старый питонист. Банально выслуга лет на плюсах - выше всех ценится рынком. А вот в JS она скорее в минус идёт. JS - дело молодых.
>Тут проще в казино сходить, шансов больше.
В этих сферах крутятся бабки. Побольше чем даже в геймдеве.
>К которым тебя без корочки, а то и двух никто не подпустит.
Ну если тебе интересно численно моделировать какие-нибудь квантовые эффекты в высокотемпературных сплавах для авиации или обрабатывать петабайты с массивов радиотелескопов в разных концах страны и планеты, то скорее всего соответствующая вышка у тебя уже есть. Просто если ты будешь джавистом, то на такие проекты доступ тебе будет точно закрыт.
>В 2к23 совершенно похуй уже, что выбирать.
Сейчас государство будет топить айти в деньгах, будут импортозамещать всё и вся. Работы будет только больше.
>Где нужна производительность - выбирают С++
Не выбирают. Выбирают C#, а если нужна производительность - то её пишут на C++, а затем интегрируют в шарп.
>Сейчас государство будет топить айти в деньгах, будут импортозамещать всё и вся. Работы будет только больше.
Эх, бля. Если бы ты реально работал с государством ты бы так не радовался.
>если нужна производительность - то её пишут на C++, а затем интегрируют в шарп
>шарпомакака...
>пишет на C++
Представили? Посмеялись?
> Boost является по факту стандартной либой, если тебе такое надо.
Ни по какому факту стандартной либой она не является.
> никому не нужно
Поэтому во всю идут разговоры о том, что пора бы уже добавить рефлексию? Проснись, ты сериш.
>во всю идут разговоры
Обычная соевая пропаганда, она сейчас везде, буквально повсюду эти разговоры.
Ты можешь называть это как хочешь, но не нужно врать, что крестовики сидят на голой стандартной либе, а если нужно например регулярку заюзать, то им придётся искать васянолибы на каждый чих и полдня пердолиться с мейкфайлом или велосипед писать. Также легко как в шарпе всё делается уже очень давно.
>>551885
>во всю идут разговоры о том, что пора бы уже добавить рефлексию?
Рефлексия решает очень специфические и далеко не всем нужные задачи, но при этом затрагивает и засирает весь язык целиком. Нужно ли это в системном языке общего назначения, который позиционируется как предельно производительный? Комитет считает, что это не нужно.
>Также в крестах нет нормальной инфраструктуры
Для вкатуна может и да, но в крупных компаниях и фаангах есть свой самописный тулинг, который облегачет работу существенно. Ну и стандартные решения вроде буста и симейка никуда не делись, пакетные менеджеры вроде vcpkg и conan тоже уже давно существуют.
>>551759
>хуй тебе, а не новые фишечки
Везде, где работал, старались кресты обновлять до 14/17/20 стандартов. На 98/03 уже очень мало кто сидит. Как минимум 11 везде уж точно.
>>551759
>Ну и плюсы там вроде никому нахуй не сдались сейчас
HFT все так же на С++ живет (и частично на джаве), и никуда уходить не собирается.
>>551759
>К которым тебя без корочки, а то и двух никто не подпустит.
Смотря что интересное для тебя. Если вот это
>численно моделировать какие-нибудь квантовые эффекты в высокотемпературных сплавах для авиации или обрабатывать петабайты с массивов радиотелескопов в разных концах страны
то вышка конечно нужна, плюс нужно работать в профильной организации научным сотрудиником. Это не для рядовых разрабов задачи, а для ученых, для которых разработка дело второстепенное.
Если говорить именно про разработку, то какие-нибудь cloud/infra хуевины вроде видеостриминга, где нужно много данных отдавать в секунду с малыми задержками, все еще на крестах написаны. И на такие проекты вполне возможно с обычной вышкой попасть.
Для подстраховки надо учить то, где есть уверенность, что при необходимости сможешь по-быстрому доучить и вкатиться. С JS прокатит, с плюсами может не пройти, их обычно учат долго.
Как получить во всю длину?
Дебилы просто не понимают (или специально серут), что если в С++ завести фичи макакиных говноскриптов, то С++ превратится в еще один шарп или джаву. Но зачем еще шарп или джава, когда они и так уже есть? С++ нужен именно потому что это не макакин говноскрипт, которых и так полно как собачьего говна по весне. То есть, макаки просто хотят уничтожить С++, потому что он напоминает им об их ущербности. Свиньи хотят разрушить всё красивое и замазать своим говном чтобы было им удобно в этом говне лежать.
> Свиньи хотят разрушить всё красивое и замазать своим говном чтобы было им удобно в этом говне лежать.
Собственно так и появился C++, свиньям не нравилась красота и лаконичность сишки.
С++ содержит в себе всю красоту и лаконичность сишки, бери и пользуйся, никто не мешает.
Только С++ не ограничен сишкиной красотой только в теории, а на практике бесполезным говном, годным только для хеллоуворлдов и поделок для микроконтроллеров. Сишка была крутой в 80-х, когда компьютеры были так же примитивны как сишка. Но сейчас те времена давно ушли, сишка осталась за бортом истории, и король теперь её наследник С++.
>всё красивое
Это ты про C++, который состоит наполовину из архитектурных косяков, на вторую из попыток решения этих архитектурных косяков?
> С++ содержит в себе всю красоту и лаконичность сишки, бери и пользуйся, никто не мешает.
В таком случае c++ мне нахуй не нужен, хватит чистых сей. А вот сами кресты, если отойти от си тот ещё большой уродливый кусок костыльного говна.
> и король теперь её наследник С++
Король параши разве что.
>свиньям не нравилась красота и лаконичность сишки.
Только эта красота и лаконичность приводит к тому, что в любом хоть немного большом куске кода на Си будет изобретён свой особо уродливый DSL. Ага.
Это позеры и вкатуны. Тру-плюсовики лучше всех знают, что cpp говно. Просто выбора нет. Учат Rust и ждут Carbon.
Какой же смачный подрыв. Пиши еще.
Обычная техническая вышка есть у многих, не пизди. Везде, где работал, включая самые помойные галеры, вышка была почти у всех, а техническая минимум у половины.
Если ты после путяги или вообще не учился, ну земля пухом тогда. Серьезно, большая часть разрабов, что в РФ, что на западе хотя бы диплом помойного бакалавриата имеют.
Иногда хранимки быстрее и фичастее. Но, в целом, эти штуки я только у ораклоделов видел
Когда-то логику на хранимках писали. Да и до сих пор иногда пишут. SQL и реляционные БД в целом очень старая и древняя вещь.
>контейнеры не нужны, ошибки, классы
Теневые сотни миллионов офисных программистов-автоматизаторов екселя и ворда на самом популярном в мире языке программирования VBA как-то живут с этим.
Клоуны в любой тред набегают. В крестотреде срут шарписты и растовики, в джава-треде срут goвноеды и шарписты, в go-треде срут все. Разве что JS и петухон, там срать скучно, их и так жизнь обидела, поэтому срут в основном про ущербность динамической типизации и местных фреймворков. Ну и у 1С-ников и в пхп, где всё совсем плохо, можно срать совсем толстотой.
Скриптики на тыщу строк можно хоть на баше писать. Энтерпрайз не просто так для сервисов-миллиоников выбирает Java и C#.
>>552059
Очень редко встречал в профессии людей без вышки.
Такие были, как раз наверное 1 из 10 были без вышки или отчисленный с 1-2 курса. Такие люди могли быть очень даже технически грамотными и прошаренными в своём стеке, но ВСЕГДА такие люди были с нулевым социальным интеллектом, или как сегодня принято говорить, с тотальным отсутствием софт-скиллов, токсичные и странные, с которыми никто не хотел иметь дело.
Да по всякому жизнь складывается, может не получиться по разным причинам получить диплом. Но что мешает пойти на вечерний или заочный и сдать эти сраные экзамены и получить диплом, понимая, что он реально ценится и востребован и в РФ и за рубежом.
Stored это палка о двух концах. С одной стороны они намного быстрее и компактнее таких же запросов через тот же EF, с другой стороны у многих есть непреодолимое желание впихнуть туда бизнес логику, что приводит к усложнению поддержки кода и невозможности нормально покрытить эти части кода integration тестами.
В итоге stored procedures нужно пользоваться очень умело, описывая там только низкоуровневую логику связи с базой данных, а по возможности избегать их, если мы говорим о новых версиях .net core. По моему опыту они оправдывают себя, только в случае записи/удаления действительно больших объёмов данных (миллионы объектов).
>Тру-плюсовики
Тру-плюсовик не ждёт от мира подачек. Если ему что-то не нравится в существующих языках, он сам напишет себе свой LISP на LLVM.
Кстати, а не пытался ли кто-то впихнуть хранимки в сервиса? Ибо SQL-запросы билдить умеем, таблицы описывать умеем, чем хранимки хуже?
Не совсем понял куда ты предлагаешь их впихнуть, но использовать stored procedure необходимо только в очень безвыходных ситуациях даже несмотря на все их плюсы. Потому что они банально дороже в обслуживании такого же по функционалу кода в c# - их сложнее написать, их очень сложно дебажить, их сложнее поддерживать, смена версии базы данных может легко их сломать.
Я не говорю, что не стоит ими пользоваться и они говно, но в долгосрочной перспективе это почти наверняка будет стоить дороже.
>ржавом
ЯП для петпроектов.
Писать на нём очень сложно, очень долго, программистов не найти, все будут джунами.
Бизнес-ценность отрицательная. Только для души и for fun.
>Не совсем понял куда ты предлагаешь их впихнуть
Банально описывать хранимки C#-кодом и компилировать в код СУБД по миграции.
В теории должно помочь с сопровождением и дебагом.
>но использовать stored procedure необходимо только в очень безвыходных ситуациях
Надеюсь ребят, которые описывали бизнес-процессы на PL/SQL поувольняли к хуям.
>ЯП для петпроектов.
Используют там же, где и C/C++. Уже видел вакансии на системщину и HFT.
А вот тех, кто тащит это в веб нужно кастрировать.
Лично я нет. У меня были в школе знакомые, которые пошли учиться на компьютерщиков в ПТУ местное, часть из них сейчас на обычных гречневых работах просиживает штаны, кто-то на завод работягой пошел, кто-то в монтажники и техподдержку, кто-то дальше на вышку пошел и теперь 1С ковыряет, а кто-то уже ушел из жизни по разным обстоятельствам, один вот в СВО погиб недавно, мобилизованным был.
Стоит понимать, что в путяги народ идет не от хорошей жизни, как правило там собираются самые низы общества. При этом окружение очень большую роль играет в сознании как ни крути. Чел, который закончил 9 классов в мухосранской сош, кое-как получил аттестат и ушел в путягу на компьютерщика, будет сильно отличаться от условного выпускника 57/СУНЦ МГУ, который потом еще в ВШЭ или МФТИ отучился.
Хм, да вроде нет, у нас в колледже и мажоры всякие были, которым уже после 18 покупали и машину и квартиру и шарага при МГИМО.
Надеюсь получится работку найти без вышки, в прошлый раз это не было проблемой какой-то.
> Банально описывать хранимки C#-кодом и компилировать в код СУБД по миграции.
> В теории должно помочь с сопровождением и дебагом.
Написать компилятор шарпа в хранимые процедуры, да ещё и дебаг прикрутить - это нереально сложная задача по сравнению с генерацией альтеров и селектов.
>Уже видел вакансии на системщину и HFT.
Сейчас и на делфи и на ДРАКОН можно до сих пор кое-где устроиться работать. Всё это флуктуации и самодурство отдельных личностей, которые не умеют считать деньги.
В реальности внедрятели раста гарантированно кончат как в этой статье с хабра.
Вышка на сегодня в РФ - это просто некий базовый фильтр совсем конченного отребья. Ведь абсолютно любой днарь сегодня получает вышку. Кто-то идёт и чему-то учится. Кто-то просто идёт за корочками, и просто учится решать вопросики. А вот ты ни того ни другого не осилил.
Вот попробуй мне как HR-у объяснить, почему у тебя нет вышки? Ты конечно можешь вскукарекнуть, что вышка не нужна, что вон в гугле уже без ВО берут... Только кто ты такой, чтобы такое рассуждать? Из твоих уст это ничем не обоснованное оправдание.
Единственное что ты можешь сказать: да, у меня нет вышки, но я ведь на многое и не претендую. Просто относитесь ко мне как к человеку второго сорта и платите соответственно, и я не буду ждать повышения, просто буду делать безропотно самую черную и грязную работу.
Я тебе поясню, что для профильных знаний вышка совершенно бесполезна и никакого желания просиживать штаны для корочки у меня нет.
Но да меня насчет вышки вообще не спрашивали.
Средние показатели на то и средние, хз, мож в будущем на заочке можно будет найти варик, где можно проплатить
>для профильных знаний вышка совершенно бесполезна
Да кто ты такой, что бы так рассуждать? Ты ноунейм-вкатыш с улицы, ты даже не джун. Что ты знаешь? Ты просто наглый, самоуверенный и глупый - вот именно такое впечатление ты производишь.
А человеку, который в IT достаточно долго, почти наверняка приходилось иметь дело с линейной алгеброй, с численным интегрированием, с численной оптимизацией, с математической статистикой, с какими-то разделами физики. Это даже не говоря про базовый computer science, если речь сугубо про айти.
Да даже орангутангам-фронтендерам, которые кнопки двигают, рано или поздно приходится всё же задаваться вопросом, почему преобразование координат реализовано через умножение матриц.
> Ты просто наглый, самоуверенный и глупый - вот именно такое впечатление ты производишь.
Таких называют амбициозными, это куда лучше аутиста из вуза, который билетики перед зачетами заучивал или на удачу надеялся и в итоге не знает ни мат стата, ни физики, ни computer science, ни английского, ни каких-либо профильных знаний.
>Таких называют амбициозными
В продажах и агрессивном маркетинге тебя с руками оторвут. А в айти ты такой не нужен.
Задавайте ответы.
В каком НИИ работаешь?
Да, зато в айти нужны аутисты, которые имеют те же знания максимум 11 классов, но зато с коркой?
Ты же сам знаешь, что в вузах преподают максимально аутдейтед хуйню и нет никакой гарантии, что студент хоть какую-то базу подберет и не забудет уже в следующем семестре.
В общем-то, я проходил 3 собеседования и меня на счет вышки не спрашивали, зато спрашивали какие технологии я знаю и по сишарпу вопросы задавали, заценили, когда я сказал, что Рихтера читал, на одном я не прошел потому, что слишком далеко жил и не хотел переезжать, на другом была проблема с приписным и военником, а на третьем я на тестовое забил вообще, так как думал, что на втором примут и мать проблемы с военником быстро порешает Спойлер - нет, посмотрим, как оно сейчас будет, знаний сейчас у меня гораздо больше, чем тогда, даже по англу.
корпорат, спок
Чел, без ВО в айти есть работа, есть программисты. Это так. На макакоработу тебя конечно возьмут. Просто может ты хочешь большего? Где-то ты подойдёшь по всем критериям, но тебя забракуют на финальном этапе по формальному критерию. Оно тебе надо?
Ты говоришь, что в ВУЗе не дают знаний. ОК. Ну так получи хотя бы ачивку. Найти паршивый ВУЗ с вечеркой или заочкой за 15к в год. Покажи, что ты умеешь решать вопросики и достигать.
А про знания в ВУЗе. Ну кому хочется, тот их получает и в заборостроительном. В ВУЗе дают фундаментальные знания, математику и физику, которые в зависимости от задач, не меняются уже от 100 до 400 лет. Даже в CS всё, чем мы пользуемся сейчас, кроме передовых ИИ, придумано лет 30-40 назад а то и раньше.
Хз, как там на уровнях повыше, но устроиться с профильными знаниями явно легче.
У меня есть знакомый с вышкой, он вообще собеседовался на стажера, на одном из собесов его завалили на вопросе про ООП, ясен хрен, что ни про какие принципы SOLID он не слышал, в вузике максимум UML преподают, да и то оно не запоминается.
> В ВУЗе дают фундаментальные знания, математику и физику, которые в зависимости от задач, не меняются уже от 100 до 400 лет.
О чем ты вообще говоришь, физика там максимум первый курс, математика да, но диплом можно пройти тупо ничего не запоминая и зазубривая билет/списывая, либо вообще преподу понравиться и получать автоматы, так что не факт, что чел с ВО ее вообще знает выше уровня 8 класса.
>я не спортсмен-спринтер, сижу за компьютером, поэтому ноги не нужны
>поэтому лучше пойду в больницу сделаю ампутацию
Охуительные истории от срущего шарподебила. Типичный интеллект макаки, и вот эти выродки рассуждают о С++. Тьфу, погань.
Ты же сам себя только что обоссал.
И на этом все, думаю тут больше нечего обсуждать.
Мне немного страшно, что может попасться реально такой эйчар, который скажет "А ну нет вышки, тогда пошел нахуй, без корочки не пущу", но да я думаю на такого всегда найдется другой, которому похуй, а для иммиграции опыт работы в 4-6 лет ценится так же, как и вышка.
Лучше опиши, кто ты, джун, миддл, сеньор, какой стаж работы, работаешь в госконторе или на частника?
это небось прошлотредный "джавист"
Вот она - вся сущность лицемерного петушарпера. Гоните петушарперов, насмехайтесь над ними!
Петушарп позорное дерьмо, кресты довольно уважительный язык, но к сожалению устаревший сильно.
Выбирай Java. Это как петушарп, только оригинал и всё ещё лучше.
>Ты опоздал с выбором года на 3 где-то.
Опоздал - это 2030. До этого ещё можно изучать программирование хотя бы для того, чтобы апнуть скилл мышления.
>ну мам это ни у меня горит нигорит поняли да нигорит! ну почему вы ни верите я жи сказал нигорит
Тебе на джуниора не будут задавать хардкорные вопросы. Будут смотреть просто на глубину, которую ты сможешь докопать на тот или иной вопрос
Забей, я нашел в одном из прошлых тредов пайплайн
К примеру, захотел к WrapPanel привязать ViewModel, а хуй те с маслом — нет у него DataTemplate. На SO предлагают вот такую конструкцию (пикрил)
https://stackoverflow.com/questions/8258410/how-to-set-wrappanel-itemsource-to-list
При работе с другими контролами, к примеру, при событии SelectionChanged я получал экземпляры не View-итемов, а Model-итемов из списка ViewModel и это было очень удобно. Проблема в том, что теперь возвращаются данные Model-итемов, НО завернутые в ConentPresenter. Ебанина какая-то. Весь SO напичкан именно этим примером, а как с ним работать — хер знает.
Я не могу биндить список Selected, потому что буквально каждый итем завернут в эту скорлупу под названием ConentPresenter, от которой мне надо как-то очищать, либо держать два списка + тратить ресы на "выколупывание".
Енджой йёр петушарп.
А что делать тем, кто прочитал, офигел от того как ты пытаешься забивать болт молотком - и теперь психологическая травма?
>С TREEVIEW хоть разобрался?
Хуйня какая-то получилась, если честно.
WrapPanel еще хуже.
Все это приправлено ссаными словарями ресурсов.
>>552942
>пытаешься забивать болт молотком
Ну на первый взгляд, у меня перед глазами только болт и молоток. Меня уже воротит от этих контролов, когда речь заходит а кастомном стиле. Даже ссаный "итем селектор" уже имеет ворох визуальных свистоперделок, не говря уже о производных контролах.
ну хз че у тебя за болты, что молоток нужен
WrapPanel - он как и StackPanel, то есть отвечает за компоновку, а не является контролом списка.
А за списки с биндингами отвечают списковые контролы. У них можно переопределить панель, хотя лучше это делать с умом и сразу думать про виртуализацию иначе уже на 10к итемов получишь 100% загрузки cpu и зависнет все.
>SelectionChanged я получал экземпляры не View-итемов
тут предпочитаю иметь свойство у вьюмодели итема IsSelected, а не мудрить с отдельным списком выделеных - тогда можно же и со стороны вьюмоделей выделять и это синхронно будет видно в списке.
Ты эту статью читал хоть? Там чувак реально потащил раст в бэкэнд.
>тут предпочитаю иметь свойство у вьюмодели итема IsSelected,
Такой параметр у меня тоже есть, но служит исключительно для визуальной части.
>а не мудрить с отдельным списком выделеных
А как дальше? Вот у тебя каждый пук: удалить, переместить, переименовать должен рыскать по всей иерархии итемов в поисках флага IsSelected?
> У них можно переопределить панель
А разве на пикриле >>552918 не так сделано? ItemsControl это базовый класс списковых контролов. Дальше уже идет Selector у которого ебучие визуальные стили.
> сразу думать про виртуализацию
Вот про это надо почитать. У меня дерево жрет дофига ресурсов, там у каждого итема есть растровый имидж.
>удалить, переместить, переименовать
какая то проблема? аж целый Where
тем более для удаления и перемещения это все равно нужно делать. При этом никто не запрещает забиндить селектедитемс, но зачем
>не так сделано?
так. я всего лишь упомянул что эти панели компоновки могут быть использованы так, но не используют виртуализацию и сильно бьют по производительности если список большой.
>Вот про это надо почитать
это не нужно читать. это нужно гуглить реализацию нужной панели с виртуализацией.
>это не нужно читать.
Ну я про это вообще не знал. Загуглил про TreeView, активировал
VirtualizingStackPanel.IsVirtualizing="True"
но толку ноль. У меня при каждом открытии ноды все больше оперативной памяти занимается, а при закрытии остается такой же.
Там виртуализация тоже не всегда работает и не со всеми итемами.
Это всего лишь флаг что нужна виртуализация. contentpresenter умеющий в виртуализацию учитывает этот флаг. Тому, кто не умеет, бесполезно его писать.
А потому сразу нужно гуглить virtulizing wrap panel и смотреть лисапеды, например это https://github.com/sbaeumlisberger/VirtualizingWrapPanel
>Можно было бы отправить их все в отдельную таблицу и тащить по foreign key
Это нормальное решение. Можно сделать шарды по юзерам, если хочется.
>можно скомпрометировать финансовую инфу сразу всех юзеров
Как? Если вытащат всю БД, то жопа будет в любом случае. Лучше подумай о транзакциях и консистентности.
>в плане scalability
Сразу ограничивай свои хотелки по scalability. Не пиши приложение для сферических нагрузок в вакууме.
C++ в вакууме никому не нужен. Нужна системщина, HFT, рассчёты и геймдев.
Как использовать js в представлениях razor pages/mvc? В доках тема не освещена. Не надо мне писать про веб апи.
Спасибо!
Благодарю.
>Можно сделать шарды по юзерам, если хочется.
>Лучше подумай о транзакциях и консистентности.
Это по каким понятиям нагуглить можно? Никогда таких терминов не слышал.
Олсо, не проще ли сразу писать под максимальную нагрузку на всякий случай? Или это потребует чересчур много усилий?
Это какой-то старый баг зависания еще для net framework.
А у меня вроде как вирутализация работает т.е. не загружает всю иерархию целиком, а постепенно по мере открытия папок, но не выгружает.
Я бось, что у меня в итеме что-то такое, что не дает ему подохнуть. Знал бы я как итемы выгружаются и поможет ли IDisposable. Надо будет создать тестовый итем без лишнего дерьма и проверить.
Ну или вообще отказаться от MVVM. У меня уже был экземпл, где ноды подгружаются и выгружаются по мере их раскрытия или закрытия. Видимо не зря так было сделано.
>Никогда таких терминов не слышал.
Чел. Я надеюсь, что ты только вкатываешься и никогда в жизни даже не смотрел на продовый бэк.
Если интересно - читай "высконагруженные приложения" Клеппмана. Та самая, с кабанчиком.
>>553571
>Олсо, не проще ли сразу писать под максимальную нагрузку на всякий случай? Или это потребует чересчур много усилий?
Именно так долбоёбы-стартаперы и пишут. Потом приходит дзен.
У тебя в принципе нет "максимальной нагрузки". Один юзер с миллиардом транзакций и миллиард юзеров с одной транзакицей - это совершенно разные типы нагрузки. А распределена ли нагрузка географически? А какие требования к консистентности? А требования к изоляции транзакций? Можно ли отображать юзеру устаревшие данные? А что если для одного юзера сделаем транзакцию одновременно? Как реплицировать будем? А если кластер расхуярит, что будет? А серверов-то на это сколько нужно? Кэшировать как будем и что? И так далее, поотвечай на такие вопросы. Всё это будет влиять на инфру и архитектуру.
Я поэтому и говорю: возьми не проект из вакуума, а что-то реальное, о чём можешь говорить с точки зрения пользователя. Например, приложенька для подсчёта расходов. Не бери чистый финтех - это хардкор. Считай примерное количество пользователей и сколько пользователь может добавить записей и каких и как часто. Бери с запасом. Думай как приложенька может развиваться. Думай как отдавать данные анальникам.
Декомпозируй задачи на как можно более мелкие задачки. Тогда все станет понятно.
UPD. Лучше вообще начать с фронтенда. Так будет проще допиливать бекенд по маленьким кусочкам.
>Чел. Я надеюсь, что ты только вкатываешься и никогда в жизни даже не смотрел на продовый бэк.
Зис. Поэтому я думаю мне пока не стоит лезть в такие сеньорские дебри, задача стоит получить позицию стажера/джуна. Запилю тогда просто в одну таблицу думаю. И еще вопрос - какую лучше юзать авторизацию? JWT или родной ASP Identity? Именно в контексте того, что будут потенциально требовать на работе.
>Поэтому я думаю мне пока не стоит лезть в такие сеньорские дебри, задача стоит получить позицию стажера/джуна.
Тогда просто почитай про РСУБД и key/value-СУБД, для начала этого хватит. Хотя бы базовые понятия вроде транзакций на уровне БД и индексов. Обязательно потыкай SQL руками, благо его можно перетыкать почти весь за 3 часа.
> JWT или родной ASP Identity?
jwt, кнш.
>JWT или родной ASP Identity?
Вопрос уровня какой фреймворк использовать - web api или родной asp.net
Недавно осознал насколько меня балует Нугет. В новой галере бэк на джаве, я пишу тут чисто фронт.
Недавно проповедовал говноедам что в точкаНЕТ есть менеджер пакетов который тебе качает строго точные версии, ещё и проверяет конфликты и в случае если есть несовместимые штуки твой проект даже не собирается.
Оказывается в джаве нельзя просто ебнуть рестор пакетов и иметь гарантии что ты получишь буквально точную копию проекта.
Когда я этим докер ебланам рассказал что шарп приложение умеют себя собирать включая все свои зависимости прям в билд и не требуют вообще никакой настройки хоть в линуксе хоть в винде, то на меня смотрели как на ебанутого.
В конце я им рассказывал про ЕФ и как он может играюче выдать тебе данные с Оракла, Постргри и МССКУЛ без каких-то проблем
Лучше никому не рассказывай об этом. Пусть это будет нашим секретом.
> Когда я этим докер ебланам рассказал что шарп приложение умеют себя собирать включая все свои зависимости прям в билд и не требуют вообще никакой настройки хоть в линуксе хоть в винде, то на меня смотрели как на ебанутого.
Ну да, а смысл тебе про мавен рассказывать, ты всё равно продолжишь нести какую-то хуйню, даже минимально не разобравшись в вопросе.
просто я смотрю на все эти фреймворки тысячи их и у меня просто в голове крутится ну и нахуй мне тащить в проект 100500 функционала который не понадобится никогда
Сервис электронной очереди.
>что-то с 3.5
А был ли для него тогда нормальный DI из коробки? По моему нет. Что похоже и привело к появлению зоопарка из разных unity, ninjet, autofac и т.д.
Вот ненадо так нахваливать нугет, эта ебала у меня сама постоянно отваливается - если нужно сменить версию пакетов и версию фреймворка проекта, все туши свет, нугет ебанеться с ошибками вероятностью 90%. И нужно будет руками редактировать версии пакетов в csproj или оттуда же убирать ворнинги и ошибки.
ты смешал мух и котлеты
мввм это просто паттерн "кто о ком знает и за что отвечает"
вид просто за отображение
механизм биндинга позволяет декларативно связать все воедино
при этом иногда приходится писать свои бехавиорс или атачед где внутри как раз та самая "ручная реализация биндинга с привычным событиями контролов"
в случае treeview косяк именно в виде. Кривая реализация...наверное. Вон датагрид тоже группы виртуализирует плохо. Что вообще эта виртуализация? всозможность не создавать заново инстанс итема (то есть контрол)
и тем самым экономить на некоторых шагах? но ведь все равно же нужно поменять DataContext у существующего итема. и сделать работу
А сколько вообще держать этих итемов в кеше? Вон в том же TreeView проблема иногда решается установкой MaxHeight.
Да и память растет -а ты уверен что растет именно то что кешируется?
>>553910
то что DI майков в асп.нет не значит что он только там
он называется в нюгете
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection.Abstractions
модулям раздаешь Microsoft.Extensions.DependencyInjection.Abstractions, а основная программа юзает Microsoft.Extensions.DependencyInjection и модули регистрируют себя по аналогии как это в асп.нет сделано.
просто и удобно
Не сравнялись и не сравняются.
На метаните много ошибок. Там надо ещё проверять, что написано.
>Оказывается в джаве нельзя просто ебнуть рестор пакетов и иметь гарантии что ты получишь буквально точную копию проекта.
Я хуею с манямирка петушарподегенератов.
Так оверкилл же. Я вчера весь день читал/смотрел про этот DDD и в основном говорят, что он даже в очень жирных проектах не всегда к месту.
Читай документацию и не выёбывайся плиз.
Забей хуй. Во-первых, там особо ничего не меняется. Во-вторых, конторы оче медленно обновляются. Многие до сих пор сидят на 3.1, а некоторые динозавры вообще на легаси .NET Framework.
Забей хуй. Во-первых, там особо ничего не меняется. Во-вторых, конторы оче медленно обновляются. Многие до сих пор сидят на 3.1, а некоторые динозавры вообще на легаси .NET Framework.
А кроме как по книгам учить нельзя? (спрсил я который ни одну книгу ни по одному языку не прочел)
ну тогда никак )
нет не офф доки, ни ресов типа професссорвеб или метаинит, ни миллиона статей на ресах типа хабра и это только в ру сегменте. ничего этого нет.
Этот профессор же лютое старье по фреймворку. Метанит новое, но доверия не вызывает. В комментах постоянно пишут, что много ошибок в статьях.
Остальные ресурсы разрозненные и не дают полной картины.
Ну просто я вот встаю с утра и мне надо четкий план по изучению на день, но вместо этого листаю интернет полдня, а потом уже голова устаёт и не могу учиться. В итоге результат нулевой. И так день за днём нулевой прогресс.
Без англюсика тут никуда, вот прям вообще, ты даже загуглить толком ничего не сможешь, а это 95% работы, плюс клевые курсы и книги тоже не переведены, так что бери словарь и страдай.
Хуясе. Т.е. ресурс где буквально описаны все классы, со всеми методами - это по твоему "относительно маловато"? 'Относительно' чего?
Схуяли? Пишу сейчас микросервисы на заказ, там вполне себе DDD применяется.
Просто попили на слои и достаточно будет.
>Ну просто я вот встаю с утра и мне надо четкий план по изучению на день, но вместо этого листаю интернет полдня, а потом уже голова устаёт и не могу учиться. В итоге результат нулевой. И так день за днём нулевой прогресс.
В твоем случае - платные курсы или ментор. Я без рофла. Не можешь сам - плати бабки.
Метанит безусловно прикольный ресурс, но ему нужны рецензенты, потому что там один чел все статьи пишет.
Вот почему я всем советую читать книги? Да потому, что их проверяют перед изданием несколько людей и это как правило какие-нибудь профессора в области компьютерных наук.
Вот только вот Microsoft Press издаёт рекламно-религиозные тексты. Последние лет двадцать.
Я про МСДН говорил.
У тебя большие проблемы. Тебе не помогут книги и даже курсы с менторами. Даже если тебя будут обучать лучшие преподы, ты будешь говорить, что тебя неправильно обучают. Не ищи свежую информацию. Не ищи мега полную информацию. Такого не бывает. Все устаревает, везде чего то не хватает, везде есть ошибки. Пойми, что информация тебе ничего не даст. Информацию нужно не только поглотить, но и переработать. Потом усвоить на практике. Это целая цепочка сложных процессов. Это гораздо важнее объема и качества самой информации. У тебя сдвиг ценностей. Чтобы учиться программировать, важно программировать. А у тебя зацикленность на важности информации. У тебя сложный случай. Так все текстом в одном посте не объяснишь.
https://ru.hexlet.io/blog/posts/traps-learning
Советую применить проблемно-ориентированное обучение. Так например учат в school 42. Ты не должен заготавливать информацию. Ты должен иметь задачи и отталкиваться от них. Вот есть задача, ты ищешь информацию, которая поможет решить задачу. Так ты получаешь только нужную информацию и в конечном итоге имеешь решенную задачу, а не просто прочитанный текст. Это очень мощный метод обучения программированию. С первого дня ты погрузишься как бы в боевую обстановку, а не обстановку лайтового обучения.
Ну как описаны, вот это немного жидко, мне бы примеров где оно нужно и зачем вообще и почему мне не похуй должно быть.
Но зато я понял, что можно иметь несколько Startup классов и один из них будет выбираться в runtime в зависимости от переменных среды, а еще у майкрософтов к нужным темам внимание уделяется, вроде хоста, про dependency injection я и так знал, но почерпнул для себя новое
Смотрите. Я делаю пакмена в консоли.
Но не суть. Суть вот в чем. Я хочу сделать систему событий.
И вот что я сделал.
Оно - работает. Но проблема в том, что мне не нравится это вот решение.
Причин - несколько.
Самая главная, это то - что Dispatch может кто угодно дергнуть.
Вторая, что я оборачиваю Action<T> в Action<Event>;
Третья, что чтобы отписаться - нужно id где-то хранить
Четвертая, я подозреваю, что если много кто подпишется - List<Event> который в словарике - не уменьшится, когда они все отпишутся, так и будет висеть выделенный огромный массив
Может быть еще какие-то проблемы есть, но это те что я вижу.
В общем. Если вам не сложно - дайте советов по коду. Как сделать нормально?
Суть-то в чем. В том, что я хочу просто сделать в лупе:
while(GameRun)
{
HandleEvents();
Update();
Draw();
}
Вот для первого HandleEvents() эта срань и придумана. Но чет оно меня сейчас смущает.
Ты же специально оверенжиниришь чтоб подзадрочиться? Я чуть было не блеванул от кодца в стиле 2000-х
1. Dispatch можно спрятать за интерфейсом чтоб его не видели подписчики
2. Т наследется от Event же? в чём именно нюанс?
3. Можно использовать референс handler-а вместо айдишек. Так например работает встроенный event
4. Похуй, List же умеет ресайзиться
1 нах гуиды. верни хотя бы Disposable token
2 lock при вызове события? ну ок, пусть весь мир подождет
Далеко ходить не будем, вот на Амазоне:
https://www.amazon.com/Books-Microsoft-Press/s?rh=n%3A283155%2Cp_27%3AMicrosoft+Press
Эта книга знакомит читателя с объектно-ориентированным программированием, и автор предлагает начать обучение с реальных программ в среде Windows. Новый язык программирования Microsoft C# (произносится «си-шарп») — очень мощный и в то же время простой в использовании. Он высоко ценится современными ИТ-специалистами и является хорошим выбором для тех, кто только ступает на путь программирования.
Visual C# Express упростит первые шаги в постижении программирования, а после прочтения книги вы сможете двигаться дальше, постепенно усложняя задачи. Узнайте, как создать класс в C#, который инкапсулирует любые свойства! Легко создавать новейшее высоконагруженное программное обеспечение, легко исправлять, легко отлаживать! Итак, самое главное: наслаждайтесь освоением мира программирования! Зарабатывайте!
Потому что в первом случае - ты присваиваешь переменной Nullable значение.
Во втором - ты используешь сахарок, который не предусматривает Nullable
Ну. Типа чтобы тебе было понятно, можешь в первом случае сделать так:
var ld = dod.HasValue ? dod.Value : DateTime.Now;
В этом именно и разница.
Если в первом случае - заменишь : DateOfDead на : DateOfDead.Value - получишь именно что DateTime, без Nullable
Понятно всё. Специально говна откопал, 20+ летней давности, когда любые книги по IT выглядели одинакого говёно, не зависимо от издательства.
https://www.microsoftpressstore.com/store/browse/programming
Могу я хоть быструю сортировку в твоих книгах посмотреть? Или погромистам с горящими глазами такое не нужно?
а нужно? использовать книгу как справочник это дичайшая дичная дичевая дичь
Большой это какой?
150к строк бекенда и 90к фронтенда - это большой или маленький проект?
А че они тогда трясутся от любых обновлений либ и упорно суют своего говно в докер, хотя я им предлагал спокойно настроить все и лить по сфтп. Стенд закрытый и поэтому нельзя в конвейере СИ/СД запускать скрипт установки их ебучего докера и надо через виртуальный стол(ога консоль не завезли админы заказчика) руками ставить.
>Когда я этим докер ебланам рассказал что шарп приложение умеют себя собирать включая все свои зависимости прям в билд и не требуют вообще никакой настройки хоть в линуксе хоть в винде, то на меня смотрели как на ебанутого.
и правильно смотрели. потому что это речь только про зависимости шарпа, ну и там где создатели либ заморочились сборкой нативщины. Иначе привет бубен
> трясутся от любых обновлений либ
Потому что в джаве на хую вертели обратную совместимость. Дохуя проектов сидят на восьмилетней Java 8 тупо потому, что на более новых жабах то сервер приложений не стартанёт, то спринг срёт стектрейсом при запуске, то ещё какая-нибудь залупа.
> упорно суют своего говно в докер
Серверные приложения легче разворачивать в докере. Похуй, на чём они написаны, хоть жаба, хоть PHP.
микроскопический
>только про зависимости шарпа, ну и там где создатели либ заморочились сборкой нативщины. Иначе привет бубен
У тебя буквально все нужные длл кладутся всегда, селф сборка просто суёт туда дотНЕТ нужной версии чел
в глаза долблюсь, в обычной студии только удалять и новый делать через ctrl+RV...
Ну так он независимо переименовывает аргументы в интерфейсе и в методах классов, его реализующих.
IMyInterface { void Call(int orgumnd) }
MyClass1 : IMyInterface { public void Call(int orgumnd) {} }
MyClass2 : IMyInterface { public void Call(int orgumnd) {} }
Как в одном месте переименовать orgumnd в argument?
Если желающие, поработать над совместным проектом под unity? За интерес.
Плюсы были крутыми в нулевые, когда компьютеры были так же примитивны как плюсы. Но сейчас те времена давно ушли, плюсы остались за бортом истории, и король теперь их наследник С#
>длл кладутся всегда
ну класться они могут. работать..нет
вот пример https://github.com/shimat/opencvsharp/issues/1085
и от селфсборкости и шарпа ничего не зависит.
и тут можно начать "нууу это автор либ просто не позаботился об актуальных и рабочих нативах, ну да бывает, ну поставь в систему, не ставится? ну возьми старее систему"
а я тебе в ответ - так именно эту проблему и решает докер.
да, в основном ничего делать лишнего не нужно, но это не всегда. Более того докер это не только изоляция, а и про деплой.
> Когда я этим докер ебланам рассказал что шарп приложение умеют себя собирать включая все свои зависимости прям в билд и не требуют вообще никакой настройки хоть в линуксе хоть в винде, то на меня смотрели как на ебанутого.
Правильно смотрели.
Собери мне под какую-нибудь железяку со своим линуксом и armv7 все, чтобы без пердолинга.
На сях, я хотя бы включаю статичную сборку, да, раздуваю бинарник, но потом просто с флешки закидываю и как человек могу на любую железяку закинуть.
Тут - я должен, блядь, все зависимости нативные найти, найти нужные версии, со всеми проверить. Это пиздец какой-то.
Я чет не понял. Может проблема в этом:
>все зависимости нативные найти
У тебя проект не на чистом сишарпе, а оливье из шарпа и с/с++ и подобных же либ?
Нативную сборку прог на шарпе под винду и линух обычный я делал и всё работает без проблем и думать негде там.
Дотнету - нужны зависимости, которые он с собой не таскает. Тот же openSSL, glibc нужной версии и прочее.
И потому - ты не можешь просто на линукс с busybox закинуть .net и приложуху на чистом шарпе и радоваться.
Программулину на си/плюсах ты просто собираешь, кидаешь на железяку и радуешься.
>ты не можешь просто на линукс
Не нужно. У нас в конторе на IIS на винде всё крутиться нормально, недавно 4.8 ставили.
>Дотнету - нужны зависимости, которые он с собой не таскает.
А почему дот нет их с собой не таскает, а программы на си/плюсах - таскают или обходятся без них?
В чём проблема дотнету сделать для этих зависимостей то же, что делает msvc для аналогичного кода на крестах?
На плюсах - я могу просто статически слинковать все что мне надо и в моем бинарнике - будет, по сути, копии тех библиотеки, которые мне нужны(да, раздуваем размер бинаря, но если сравнивать с .net'ом, то даже так - это копейки).
Теперь про дотнет.
Сам рантайм .net - почему-то рассчитывает, что часть библиотек - будет в системе. Если не будет, ну, веселись с поиском тех либ, что нужны тебе. И при этом - никакой возможности собрать приложение, чтобы оно все-все-все нужное таскало с собой - нет. Это приводит к очень веселой ситуации, когда чтобы хелловорлд проверить - тебе приходится качать докеровский образ .net'а с дистрибутивом, максимально близкми к тому, что на твоем железе, выковыривать из него либы, рассовывать их по папочкам, чтобы просто запустить хелловорлд на железяки и пару бенчмарков, написанных на .net'е. Оч весело и прикольно.
> msvc
Я кстати про MSVC - не говорил. Плюсы, с тулчейном на основе gcc, пишем в code::blocks(я, единственный мудень, что пишет в vim)
Ну ок, можно посмотреть IL код, где вызываются функции этих внешних зависимостей и как на них ссылаются, и написать, скрипт, которых их подменит на приложенные рядом файлики под нужную систему.
Такие проблемы джуны 1+ года стажа должны уметь решать.
Пиздеть - не мешки ворочать.
Не я тут писал, как удобно и без пердолинга в дотнете на линуксе.
Перекатываюсь из 1с, тестовое задание сделал как-то по наитию
>можно посмотреть IL код, где вызываются функции этих внешних зависимостей и как на них ссылаются, и написать, скрипт, которых их подменит на приложенные рядом файлики под нужную систему.
>шарп приложение умеют себя собирать включая все свои зависимости прям в билд и не требуют вообще никакой настройки хоть в линуксе хоть в винде
эт твои слова? братан? это где в каком мире в какой реальности ил просеивать чтобы функции зависимостей найти и шкрепты писать не пердолинг?
А смысл накануне 2к23 уходить из 1С в пендосский шарп?
В 1С будут бабки, будут заказы. А шарп в РФ будет гнить и умирать.
Проходи мимо.
Краткий справочник Албахари наверни перед собесом. Там 250 страниц, можно за пару часов непосредственно перед прочитать.
Ебать, две страницы в минуту.
Хочу научиться прогать на С#, интересует веб/игры.
Но есть нюанс: у меня макбук на м1.
Кто пробовал дотнетом заниматься на маке? Какие подводные камни? Может быть стоит сначала на винде поучиться?
Вот вам и хваленная кроссплатформенность и обратная совместимость! Извольте каждый год переписывать свои проекты под новую версию.
ты эта...мух из котлет не делай.
хваленная кроссплатформенность и обратная совместимость - это когда я могу взять и подкинуть к своему дотнет 7 (по факту core же) проекту либу, которая скомпилена на дотнет 4.6 и все будет работать, и под линуксом в том числе
А ASP.NET это набор либ. А для либ абсолютная норма что там от версии к версии могут быть брикинг чанджес и мало ли что еще. И поэтому в дев мире принято локать конкретные версии при разработке чтобы на продакшене разворачивались именно эти и никакие другие ибо "мало ли что там забрякоченжилось". И потому обычны мануалы "миграция на такую то версию либы"
Потому от тебя и требуют конкретной версии набора либ (описано в файлике .runtimeconfig.json)
Во-первых, дотнет 6 стоит, но среда выполнения подхватывается почему-то 7, а не 6. Как заставить выполнять в 6 - не понятно.
Либы как правило есть все от 1 до последней. В дотнете же старых версий просто нет, их удаляют и заменяют новыми. Имея старый проект на руках, через некоторое время его уже не запустить. Единственное, запрещать все обновления, что сама же винда не выполняет и обновляет вопреки мнению пользователя. В итоге со временем любой проект на дотнете становится нерабочим.
>В дотнете же старых версий просто нет, их удаляют и заменяют новыми
не соглашусь. И хоть это винда, но судя по доке про убунту
"dotnet --list-sdks Используйте команды и dotnet --list-runtimes , чтобы узнать, какие версии установлены. "
в линуксах такая же мультирантаймвость.
Да, если такие пакеты есть в репозитории, то можно установить, а есть дистрибутивы, где старое удаляют.
возможно старый дотнет, что кончилась поддержка то его забрасывают. но 6й к ним не относится.
Так что просто выполни dotnet --list-runtimes
и просто доставь все что нужно и заработает
кстати, нашел у себя приложуху под 3.1, подправил .runtimeconfig.json под 7 и внезапно запустилось. Правда тут же упало ибо не нашло нужную WindowsBase (это WPF), но ведь стартовало же.
Нет, aspnet-runtimes 6.0. Кто поддерживает Манжару - обосрались и удалили нужный пакет из репы.
ну ребята выбрали такой подход да
https://archlinux.org/packages/community/x86_64/dotnet-sdk/
быть всегда "на острие ибо нех"
тогда тебе копать в сторону старого подхода с dotnet-install.sh и бубна
https://www.jeremymorgan.com/tutorials/linux/how-to-install-dotnet-manjaro/
Пушто его каждый второй школьник учит чтобы говну наюнити сделать
Но я мидл на других языках
Надо просто быть уверенным в себе и говорить, что у тебя опыт 2-3 года, нужно придумать себе какие-то проекты.
По сути дела измеримой разницы по знаниям нет, только по опыту.
Уверенный и наглый джун - это мидл. Требуй сразу после курсов 220к, будешь мидлом. Если согласен работать за стопку гречи - ты опущенный джун, отойди в сторонку. На задания и тесты, которые могут тебя разоблачить, не соглашайся, это ниже твоего достоинства. Пусть тестовые задания всякий посткурсовый сброд решает. Ты выше этого. Ты не биомусор. Ты не будешь работать менее, чем за 250к. Если сам поверишь в это, то поверит и работодатель.
Ты успешный программист, а не обоссанная джуновая скотина. Ты не потерпишь ни малейшего неуважения.
Если обычному заурядному биомусору нужно 10 лет, чтобы стать сеньором, это не твои проблемы. Ты уже знаешь больше сеньора. И не нужно равнять тебя с обычными программистами. Ты просто на другом уровне.
>Требуй сразу после курсов 220к, будешь мидлом.
В голос.
Каких курсов? Полного курса обучения в MIT разве что.
https://youtu.be/w8rRhAup4kg
если это так то почему классы без наследников по умолчанию не считаются запечатанными?
Не будет, пиздёж. Sealed классы просто не разрешают наследоваться и всё. Никакой оптимизации не будет.
Нет, это бред.
Можешь анус себе запечатать.
Гипотетически это может помочь эвристикам JIT'а в доказательстве того, что иерархия наследования закрыта, а значит, возможно, он сможет произвести девиртуализацию вызова метода класса. Но JIT, скорее-всего, это сможет вывести и так, без указания sealed. Плюс просто ситуация, когда это сможет выстрелить редкая. На ум приходит только случай, когда у нас в сборке есть internal-интерфейс и один public класс. В таком случае, сделав этот класс sealed, мы сможем гарантировать, что у интерфейса только одна реализация, а значит, JIT сможет заменить все виртуальные вызовы методов интерфейса на статические (по их прямым адресам) вызовы методов класса.
В общем, не стоит с этим заморачиваться и помечать все sealed, если действительно нет причины запечатать класс.
>не стоит с этим заморачиваться и помечать все sealed, если действительно нет причины запечатать класс.
Классы, которые не будут по дизайну наследоваться, следует запечатывать. Неявное нужно делать явным. Это как компилятор предлагает помечать неизменяемые поля ридонли и удалять неиспользуемые приватные сеттеры. Большинство классов на самом деле никогда не будут наследоваться. В котлине по умолчанию классы запечатанные. Это ошибка дизайна языка сишарп, что класс по умолчанию не запечатанный.
Так и правильно запечатывать. Оставлять распечатаными - это нужно иметь сильную мотивацию для этого. Запечатывай всё, делай всё приватным, не объебешься, уж поверь. Распечатать потом всегда успеешь.
>Это ошибка дизайна языка сишарп, что класс по умолчанию не запечатанный.
Это не ошибка, а хорошее умолчание которое не связывает руки.
Я хуею с некоторы бдсм-языков где все по-умолчанию иммутабельно. Любая логика из реального мира нуждается в дополнительных телодвижениях, зато манямир сектантов чистоты не потревожен.
хоть я за строгость, но это очень спорный момент
не единожды имея нужду унаследовать что-то от мелких, вспоминал их совсем не добрым словом.
Так что я за открытость по умолчанию.
Не надо запечатывать. Это лишная работа и головняк в будущем с перекомпиляцией исходников когда тебе внезапно понадобится отнаследоваться.
Алсо есть редкий кейс: когда твой код уйдет в прод и в нем найдут критическую багу, ее смогут пофиксисть без исходников через рефлексию горячей перегрузгой проблемного класса. Запечатанный класс станет как серпом по яйцам, твою мать за это проклянут и выебут.
Правда. Если пишешь дидовские циклы думают, что ты лох-пидор-неосилятор. И похер что циклы быстрее, понятнее и привычне.
>дидовские циклы
>И похер что циклы быстрее, понятнее и привычне.
Хуй там. Я дид и настолько уже привык к LINQ-у, что не могу нормально на портянки из циклов смотреть.
Мне в линке не нравятся цепочки вызовов. В любой книге типо совершенного кода сказано, что это признак северного полярного лиса в проекте. Они всадник трудной отладки, отсутвия нужной абстракции, неправильного домена логики, протекающих в глобал данных. И тут появляются клоунские технологии которые провоцируют писать в таком стиле. Старый подход: нужно отфильтровать список - пишешь класс фильтра с нужными данными, в нем предикат или метод филтьтрации делающий работу. Это объект тестируемый, вызывается через одну точку, нигде не дублирует логику, понятно где он лежит, системный подход збс. Но сейчас пиздос, говнякают линк себе в штаны прямо по месту и пусть весь мир охуеет понимать зачем это написано и где еще в проекте есть грабли такой же конструкции.
Да о нем. Нарушает. Сложная логика фиьтрации болтается прямо посреди бизнес-логике со всеми подробностями, хотя она должна быть скрыта за интерфейсом объекта-фильтра.
Да соси ты хуй, зумерок полоумный. Без линка уже скоро максимальный элемент в массиве будет не найти таким гореразработчикам.
>дают do-нотацию прямиком из хачкеля,
Худшее говно что случалось с шарпами. Ебаные функциональные сектанты поналезли в чистый ОО-язык и задристали его вызовами функций функций функций функций поверх словарей листов массивов итераторов. Все это без нормально абстрагирования и с диким количеством повторов кода. Сука, были четкие объексты с методами и данными! Теперь просто лапша методов плавает сама по себе, а вокруг нее в наблеваны данные попадающие в захват блямд - за кулисами всь этот понос конпелятор все равно упаковывает в объекты, но написавший ее петух-пограмист не имеет нормальныйх объектов и копатеся по локоть в дристе.
Алсо на швабре видел статейку: как бы еще позаборестее трахнуть систему типов шарпа, чтобы дженерики стали гоморфными категориями абстрактных групп произвольного типа. У меня от такого рука сжимается в кулак и хочет уебать петуху, пояснив его криком - УЕБЫВА В СВОЙ ХАСКЕЛЬ ЖРАТЬ БОРЩ ЧЕРЕЗХ АНУС!
Бендный шарп, короч. ФП-фанатики его доебут до состоянитя С++.
Спустя время сказали расширить алгоритм на получение данных с БД. Вместо генерации скул запроса дастаешь данные в память и руками чешешь
>Это приводит к очень веселой ситуации, когда чтобы хелловорлд проверить - тебе приходится качать докеровский образ .net'а с дистрибутивом, максимально близкми к тому, что на твоем железе, выковыривать из него либы, рассовывать их по папочкам, чтобы просто запустить хелловорлд на железяки и пару бенчмарков, написанных на .net'е. Оч весело и прикольно.
Пробовал собирать селф-контеин приложение? Рот можешь закрыть я уже год пишу тул который по сфтп заливается на голый линукс и работает
Бумп.
> В гугле и на ютубах никаких толковых туториалов не нашел.
Потому что это максимально расплывчатая хуйня, вот прям у каждого первого полностью своё определение DDD. Можно писать какой угодно код с какими угодно концепциями хоть на ассемблере и иметь все основания называть это DDD. В 2к23 DDD - синоним программирования.
Советую почитать Ef Core в действии. Там как раз много внимания уделяется использованию ef core в ddd с примерами.
С наступающим, помогач!
Есть вопрос. Вот есть сущности многих разных типов. Заявки, задачи, отчёты, утверждения отчётов. Всё это во многих вариантах, задачи программы Task-Doer-1.0, задачи программы Task-Performer-v325.3, и так далее. И всё это между собой связано, там, вроде как, даже своя иерархия имеется, только мне не понять нифига, в чём тут суть иерархии, когда как по мне структура этих связей это просто граф без замкнутых путей и какой-либо иерархии.
И оно должно работать взаимосвязанно. Кто-то выявил проблему, по ней создалась задача, по ней создалась заявка на устранение в одной программе, по ней создалась заявка на устранение ещё в двух программах, по одной из них создался отчёт, по нему появилось утверждение отчёта, по нему закрылась заявка, по ней одна задача закрылась, по ней по цепочке закрылась эта же задача в других программах, сформировался ещё один отчёт, для вышестоящей организации, и так далее. Короче, всё элементарно и очевидно, но поддерживать это уже не очень элементарно.
Вот ты, мудрый ананасик, как бы ты решал эту проблему? Вообще, в целом?
И конкретно в частности: Есть одна задача в двух программах одной и той же организации. Ну, скажем, есть два инстанса двух разных классов, созданных по одной и той же проблеме. Они должны друг на друга влиять при создании, изменении или закрытии. Как красиво-то написать так, что у нас один объект, получив управление для выполнения каких-то действий, передаёт управление ещё и другому объекту для выполнения аналогичных действий, но тот не перебрасывает управление обратно?
Я-то могу просто взять и написать, но нужно бы написать так, чтобы этот код не был write only, это ведь сегодня все эти сущности связаны так, а завтра какой-то отдел перестанет отчитываться перед какой-то другой организацией, или будет отчитываться только по одному подтипу задач, а по другому не будет. Как сделать так, чтобы в будущем всё это правилось с минимальными усилиями?
Как же много воды. Давай вкратце, что у тебя не работает? Опиши всё в парочке предложений.
Да всё работает. Система получается слишком сложная. Как красиво такое написать? Задача же вроде стандартная для всяких там CRM. Наверняка тут каждый второй чем-то подобным занимался. Или нет?
> Пробовал собирать селф-контеин приложение?
Нет, блядь, не пробовал.
Пробовал взять и залить на китайский контроллер/WiFi-модуль и проч с их китайским линуксом селф-контейнед приложение? Я - да. В 90% случаев, тебе не фортануло - иди ебись как хочешь.
Ну серьезно. Ты думаешь учитывая, что я плюсовые приложухи - собираю статически - мне в кайф с дотнетовскими ебаться?
>Они должны друг на друга влиять при создании, изменении или закрытии. Как красиво-то написать так, что у нас один объект, получив управление для выполнения каких-то действий, передаёт управление ещё и другому объекту для выполнения аналогичных действий, но тот не перебрасывает управление обратно?
Паттерн есть - цепочка обязаностей. Суть есть несколько документов, надо чтобы они консистентно обрабатывали поток событий от пользователей или других систем. Связанные доки собираются в список и каждому элементу передается объект текущего события и текущий контекст обработки. Список крутится до тех пор пока все связаные доки не отрапортуют, что они сделали все что надо над одним объектом события, при этом с друг другом они общаются через контекст обработки. На верхнем уровне надо определить какие документы связаны, какие события редактирования они принимают по цепочке, и признак конца обработки(когда цикл закончится). Если в будущем связи между доками пропадут, то надо будет поправить заголовок совместной обработки и на этом все.
Наверно тебе что-то подобное нужно.
>твои визги в сторону функциональщины имели бы хоть какой-то вес, если бы ты хоть что-то из этой самой фунциональщины осилил
Спасибо, но жрать говно не планирую. Чтобы понять, что это говно не обязательно его деустировать.
Возразить тебе по-существу нечем кроме того, что петухи написли какое-то монадное петушение 10 лет назад. Единственный вопрос: чо им в хаскеле не сидится с этой дрисней? Нахуя он гадят в нормальный язык?
НАХОДИШЬ ШАРП В ФАЙЛАХ CPP
Не рвись, функциональная манька. Хотя я рад, что хоть в одном промышленном языке появилось понятное для тебя петушение и ты наконец начать зарабатывать деньги решая рельные задачи, а не жрать мамкин борщ прорешивая в сотый раз скип.
>ряяяя ухади мне неприятно
Причина баха?
Линк говно - это объективно. Функциональная парадигма - ущебна по сравнению с ОО-парадигмой. Нормальные люди это понимают и не тащат в проекты каку. о чем тут спорить?
Нахуя ты его так?
Мне кажется, тут это не пойдёт. В цепочке у каждой сущности одинаковый интерфейс. И она линейна. А тут что-то вроде дерева, растущего во все стороны, и центр в нём определить невозможно.
При этом действия разные.
Создан отчёт: Розетку отремонтировали.
Задача отдела по ремонту розеток - закрывается, а не создаётся.
Задача, поставленная управлением по контролю за ремонтом розеток - не закрывается, а переводится в ожидание приёмки. А параллельно всему этому на основе отчёта отдела по ремонту розеток создаётся отчёт на уровне всей нашей компании, который в каком-то виде отправляется в управление по контролю за розетками. То есть тут и ветвление, и передача по цепочкам, но в одной цепочке происходит создание отчётов, а в другой - закрытие или перевод в ожидание приёмки заявок.
Ты просто назвал меня тупым из-за того, что я не пишу ФП-лапшу как ты. А может это ты тупой? М? Понтуешься тут как можешь круто поедать борщ новыми способами, но твой код ужасен. Дерьмо без абстракций на бесконечных замыканиях для домена приложухи не годится.
>>559426 (Del)
>добавить тайпклассы
Не нужно. Уебывай на любой ФП язык.
> LINQ говно, потому что.... потому что функциональщина!
Да. А еще потому что привлекает извращенцев и кораптит моск неокрепших нюфагов.
Тебе корона на уши не давит? Я понимаю как это говно писать и как оно работает, но я его не пишу осознано, потому что все ФП-петушение сосет у ОО-подхода. Я выше перечислил в чем траблы. Главная проблема - теряется семантика. Глядя на словарь словарей с листами ни за что не отгадаешь какую логическую единицу данных представлят чудо которое в нем хранится. Потом у каждого объекта есть список методов позволяющих что-то с ним делать, а над контейнерами можно выполнить любую функцию и попробуй отгадать какая из этих функций валидна в данном контексте данных. ФП-сектантам в принципе норм, ведь состояние у них харам остаются только функции поверх листов-параметров для замены того самого состояния на пошишечки. У меня баребух из-за того что подобные кадры лезут со своей парашей в чистый ОО-язык. Еще расказывают как все вокруг неправильно живут и вообще дебилы непонимающие их монад. Обидное.
Линк ест моск.
не прописывать dotnet run постоянно?
и еще такой вопрос, а че при дебаге терминал не работает чтоли? все эти врайтлайны, ридлайны?
Тестовый редактор тебе не IDE, понятное дело, что надо будет тыкаться в терминале.
тык епт помогите это говно автоматизировать наверняка в ней где то можно батник прописать?
Зато можно автоматизировать Emacs.
просто подскажи куда копать.
вот там есть джейсон файлы с какими то путями. лоунч и таск - это оно?
или надо расширение конкретно для редактора делать?
просто для либы SGDK на C в этой же студии есть дополнение которое типа добавляет команду запуска в шел. и все ебать. эта команда за тебя последовательно через терминал компилирует все.
вот может дополнение уже есть такое же??
>Курьером поработай сначала, ну или в ...
эта блядская студия всегда будет весит больше, сколькоб я винтов не покупал. зря только зхадницу порву.
ну а че всеж с кода кипятком ссут
поставил я значит нет кор 7мой свежий.
загрузил значит асп нет.
шаблон просто веб кор.
результат нихуя ругается на 7ой нет. просит пятый.
Это че нормально?
В общем, как оказалось, это позиция на джуна t-sql. С вкраплениями дотнета. Имеет смысл вкат сюда, есть перспективы переката в серьезный дотнет? Зп здесь вполне рыночные.
я видел что шаблоны в видосе покрасивей открывались прям с графикой.
а тут чет он и в коде пустой. но я не шарю совсем.
Я выпоз из оливьешечке сказать тебе, что ты опять несешь дичь на своем птичьем языке. Братишка, для работы это нинужна. Совсем.
С новым годом тебя.
>чтобы пройти по ссылкам, прочитать информацию
Мимопроходил. Чел, подкинь ссылок на теоретические основы.
>ParsecSharp
Ради интереса полистал, т.к. когда-то писал велосипедопарсеры-интерпретаторы арифметических выражений.
И я ожидал удовлетворить своё любопытство, как же это всё можно красиво сделать в ФП.
Но твой код - ничего не делает. Ты просто создал сотни файлов с интерфейсами и хелпер-методами с телом в одну строчку, чтобы... обернуть несколько стандартных функций типа int.Parse() и реализовать какой-то примитивный абстрактный токенизатор?
Что это? Зачем?
Так борщехлебам работа и не нужна.
Анон, советую лучше посмотреть на Sprache https://github.com/sprache/Sprache . Это как раз приличная production ready реализация комбинаторных парсеров для C#. В ридмишке есть ссылки на примеры использования и статьи с примерами.
На самом деле очень удобная либа. Особенно когда тебе нужно парсить что-то не сильно большое, но то, что нельзя описать регулярной грамматикой (тобишь то, что априори регулярками парсить нельзя). Заюзать Sprache гораздо быстрее, проще и поддерживаемей, чем писать ручками свой парсер с рекурсивным спуском или LR(1) автомат (хотя с приходом patter-матчинга их небольшие реализации стало писать достаточно прикольно) или тащить в проект ANTLR.
Да и по сравнению с регулярками парсеры описанные на Sprache выходят сильно более читаемыми.
> я 33 раза в своих написал про монадные парсеры
Но так и не смог сказать что это такое и зачем нужно. Типичное тупое кукарекало.
я мимокрок
это хороший парсер, но сложно в нем делать экранирование кавычек
а потому сразу лучше прыгать до peg парсеров
че такое системные типы? это класс чтоли встроенный?
а int тогда че такое? почему сразу не писать Uint32?
в сях вроде так можно
>че такое системные типы?
ну типы что дают тебе искаропки
>а int тогда че такое? почему сразу не писать Uint32?
да пиши как хочешь. это всего лишь алиасы
хотя конечно так мало кто пишет.
это значит что можешь писать так и этак и будет одинаково
считай что это аналог такого
using int = System.Int32;
Спасибо анон!
Аноны подскажите я фронт немного кодю на яве и котлине, хочу попробовать перекатиться вбэк быстрее освоить
csharp vs golang
че больше нравится то быстрее освоишь
досталась от пращуров со времен мамонтовых войн
Давно, это было как минимум в пятом шарпе (.net 4.0).
типа допустим вот есть у нас Convert.toint32() а в кобочках 18 перегрузок на разные типа значений как посмотреть че там доступно?
в визуал студии
Скобку открываешь и можно перелистывать стрелками вверх-вниз доступные сигнатуры в подсказке.
Или курсор между скобками и клавой жмешь Cntr + Shift + Space, и потом снова стрелками.
простой консольный проект. и у меня не работает подсветка.
как ее включить в студии?
не а как вот непример есть у меня чужие исходники. сделаные не в студии. как мне их открыть и включить подсветку кода?
пасибо! недодумался. Да ладно все равно тред мертвый, пусть хоть какая то движуха будет
в файле .csproj сменил версию net на 5ю и все заработало.
<TargetFramework>net5.0</TargetFramework>
похоже 19я студия тупо не поддерживает 7й нет
дык тут такое дело. 19 я у меня стоит до 4.26 анрил. и если я поставлю 22ю то мне и анрил придется обновлять до 5й версии. а это все вкупе 30-40 гигов выкачивать. я пока в деревне живу , через свисток.
а нет я просто пощупать хочу. вдруг не понравится совсем.
Ну да, это правильно.
Ты можешь вместе и 19-ю и 22-ю поставить. И любую другую. И даже солюшены будут открывться той студией для которой они созданы, там достаточно умный селектор есть.
И они даже работать смогут одновремено, не мешая друг-другу, если, конечно, памяти хватит.
Но задача должна быть хорошо сформулирована, с кучей условий, чтоб ты гуглил и изучал именно что "надо". Если ты сам себе скажешь "сделать форум", то ты сделаешь всё максимально примитивно и почти ничему не научишься.
Если возникают подобные вопросы, значит человеку ничего не нужно, он не будет ничего делать и ничему не научится. Обучение начнется только на работе, когда будут платить деньги, вот ради этого и будет делать и учеба пойдёт.
Учи EFCore, кодстайл шарпа, SQL, научись ебашить КРУДы, пойми что такое DTO, как писать по DDD и уже можно будет работать
>Изучаю шарп уже полгода
>несостоявшемуся джуну
https://github.com/Elfocrash/.NET-Backend-Developer-Roadmap
Вот когда по этой карте до хотя бы до микросервисов дойдешь, тогда можешь несостоявшимся 'джуном' считаться.
Картинка из серии: Мы много говна сожрали и ты столько сожри прежде чем нам бросать вызов.
Нельзя просто взять и начать писать бек с рест-апи, попутно погружаясь в разныве темы по мере надобности.
Все эти роадмапы придумали говноеды для дебилов 75 IQ, которые не могут думать своей головой. Одни облака в разделе про микросервисы многое говорят об этих людях.
>Нельзя просто взять и начать писать бек с рест-апи, попутно погружаясь в разныве темы по мере надобности.
Да не вопрос. Писать то начать ты можешь, но если мы говорим о реальной работе, то в нынешних реалиях, от джуна ожидают хотя бы минимального опыта работы с любым пунктом этого списка. Ну или хотя бы способности ответить на пару-тройку определяющих вопросов по каждой теме.
Любой компилирующийся код полностью соответствует DDD.
Всякие пидоры пытаются купить мидлов по цене джунов. Навесят кучу требований, а когда их не вывозят режуит ЗП. Потом попавшие под такую практику рассказывают как много надо знать джуну, стоят роадмапы где надо обязательно учить пять технологий для одной задачи.
Чет там самое обычное всё. В чем отличие от не ddd, хз
«На третьем ходу выяснилось, что гроссмейстер играет восемнадцать испанских партий. В остальных двенадцати чёрные применили хотя и устаревшую, но довольно верную защиту Филидора. Если б Остап узнал, что он играет такие мудрёные партии и сталкивается с такой испытанной защитой, он крайне бы удивился. Дело в том, что великий комбинатор играл в шахматы второй раз в жизни».
Повторюсь - я не вижу там ничего отличного от самого обычного способа написания приложений, которое существовало всегда.
Когда мне говорят "попробуй DDD", то мне хотелось бы увидеть не что плюшки, а хотя бы отличия от классики.
Вот микросервисы хоть просты, но имеют ярковыраженную особенность.
а тут - вода водой в воде и "покупайте задорого"
На тему погодных условий, возьмешь там опенвеазер апи
смотрю сейчас аспнет кор. и сука там ебать ковырять включаешь фреймворк, он хуй пойми там как чет работает, включаешь какието хуй пойми компоненты. без этих компонентов тебе хуй будет доступ к штмл. но и там это не штмль а какието куски заготовок, которые тоже хуй пойми как подтягиваются и сшиваются другими компонентами аспкора. и все это сдобрено юблюдским синтаксисом который к с# ни сбоку припеку. модели какие то придумали. в виде классов без методов. кароче тоже какая то хуйня чисто для представления. почему не листы тогда вместо классов? мне вообще попрагроммировать дадут?
че за хуйня происходит. такое ощущение, что за тебя уже все написал какой то долбаеб а ты отчаянно пытаешься разобраться в его говнокоде. все обложенно спец правилами. Это ВСЕЕЕЕЕЁЁЁЁ надо изучить и понять чтобы блядь банальный хеллоу ворд написать.
Это че вообще? это программирование я вас спрашиваю? это везде так в вебе или только в дотнете? Есть может чето более привычное?
Еще блядь я с# не узнаю совсем. вкатывался 10 лет назад в контексте юнити. каким красивым он тогда казался. жестко типизированый правильный. никаких неявных конструкций.
сидели ржали с посонами на джавистами.
а тут захожу неявные типы, какието верхнеуровневые команды, какието ублюдские сокращения. => это че вообще?
нахуй так делать? это че это то самое хваленное развитие? компилятор всеравнож это все приводит к старому типу.
посоны у меня бомбит реально. может действительно жаваскрипс какойнибудь с ноджсом поприятнее будут для веба?
>он хуй пойми там как чет работает
работает как и все подобные фреймворки бум которым задал RoR и понеслось. и не только на шарпе.
>почему не листы тогда вместо классов?
юзай что хочешь. просто классы это строгость.
>Это ВСЕЕЕЕЕЁЁЁЁ надо изучить и понять
ну да. понял RoR (то есть подход) === понял сотни фреймворков на пхп и асп.нет тоже
>какието ублюдские сокращения. => это че вообще?
та же херня как и богомерзком жс.
>жаваскрипс какойнибудь с ноджсом поприятнее будут для веба?
удачи
И всё-таки, бампану свой вопрос. А точнее, перезадам.
У нас задачи хранятся в разных базах данных. Задачи - это указание починить какую-нибудь фигню, например. По ним есть отчёты, есть заявки, вот всякая такая ерунда. При этом одно порождает другое. Меняется статус задачи - должен измениться статус заявки и статусы задач в других базах. Ну плюс-минус так. Иерархии как таковой у всей этой фигни нет. Ну то есть она как бы есть, но как по мне, она высосана из пальца.
А вопрос в том, как сделать подобное наиболее правильным образом. Чтобы гибко достраивалось, надёжно работало и выглядело не запутано.
Что здесь, как мне кажется, не подойдёт (из того, что предлагалось) - это паттерн цепочка обязанностей. Ибо цепочка обязанностей обрабатывает одно и то же событие, при чём по линейной цепочке. А тут не линия, а разветвлённый граф. И если рассматривать то, что инициирует изменения во всём этом графе, как событие, которое может непосредственно повлиять на все документы в базе, то как-то сложновато всё это выглядит. Ибо некоторые задачи, например, в некоторых базах вообще могут отсутствовать, так как отделы, которые этими задачами занимаются имеют отдельные базы.
битая ссылка(
Пробуй libgen.rs, libgen.is, libgen.st, у меня всегда хотя бы одно из них работает.
ага разобрался. еще раз спасибо.
я бы делал без четкой связи. как в ооп.
типа у каждой задачи есть свой набор свойств
допустим есть у нас
три класса: задачи, таски, отчет.
задачи могут породить таски, таски могут породить отчет.
все три класса могут порождаться сами по себе и ссылаться друг на друга.
потом собираешь каждый тип в стеки и просмотриваешь че с чем связано
ну стек типа например если взял задачу она ссылается на два таска. один из тасков ссылается на отчет, последовательно строишь цепочку например по приоритету. задачи главные таски вторые отчеты третьи. у тебя выходит иерахическое дерево. записываешь это все как относяцееся к какойто глобальной задаче.
вот тебе и иерархия.
>Когда мне говорят "попробуй DDD", то мне хотелось бы увидеть не что плюшки, а хотя бы отличия от классики.
DDD - это когда разработка идёт от предметной области. Например типичный BookStore можно начать писать с позиции REST API, а потом подгонять логику приложения под неё, а можно вначале создать бизнес-логику и уже вести разработку в зависимости от требований бизнес-процессов.
писать REST AP не зная что собственно ожидается от этого апи? Это вообще возможно??
А если пишешь апи учитывая ожидания (читай требования) к нему, то это уже требования к логике приложения как бы.
>писать REST AP не зная что собственно ожидается от этого апи? Это вообще возможно??
Возможно, привязав к сущностям из БД.
Да, передавая SQL-запросы через REST.
к каким сущностям? мы только начинаем писать приложение и сущностей нет. создавать сущностей с потолка мы не можем, а значит мы автоматически создаем сущности для предметной области прежде чем начать апи )
Выходит, не так сложно писать по DDD, как писать иначе - нужно быть прокачанным чуваком чтобы уметь писать иначе.
Нужно ли вкатуну учить все эти новые штуки?
Этот анон - латентный жавист. Держитесь от него подальше.
ну вот в асп нет сейчас смотрю. классы перетасовывают.
например между 5 и 7 есть разница. 7ой выглядит пизже
отож
и зачем туда добавлять проект. и чето пишут что в один солюшн можно несколько проектов добавить.
есть же для настроек . csproj
нахуй это все надо?
Допустим написал какую-то программу, а потом хочешь переписать по-другому, сделать версию 2.0 типа. Вот тут и создаешь свой проект2.0 и переписываешь. Удобно сразу перед глазами иметь старый и новый проект.
бля всеравно не понимаю.
Ну вот пишешь ты параллельно несколько приложений. Они вроде как самостоятельные, но в то же время чем-то связаны, например, одновременно пишешь клиент и сервер. Вот каждый из них в отдельном проекте, но они объединены одним солюшеном. На хеллоуворлдах это сложно понять.
У меня может быть новый модуль — это отдельный проект. Я могу его писать вообще не запуская основное решение и подключить уже либо на финале, либо ближе к нему. А еще можешь это проект подсоединить к другому решению, чего невозможно делать, если ты пишешь все в одном проекте — я подобного говна нажрался.
Солюшин это сборка проектов. Можно конечно импортировать библиотеки, но библиотека не продразумевает частое вмешательство ну и в целом это неудобно. А вот с множеством проектов ты ведешь разработку параллельно.
вот так понятней. спасибо. дак че мне пока мозгов дальше холлоу вордов нехватает.
я уже вон клок волос вырвал
а почему нельзя просто по фалам туда сюда шнырять? вот например в vscode нет никаких солюшнов. сидишь папки перебираешь.
>к каким сущностям?
Сущностям из БД
>к каким сущностям? мы только начинаем писать приложение и сущностей нет. создавать сущностей с потолка мы не можем, а значит мы автоматически создаем сущности для предметной области прежде чем начать апи )
В теории так, но без изучения бизнес-логики нельзя сказать ,что вот такая-то сущность - это и есть объект предметной области.
>Выходит, не так сложно писать по DDD, как писать иначе - нужно быть прокачанным чуваком чтобы уметь писать иначе
Нет. Проблема сложных проектов в смешивание бизнес-логики и логики приложения, как раз потому что такие как ты не видят разницы в них. Да, вначале в этом не будет проблем, но как только бизнес-логика изменится, как всё, наступает пиздец.
Однажды у тебя будет столько подпапок и классов, что тебе захочется как-то логически это разделить на блоки. Конечно, с этим есть свои проблемы, типа зацикленности и это заставит тебя создать еще один проект, чтобы связать другие проекты, но это уже другая история.
>>561900
Дохрена папок. С проектом ты в принципе вынужден будешь соблюдать солид принципы. В целом проект это тупо законченный модуль, как библиотека, которая не воняет на все решение, при этом ты легко можешь туда влезть и чет подправить\добавить. Создавая класс в отдельном проекте, он автоматом располагается в неймспейсе этого проекта. Попробуй такое же провернуть с папками.
А еще у меня один проект писался на VB, а другой на C# и вместе все работает в одном солюшине. Например VB не умеет в небезопасный код, это один из негативных отличий от шарпа, поэтому мне пришлось часть кода писать на шарпе.
я имею ввиду : this(). это че специально только для конструкторов сделано? где то еще используется подобное? например при методах?
Да весь синтаксис сишарпа ублюдский, начиная с PascalCase и до новомодного сахарка.
засирает читабельность. ну типо язык должен быть прост для восприятия и его читабельностью нельзя жертвовать ради ублюдских сокращений.
сегодня ты сократил выражение, секономив 2 секунды, завтра начнешь переписывать, потому что трудно найти ошибку.
Потому что основу они взяли с джавы, где продуманный синтаксис. Код на джаве просто красивый и легко читаемый.
я считаю это полное дерьмо. все должно быть четко. что если уж что то написано то должно быть единообразно и однозначно, чтобы тебя подталкивало к угадыванию паттерна.
и еще нельзя допускать чтобы одни и теже конструкции работали в зависимости от контекста поразному.
этого должно быть поминимому ибо ублюдство
увы в шарпе, как в мерзкой жаве, имя конструктора равно имени класса (идиотизм, но слизывали же с жавы). и this хоть как то спасает идиотскую ситуацию
>>562037
> с джавы, где продуманный синтаксис.
продуманность уровня "тупее некуда"
это и new, и имена конструкторов, и null-ы, и многословность
в том же котлине все лаконично сделано
гм. какие претензии к реально полезной конструкции? пользуюсь в шарпе, питоне, котлине очень активно.
>Вы нормальную IDE вместо блокнота использовать пробовали?
при чем тут иде вообще если конструкция засирает визуальное представление.
это всеравно что рекурсиями выябываться вместо циклов
Когда тебе из всего класса нужно 2-3 поля.
Можешь засрать код говном уровня
var value1 = object.value1;
var value2.= object.value2;
...
Человеку который читает похуй в целом ему важно что он за 1 строку видит что из объекта вынули определные поля.
var value1 = object.value1;
var value2.= object.value2;
вот это как раз таки нормальный код.
>Человеку который читает
а который не читает. нет. ты мне главное скажи где это может понадобиться?
пишешь object.velue1...2...n и все нахуй.
>>562014
Несмотря на очевидынй наброс от джава-тролля, но смею согласиться. Двоеточие в шарпе используется в хвост и гриву, что не дает возможности понять происходящее в строке/методе/классе без общей картины.
В то время как в бейсике можно посмотреть на метод или класс и в принципе понять что и для чего. Это подтвердит даже converter.telerik.com
>при чем тут иде вообще если конструкция засирает визуальное представление.
>>562091
>Тем, что он пишется в теле конструктора, а не строке с сигнатурой
Т.е. вместо однозначной, сразу считываемой конструкции позволяющей сразу разложить цепочку вызовов не залезая внутрь конструктора, ты предлагаешь ту где это слово будет хуй знает где внутри тела конструктора запрятано? Нахуй, спасибо.
Вызов конструктора всегда идёт первым оператором. Это проверяет компилятор и если не так, то выдаст ошибку.
>Двоеточие в шарпе используется в хвост и гриву, что не дает возможности понять происходящее в строке/методе/классе без общей картины.
Давай примеры.
Ну наследование класса от интерфейса хрен отличишь.
converter.telerik.com тебе не переведет адекватно, он будет считать интерфейс базовым классом, из-за этого внутри класса будет неадекватная мешанина.
Ну и опять же, твой пример с this.
Да и вообще часто наблюдал любовь юзать это ":" и это "+=" для множества контекстов. Впрочем, я это уже не один раз тут писал.
можно юзать. Это сахар для слипшейся ленивой жопы.
Потому что сишарп - это гибрид сишного синтаксиса с паскалевским. Не стоит забывать, кто его создал.
>Я так подозреваю, что увидев код подобный тому, что на пике джавист вообще в кому впадет или в окно выпрыгнет.
конечно, говнокод ебаный.
к чести сказать этот говно код еще хуже. ахахахаха
слуште а че в коммерческой разработке вот такая хуйня тоже используется?
или за это по рукам бьют?
Подписчик экстрим цоде? Не слушай этих клованов.
А если нет разницы, то попробуй сконвертировать в другой язык и скомпилировать полученное варево.
Зачем мне конвертировать? Я не ожидаю что вертолет будет крутой подлодкой хотя винт у него есть
Поясни чем наследование отличается от реализации интерфейса что их нужно отличать "кровь из Носа"
Особенно если класс может быть абстрактным, а интерфейс с методами)
откуда в структуре методы? это всегда так было? ммм нахуя?
>Особенно если класс может быть абстрактным, а интерфейс с методами)
Вопрос уровня "чем отличается унитаз от кастрюли, если я и в то и другое насру". Проблема заключается в том, что если ты хочешь дружить с другими соседями и обмениваться посудой, это может вызвать проблемы с дельнейшей коммуникацией.
Из ВБ в шарп я моргу спокойно сконвертировать код, а из шарпа в ВБ — нет. При том, что функционал у них на 99,5% схожий.
>Особенно если класс может быть абстрактным, а интерфейс с методами)
Вопрос уровня "чем отличается унитаз от кастрюли, если я и в то и другое насру". Проблема заключается в том, что если ты хочешь дружить с другими соседями и обмениваться посудой, это может вызвать проблемы с дельнейшей коммуникацией.
Из ВБ в шарп я моргу спокойно сконвертировать код, а из шарпа в ВБ — нет. При том, что функционал у них на 99,5% схожий.
а чем тогда структура от класса отличается?
тем что наследоваться от нее нельзя? лол.
конструктор в структуре. я ебал.
мне уже похуй просто интересно, это я забыл или раньше такой хуйни небыло?
Проблемы других языков, мммм-- проблемы других языков
Схера ли шарп обязан быть с кем то конвертируемо совместимым на уровне исходного кода?!!!!
Это все претензии?
тем, где она живет в памяти и как живет. и конечно это накладывает свои ограничения, но принцип "держи данные и методы для работы с этими данными вместе" никуда не делся.
все это было всегда.
Щас и в интерфесах можно писать методы, по сути превратив в реализацию в наследование. Осталось поле сделать классом, а класс отдельным проектом.
А в 2к35м у нас будет одна мандула, которая является всем и сразу. Внутри будет нейрсоеть.
Например ты пишешь MyMandula.ExtractNumber("Petya228"), а внутри автоматом создается метод и все необходимое.
>Схера ли шарп обязан быть с кем то конвертируемо совместимым на уровне исходного кода?!!!!
Это просто наблюдение читаемости кода, не более. А быть таковым имеет право.
по конвенции интерфейсы имеют буковку I, так что сразу видно где интерфейс, а где нет. И никакой проблемы читабельности не наблюдаю
так что давай подробнее поясняй проблему, а то не видать ее в телескоп даже.
читай внимательнее. что куда компилируется вообще не причем.
но этож просто компилятор создает для структуры доп класс гдето в тени.
кароче ладно это может и удобно. но нахуй надо. я сам хочу управлять структурами.
да кстати в учебниках тоже надо сразу помечать типы данных.
Конвенция не является обязаловом. Это ты на себя можешь полагаться, а теперь представь, что ты делаешь условный конвертер кода и не факт, что рандомный васян поставит приставку "I" в названии.
А что будет, если я захочу наследовать класс Internet? Оу, наверно должно быть две заглавные буквы в начале? А если это наследование класса IPadress?
Понимаешь? Тебе надо усложнять свой конвертер, рыться в самом классе, чтобы проанализировать а нет ли там внутри реализаций, а потом это как-то отличить от ":this". И кучу, кучу всякого дерьма.
При это ровно тоже самое в бейсике распознается на раз без каких-то хитрых манипуляций, потому что там синтаксис достаточно очевидный.
никто не запрещает не иметь методов, а воспринимать структуры как...кортежи
но тогда тебе нужно будет делать отдельные методы для обработки этой структуры нарушая правило "данные и методы вместе ибо это правильно", ну и выгребать от создания защитных копий
структуры к тому что ты хочешь дополнительно используются как успокоитель GC же и методы весьма полезны. Вон смотри CancellationToken структура - плоди их миллионами хоть. А там есть метод Register...и куда ты его поместишь если не в структуре?
или тот же ValueTask
чет у тебя как то смешались "я за читабельность" и "конвенция может не соблюдаться".
если за читабельность, то соблюдай
>А что будет, если я захочу наследовать класс Internet?
Гайды говорят что имя должно быть вменяемым. если для тебя nternet или padres о чем то говорит....ну тут хз - есть те кто вообще на русском названия классов и методов шпалит, и что теперь.
насчет конвертеров - я понимаю что вот мне удобно нагуглить на жаве кусок кода и вставить его в котлин и студия перепишет
Но я при этом как то не ожидаю, что в обратную сторону это будет работать.
То есть я понимаю что язык не должен думать о том что его куда то конвертируют - это вообще дичь
а портирование - это уже другое.
ну в моем понимании структура это набор значений велью.
хочешь методы создай для нее класс обработчик. помоему логично, вот данные вот обработчик. разные сущности. я свой обработчик могу сделать универсальным для множества структур.
ну кароче хуй знает. быстро наговнокодить может и полезно.
>ну в моем понимании структура это набор значений велью.
и что им запрещает иметь методы в себе?
ну кроме того что после плюсов это непривычно?
так не нужно устав таскать по монастырям.
Слушай, вот если задача конвертации из VB в шарп понятна, то обратно-то тебе нахуя? Что за проект?
>чет у тебя как то смешались "я за читабельность" и "конвенция может не соблюдаться".
>если за читабельность, то соблюдай
Правила синатксиса не позволят тебе писать иначе, а на конвенцию могут наплевать. Еще раз, представь себя на месте создателя сервиса, которым могут пользоваться другие люди. Все, чем ты можешь оперировать — правилами синтаксиса.
>если для тебя nternet или padres о чем то говорит...
Т.е. ты в своем конвертере предлагаешь еще и анализировать название, сопоставляя со словарем слов? Замечательно, очень эффективно.
>Но я при этом как то не ожидаю, что в обратную сторону это будет работать.
Сишарп и бейсик это братья, поэтому ожидать не просто можно, а нужно.
Опять же, ты не понял в чем мой посыл. Посыл в том, что есть ровно такой же язык, в тех же условиях, но его синтаксис таков, что не заставляет городить какие-то зловещие конструкции для его анализа.
Я пытаюсь в споре о читабельности языка предложить в качестве аругментов мысленно создать конвертер для шарпа и для другого языка, а затем сравнить где будет легче это сделать.
просто это еще один черный ящик. и дублирующая реализация.
я теперь могу многие задачи решать чисто на уровне структур. с одной то стороны это хорошо. но с другой опять же путаница. вместо одного правильного пути у меня теперь два. при проверке мне придется просматривать оба.
>вот если задача конвертации из VB в шарп понятна
кек, ну это тебе понятна, потому что ты знаешь шарп. А если у кого-то проект на VB и ему надо вставить код с шарпа?
Я тут бесикоблядь из красной книги. Вообще медленно сам перкатываюсь на шарп, но у меня уже начат собственный длинный проект на бейсике, так что его добиваю на том, на чем начал. Так-то сам понимаю код шарпа в большинстве случаев, но порой лень переводить, а конвертер шарпкода выдает такую ересь (особенно это касается подписок на события и реализация интерфейсов), что по итогу вручную конвертируешь.
суть в том. что кроме твоего конвертера это нигде и не нужно
я понимаю твою проблему - тебе нужно написать имплементс когда это интерфейсы, но ты не можешь гарантировать верность детекта.
я предлагаю вообще не конвертировать, а просто перейти на шарп )
вб вообще сам по себе брр язык в плане читабельности.
>суть в том. что кроме твоего конвертера это нигде и не нужно
1. Речь шла про читаемость языка. Я тебе привел аргумент неоднозначности контекста в ситаксисе.
2. То, что тебе не нужно — не факт, что не нужно другим или не понадобится в будущем. Даже код ты пишешь с прицелом на то, чтобы он был готов к возможным ситуациям, которых прям щас нет.
1 я попросил уточнить где это является проблемой. Эта неоднозначность НЕ создает проблем при использовании языка
2 годы идут. А проблем все не создает.
В шарпе хватает дичи в синтаксисе, но конкретно это не вредно
Открой МСДН и узнаешь.
Да я уже понял, но порядок статей немного бесит, чому этот пример в другую статью не внести
Написание методов в интерфейсе это ожидаемое решение. На уровне компиляции и кода интерфейс это абстрактный класс с кучей методов, именно поэтому в шарпе можно пихать свойства в них.
Ты можешь хоть в С++ добавить интрфейсы просто делая их как абстрактные классы и на уровне соглашения не писать там реализации, только поведение.
Без такой хуйни как базовая реализации для метода интерфейса придётся городить такие костыли что ебнуться
Регенерация в ДИ контейнере реализации клиента для гитхаба.
Блять даже не нужно читать НА РУССКОМ доку Майкрософт чтобы понять. Достаточно просто понимать что такое ДИ
Поэтому непонятно.
Составил тут себе на ближайшее время из роадмапа список технологий для изучения.
Подскажите, чему из этого надо выделить максимальный приоритет и иметь исчерпывающие знания, а что не так глубоко изучать или вообще пропустить.
Спасибо.
пикча отвалилась
А не зная про IHttpClientFactory и читая про HttpContext впервые ты как об этом узнаешь? Я знаю про ДИ.
вот так и узнаешь. пойдешь гуглить что такое AddHttpClient и узнаешь
только вот зачем об этом узнавать раньше времени....
меня она оче заинтересовала и я хочу ее даунгрейднуть до 3.5
подводные камни?
ебало представлять не надо у меня оно перманентно такое
загугли может есть конвертеры.
>даунгрейднуть до 3.5
Респект таким пацанам!
>подводные камни?
Самый крупный камень а 4.6 много новых типов завезли в либу. В 3.5 аналогов может не оказаться и тебе придется написать их самому.
По контексту? Или ты просто код пишешь без понимания что конкретно сейчас происходит?
Добавить клиент в список сервисов. Наверное это про полёты на Марс
Они обратно не совестимые. Вполне возможно либа требует другие зависимости которые тоже 4.6 минимум.
Пока все зависимости не будут согласованы по таргет версии твой код не будет даже собираться
Чего писать в коде?
Все мы знаем, что read only collections могут меняться, и это нас не всегда устраивает. Поэтому используем immutable collections. Так вот, казалось бы - зачем нужны фрозен коллекции? Ведь есть же уже immutable collections.
Мало кто знает, но immutable collections - это урод и ублюдок, зачатый в пьяном угаре, которые абсолютно нахер не нужны. Почему спросите вы. А потому что immutable collections работают в разы, на порядок медленнее, чем их обычные мутабельные аналоги. Да ну не может быть такого. С чего бы это? Однако например метод Contains или ContainsKey из классов ImmutableDictionary и ImmutableHashSet работают в 3-5 раз медленнее, чем у таких же классов без всякой иммутабельности.
А как так могло получиться - спросите вы? Ведь он же гарантированно неизменяемый, его легче оптимизировать. Как же так? Неожиданно, правда. Вот вы такой адепт функциональщины, делаете всё иммутабельным, и получаете неожиданный сюрприз в виде просадки производительности.
Как так получилось, а главное - нахуя, никто не знает, кроме пары человек в микрософте, которым это зачем-то было нужно, и которые не рассказали своему менеджеру об особенности-изюменках их творения. Говорят, в иммутабельный словарь можно сделать Add и получить возвращаемым значением новый инстанс иммутабельного словаря, в котором уже будет то, что ты добавил. И вот чтобы это всё оптимизировать по памяти, новый инстанс не будет содержать полную копию оригинального инстанса, а будет шарить с ним данные, и вот эти хитрые "оптимизации" и дают просадку по перформансу. Казалось бы, не может же макакер быть настолько ебнутым, чтобы массово делать адд в иммутабельный словарь (наверное, так вообще никто не делает). Но тем не менее, имеем что имеем.
Теперь на радость всем джунам-вкатышам, чтобы их окончательно запутать и отвадить от языка, микрософтщики выкатывают фрозен коллекции. Они уже по настоящему иммутабельны. И они будут самыми быстрыми на чтение. Ну что, иммутабельность здорового человека против иммутабельности курильщика. Казалось бы, вот оно, то что надо. Но как оказалось - не совсем. Для фрозен коллекций создание инстанса будет чудовищно медленным. Вы же хотите оптимизированности на чтение - такова цена.
Через 1-2 года ждём Solid collections, Crystallized collections или скорее всего Fast frozen collections, которые наконец-то будут такими же как обычные коллекции по скорости на создание и на чтение, собственно именно то, самое простое решение, которое люди ждали сразу и иногда даже пилили свои обёртки под это дело.
А теперь, вопрос знатокам. Нахуя в шарпе в стандартой либо столько видов коллекций (и это я ещё не упомянул про конкаррент и всякие span'ы) и как объяснить это своим джунам?
Все мы знаем, что read only collections могут меняться, и это нас не всегда устраивает. Поэтому используем immutable collections. Так вот, казалось бы - зачем нужны фрозен коллекции? Ведь есть же уже immutable collections.
Мало кто знает, но immutable collections - это урод и ублюдок, зачатый в пьяном угаре, которые абсолютно нахер не нужны. Почему спросите вы. А потому что immutable collections работают в разы, на порядок медленнее, чем их обычные мутабельные аналоги. Да ну не может быть такого. С чего бы это? Однако например метод Contains или ContainsKey из классов ImmutableDictionary и ImmutableHashSet работают в 3-5 раз медленнее, чем у таких же классов без всякой иммутабельности.
А как так могло получиться - спросите вы? Ведь он же гарантированно неизменяемый, его легче оптимизировать. Как же так? Неожиданно, правда. Вот вы такой адепт функциональщины, делаете всё иммутабельным, и получаете неожиданный сюрприз в виде просадки производительности.
Как так получилось, а главное - нахуя, никто не знает, кроме пары человек в микрософте, которым это зачем-то было нужно, и которые не рассказали своему менеджеру об особенности-изюменках их творения. Говорят, в иммутабельный словарь можно сделать Add и получить возвращаемым значением новый инстанс иммутабельного словаря, в котором уже будет то, что ты добавил. И вот чтобы это всё оптимизировать по памяти, новый инстанс не будет содержать полную копию оригинального инстанса, а будет шарить с ним данные, и вот эти хитрые "оптимизации" и дают просадку по перформансу. Казалось бы, не может же макакер быть настолько ебнутым, чтобы массово делать адд в иммутабельный словарь (наверное, так вообще никто не делает). Но тем не менее, имеем что имеем.
Теперь на радость всем джунам-вкатышам, чтобы их окончательно запутать и отвадить от языка, микрософтщики выкатывают фрозен коллекции. Они уже по настоящему иммутабельны. И они будут самыми быстрыми на чтение. Ну что, иммутабельность здорового человека против иммутабельности курильщика. Казалось бы, вот оно, то что надо. Но как оказалось - не совсем. Для фрозен коллекций создание инстанса будет чудовищно медленным. Вы же хотите оптимизированности на чтение - такова цена.
Через 1-2 года ждём Solid collections, Crystallized collections или скорее всего Fast frozen collections, которые наконец-то будут такими же как обычные коллекции по скорости на создание и на чтение, собственно именно то, самое простое решение, которое люди ждали сразу и иногда даже пилили свои обёртки под это дело.
А теперь, вопрос знатокам. Нахуя в шарпе в стандартой либо столько видов коллекций (и это я ещё не упомянул про конкаррент и всякие span'ы) и как объяснить это своим джунам?
Иммутабельность решает несуществующую проблему.
>Нахуя в шарпе в стандартой либо столько видов коллекций (и это я ещё не упомянул про конкаррент и всякие span'ы)
Потому что в джаву в свое время запихивали кучу разных коллекций, в том числе конкаррент. На практике нужен только лист, мапа, и конкаррентмапа. Ну и еще очень редко какие-нибудь очереди.
В голанге у нас вообще только слайсы и мапы есть, и ничего, живем.
мимо c# -> java -> golang господин
>это урод и ублюдок, зачатый в пьяном угаре, которые абсолютно нахер не нужны.
крайне глупое заявление. просто ну очень глупое, ну просто капец какое глупое до ужаса
иммутабельные и фрозен коллекции это разные вещи. абсолютно вообще разные
удивляет что их только щас придумали добавить через столько то летов
об этом в рантайме узнаешь
>иммутабельные и фрозен коллекции это разные вещи
Раскрой тему.
Плюсы, минусы тех и тех, зачем нужны, условия применения.
фрозен коллекция
- гарантирует неизменность. ридонли коллекция не является неизменной. массив тоже не является.
- дает возможность оптимизаций. никакой лишней памяти (привет List, ну да можно array, но код инициализации будет дичь). оптимизированные коллекции - если у нас 10 элементов то зачем нам строить хештаблицу в фрозенсете? можно и списочком. А если у нас это строки, то зачем нам хештаблица опять же - можно и скилпист или простое что то. мы то точно знаем что расти не будет и что мы не потеряем в скорости, а в памяти выиграем точно.
иммутабле коллекции
с ними вообще все ясно. без них многопоток превращается в "лок на локе локает лока во все локи". и допустимо пожертвовать памятью, но сделать локфри
и как ты понимаешь иммутаблы хороши для многопотока, но они сильно оверхедят для задачи "гарантируйте мне неизменность, мне нужно создать миллион неизменных листов, аааа что с памятью? я что гугл хром пишу что ли"
при неизменности память зачастую делится между листами, особенно для древоподобных структур
листов много, но они по сути указывают на один и тот же участок, их не нужно копировать полностью при "изменении"
алсо сборщику мусора проще ретривить иммутабельные структуры
тут не всё так просто, няша
ты это к чему сказал?
ты описал что в иммутабле коллекции при Add не копируется весь список, а создается новый, где просто ссылается и на старый
каким образом это решает проблему потребления памяти когда я создаю 2 РАЗНЫХ иммутабле списка?
в каком месте тут будет экономия памяти?
ответ: ни в каком ибо будут созданы 2 "списка", которые по факту гибриды двусвязного списка с енотом и на список похожи лишь контрактом.
если у тебя два разных списка, то в любом случае нужна память для обоих, иммутабле ор нот
не понимаю твоей проблемы, приведи код?
>>562740
Ты не понял о чём я вообще говорю и на что жалуюсь.
Ты не понимаешь истинный смысл и задумку immutable collections, как они сейчас сделаны в дотнете.
Они не просто неизменяемые. Они оптимизированы под операции типа пикрил. И из-за этого кратно поигрывают в скорости операций чтения обычным мутабельным коллекциям. При том, что подобные операции всё равно будут жутко медленными, даже по сравнению с конкарент.
Именно поэтому и родились фрозен коллекции.
А зачем вообще нужна операция add для immutable collections, не говоря уже о том, чтобы ранее неё делать сложные оптимизации, гробящие перформанс базовых операций для 2^127-1/2^128 кейсов использования, для меня загадка и кроме глупости и недоработки объяснить это я не могу.
От тебя ответа я не услышал или не смог ввиду скудоумия понять твой ответ.
да. я это и говорю. я не знаю к чему было сказано про "не нужно копировать"
список (фрозен или обычный, но размер задан)- просто кусок памяти нужного размера
иммутабле список - мимикрирует под список, а по факту внутри AVL tree
дерево занимает больше места чем просто нужный кусок памяти и GC вряд ли его больше любит.
>Ты не понимаешь истинный смысл и задумку immutable collections, как они сейчас сделаны в дотнете.
>>562755
>скорости операций чтения обычным мутабельным коллекциям
конечно проигрывают. это очевидно.
вот только не все так радужно если сравнивать с обычным список с локами
>А зачем вообще нужна операция add для immutable collections
дядя анон видимо никогда не писал многопоток. ну или писал, но такой где цена блокировки значения не имеет и слово "локфри" только слышал.
> даже по сравнению с конкарент.
покажешь мне конкарентлист. очень хотеть посмотреть.
> GC вряд ли его больше любит
любит ещё как (но это конечно зависит от реализации GC в дотнете)
https://wiki.c2.com/?ImmutableObjectsAndGarbageCollection
А ведь тотальная иммутабельность это функциональная фича с помощью которой пытались избавиться от грязного изменяемого состояния. Какбы втф? Что эта ебаная муть делает в сишарпе? Зачем она нужна? Ни одной реальной проблемы она не решает, а тормоза и сектантов пишущих говнокод порождает на ура.
именно. иммутабле это ведь просто реализация, что вообще изначально отдельно была, а потом стала либой в составе дотнета. это не Span про который рантайм знает и особо любит.
там используется своя реализация Avl tree, где не видать ничего такого "GC люби меня".
>>562793
>Ни одной реальной проблемы она не решает
решает проблемы блокировок помогая не уходить в "епрст как сложна то"
писать многопоточный код в разы сложнее, чем однопоточный. А локфри многопоток - вообще атас.
этож обычный методы? зачем блядь таку стандартизацию придумали?
чтобы p.Name.get не писать?
че это вообще дает?
Многопоток лучше через разделяемое состояние делать. Т.е. каждый поток не лезет грязными руками в шаред ресурсы, а владеет своей копией. С ней он может что угодно без риска застрять в блокировке или испортить соседнему потоку стейт. Потом разделяемые ресурсы синхронизируются специально обученным родительским потоком. Надо заранее подумать какие данные разделять и где их собирать обратно. По мне это самый тру вей писать многопоток.
>дядя анон видимо никогда не писал многопоток.
После прочтения мне в начале показалось, что я начал понимать твою логику и логику создателей этих immutable collections. Хотя и осталось возмущение тем, что из доков это нихуя не понятно, что вся эту муть нужна исключительно для многопотока (или может я слепошарый).
Однако я не понимаю всё равно, как с этим работать в многопотоке без локов. Ну допустим у тебя есть родительская коллекция immudict0. Ты передаёшь её в несколько потоков для добавления каких-то данных, допустим, через Parallel.For. И каждый поток что-то добавляет и получает новый инстанс immudictN. И что он дальше со своим инстансом делает? Как их потом слить воедино? Если бы каждый поток срал в ConcurrentDictionary, у тебя всегда был бы один единственный и всегда свежий инстанс словаря. А вот в случае с иммутабл я паттерн всё равно нихуя не улавливаю.
>бляя ну а это то нахуя?
>че это вообще дает?
1. Удобно
2. Красиво
3. Лаконично
4. Иногда очень хочется не срать геттерами и сеттерами, а просто написать поле. Это не тру ООП, но шарп хотя бы даёт очень короткий путь сделать быстро, но при этом потом прикрутить логику если что без каких бы то ни было изменений.
>p.Name.get
Что это за говно?
Не пользуюсь иммутабл. Я умею в такую вещь как делать код нормально, а не пытаться добавлять элементы в ИММУТАБЕЛЬНЫЙ объект.
Ты блять дурак или как?
Писать тесты или ловить в ебало ошибки в реальном времени
p.Name.get()
p.Name.set()
да просто абстрактная реализация обычными методами. при такой записи я понимаю. что это инкапсулированая переменная .
а если просто p.Name написать. то че это нахуй? поле, или гет ?
помоему это не лаконичтно это ублюдство.
ну норм че. а как сюда обяъвление set впихнуть? или init?
я думал всякие подобные контрукции в конце будут рассматриваться как неважные. а ты смотриж. уже в третьей главе.
все действительно этим пользуются в энтерпрайзе?
>Это не тру ООП,
а почему не тру то? обращение к полю есть, по ссылке, с внутренним обработчиком. че еще надо?
да я уж начал, не бросать же.
При этом ещё name и Name занимают память. Если делали бы сахарок, то надо было сделать доступ к Name сразу из методов, а не использовать дополнительную переменную.
чето пока весь этот сахарок. чес слово воняет говном.
Как же ты заебал.
вдруг ты захочешь какое то ограничение в будущем для поля поставить. и тут как раз у тебя нереализованный метод подвязан.
и его изменение не вызовет ошибок .
только это все равно нахуй говнокод.
>p.Name.get()
А что такое Name? Какой у неё тип? GetterSetter<T>? Это вообще из какого языка пример? В большинстве языков можно написать Get_name(), а твою парашу я вообще нигде не видел.
>при такой записи я понимаю. что это инкапсулированая переменная .
>а если просто p.Name написать. то че это нахуй? поле, или гет ?
Во-первых, ты в блокноте кодируешь? В IDE это тоже легко понять (по цвету, например, у пропертей и полей он разный). Можно кастомно настроить сколь угодно кислотные цвета, чтобы уж точно не перепутать.
Во-вторых, это и есть фишка, ты не должен это понимать. Ты, как клиент класса, должен относиться к этому как к полеподобной сущности. Зачем тебе знать, поле это или пропертя? Как правило, ты всегда будешь иметь дело с пропертями. В тех же винформах у объектов сотни свойств. Если на каждое свойство писать ещё геттер и сеттер, то вместо сотни свойств будет двести методов.
В третьих, зачастую тебе достаточно написать public string Name {get; set;} и всё. Кратко, быстро. Если надо, потом добавишь логику. Чтобы написать тоже самое через private string _name; public string Get_name(); public void Set_name(string n); придётся потратить только на печатание в 5-7 раз больше времени (никаких автогенераторов, IDE ведь у тебя нет).
>p.Name.get()
Ты видимо любишь много печатать и любишь скобочки. Может тебе попробовать Ada или Lisp.
>помоему это не лаконичтно это ублюдство.
А как насчёт индексаторов? Квадратные скобки какие-то? Почему нельзя нормально написать myArray.GetItemAt(i) или myArray.SetItemAt(i, value)?
А вообще, проперти - это отличная фишка языка, которой мне во многих других языках не хватает.
К шарпу можно очень по многим вопросам предъявить претензии, но уж точно не по
опять нужно пояснять как в прошлых тредах, что name и Name не занимают лишнюю память по сравнению с жавой (и чем угодно)?
Потому что компилятор тупо переписывает их В ПОЛНЫЙ ЭКВИВАЛЕНТ тому что в жаве ты руками пишешь.
Я проверял, что в IL-коде создаётся именно два поля для переменной name и для свойства Name.
>А что такое Name? Какой у неё тип? GetterSetter<T>? Это вообще из какого языка пример? В большинстве языков можно написать Get_name(), а твою парашу я вообще нигде не видел.
дада я ошибся тут в записи. p.Name_get() , p.Name_set() естесно.
>А как насчёт индексаторов? Квадратные скобки какие-то? Почему нельзя нормально написать myArray.GetItemAt(i) или myArray.SetItemAt(i, value)?
а тут то че? все впорядке. вызываешь метод объекта.
то что массив создается скобками это особенность языка. тут претензий нет.
>Ты, как клиент класса, должен относиться к этому как к полеподобной сущности.
тогда это должно быть реализована через интерфейс а не в функциональной части .
ага и еще такая штука с этими черными ящиками. я значит обращаюсь к полю. а оно мне на ровном месте начинает поганить результат. я начинаю проверять свою логику, а все потому что какой то обмудок под поле зашил еще один метод.
Да, но если я использую нормальный подход к геттерам и сеттерам, то лишняя память не выделяется. Да и код выглядит в разы понятнее.
Ой, что это? Куда делось то недоступное свойство, про которое ты уже какой тред кукарекаешь?
в этом примере нет смысла. Сам смысл Parallel.For говорит о том, что время добавления в список хз. И тут место для ConcurrentBag
или вообще PLINQ - пусть он с этим разбирается.
Кстати, те же Concurrent коллекции не являются локфри - в том же ConcurrentDictionary хранение разбито на бакетов и каждый бакет имеет свою блокировку. То есть блокировок меньше, но они все же есть. К тому же есть операции которые требуют полной блокировки.
привычный тебе пример - ну вот анон тут писал свой event manager, где кладет понятно подписчиков в список
и вот пришло время вызывать publish и он обернул все в лок (и пусть весь мир подождет)
Что делать? ок. можем локнуть и скопировать подписчиков. Тут уже лок и копирование. Миллион событий - миллион локов и копирований.
Поэтому в шарпе события сделаны через иммутабельность делегатов. Весь сыр бор только при подписке, а при вызове ничего не копируется.
Там правда уже свои грабли в многопотоке но суть не меняется - локов при вызове нет.
Многое можно сделать через лок. все дело в цене операции что под локом.
Возьмем подобный абстрактный пример. у тебя миллион подписчиков уже в списке и тебе нужно итерировать по ним чуть ли не постоянно (ты криптобиржа и шлешь цены ))))
и доступ по индексу для каких то нужд
обычный список сразу мимо - локи могут дорого стоить, риск дедлока. А итерироваться то вообще как? только что вот описал проблему итерирования под локом
ну можно обернуть в ReadWriteLock - но все равно это полный лок на запись.
ConcurrentDictionary? так он по индексу не умеет, жрет лишнее место на бакеты (которое не очищается кстати), имеет полную блокировку на тот же Count например.
LinkedList тоже не умеет по индексу и
можно конечно мудрить "нам не нужен доступ по индексу и Count мы сами посчитаем"
а можно просто взять ImmutableList - доступ и итерирование никто не сдерживает, count дешевый и считать отдельно не нужно. Операция добавления и удаления тоже дешевые.
Время доступа к элементу...а че? типа ConcurrentDictionary быстрее что ли? там внутри как бы локи есть, если идет активная запись, то чтение будет в жо
Конечно можно запилить и своего франкенштейна, но это неблагодарное дело
вот пример https://habr.com/ru/post/240891/
чел слепил такой велик ибо другие были тормоза. и при этом в статье реализация имеет ошибку. в самом итоговом коде на гитхабе все верно, но в статье неправильно
настолько это сложно писать локфри на низком уровне, что лучше лишний раз не лезть.
в этом примере нет смысла. Сам смысл Parallel.For говорит о том, что время добавления в список хз. И тут место для ConcurrentBag
или вообще PLINQ - пусть он с этим разбирается.
Кстати, те же Concurrent коллекции не являются локфри - в том же ConcurrentDictionary хранение разбито на бакетов и каждый бакет имеет свою блокировку. То есть блокировок меньше, но они все же есть. К тому же есть операции которые требуют полной блокировки.
привычный тебе пример - ну вот анон тут писал свой event manager, где кладет понятно подписчиков в список
и вот пришло время вызывать publish и он обернул все в лок (и пусть весь мир подождет)
Что делать? ок. можем локнуть и скопировать подписчиков. Тут уже лок и копирование. Миллион событий - миллион локов и копирований.
Поэтому в шарпе события сделаны через иммутабельность делегатов. Весь сыр бор только при подписке, а при вызове ничего не копируется.
Там правда уже свои грабли в многопотоке но суть не меняется - локов при вызове нет.
Многое можно сделать через лок. все дело в цене операции что под локом.
Возьмем подобный абстрактный пример. у тебя миллион подписчиков уже в списке и тебе нужно итерировать по ним чуть ли не постоянно (ты криптобиржа и шлешь цены ))))
и доступ по индексу для каких то нужд
обычный список сразу мимо - локи могут дорого стоить, риск дедлока. А итерироваться то вообще как? только что вот описал проблему итерирования под локом
ну можно обернуть в ReadWriteLock - но все равно это полный лок на запись.
ConcurrentDictionary? так он по индексу не умеет, жрет лишнее место на бакеты (которое не очищается кстати), имеет полную блокировку на тот же Count например.
LinkedList тоже не умеет по индексу и
можно конечно мудрить "нам не нужен доступ по индексу и Count мы сами посчитаем"
а можно просто взять ImmutableList - доступ и итерирование никто не сдерживает, count дешевый и считать отдельно не нужно. Операция добавления и удаления тоже дешевые.
Время доступа к элементу...а че? типа ConcurrentDictionary быстрее что ли? там внутри как бы локи есть, если идет активная запись, то чтение будет в жо
Конечно можно запилить и своего франкенштейна, но это неблагодарное дело
вот пример https://habr.com/ru/post/240891/
чел слепил такой велик ибо другие были тормоза. и при этом в статье реализация имеет ошибку. в самом итоговом коде на гитхабе все верно, но в статье неправильно
настолько это сложно писать локфри на низком уровне, что лучше лишний раз не лезть.
Нужно в потоках использовать Interlocked.CompareExchange для обновления исходной коллекции. Типа так
Пиздец просто.
Хорошая ли практика мутировать модели приходящие через POST запрос? Или надо создавать новый объект и передавать во вьюху уже его? Поясните
чатгпт считает, что лучше создавать новую
>а если просто p.Name написать. то че это нахуй?
100% это проперти
_name private field
name public/local field
Name property
name() method
Потому что ты мудак. Компилятор умнее тебя и считает что Name относится к name.
При компиляции этот код создаст тебе поле и два метода доступа у нему. Тебе блять слева прямо говорят удалить не испольуземемое говно.
В шарпе нет ситуации когда поле класса и проперти имеют одно имя, так не пишут
>при такой записи я понимаю. что это инкапсулированая переменная
в этом и есть так то суть инкапсуляции, что снаружи тебе и не нужно ничего понимать как оно внутри и есть ли вообще это "внутри".
>при такой записи я понимаю. что это инкапсулированая переменная
Инкапсуляция - сокрытие деталей реализации от конечного пользователя. Создание абстракции.
object.Name Её пример в чистом виде. Если поле нельзя руками менять тебе скажут об этом красной чертой и ошибкой доступа. А как получается значение имя ты не знаешь, может просто дефолт свойство, а может быть там логика на 20 строк и композиция 5 полей аля "НалоговыйОтчёт_01.12.2022_31.12.2022_Стандарт3_ТребуетПроверки"
выглядит так - совсем простая формочка
из того что я нашёл, похоже что модели должны быть иммутабельными
https://stackoverflow.com/questions/70469381/does-it-make-sense-to-use-init-only-setters-on-request-models-in-an-asp-net-core
Он тожы мудак.
В запросе тебе приходит RequestDTO.
На его основе ты создаешь сущность.
Делаешь с ней какую-нибудь хуйню.
И уже на её основе (или результата той хуни, что ты с ней сделал), создаешь ResponseDTO.
И вот его уже и возвращаешь.
Приветы в треды, что посоветуете из расширений VS 2022 для ускорения написания кода.
- видел дополнение к ide, которое ищет на гите или стаковерфлов части кода с автокомплитом
- нейронки разные которые тебе подсказывают, как лучше написать и т.д.
решарпер и т.д. не советуйте, денех нет, вы держитесь
а ну это мы добавляем уже правописание. тут тогда еще надо тип данных указывать надо.
а без этого всего ты хуй разберешь глазами
>в этом и есть так то суть инкапсуляции, что снаружи тебе и не нужно ничего понимать как оно внутри и есть ли вообще это "внутри".
мне плевать че там у кого свербит. если код плохо читается и ведет к ошибкам я пишу функционально.
лучше интерфейсами обмазаться чем ухудшать читаемость.
вот где ооп. ложкой наворачивай. аж стоит
наоборот с новой строчки и надо ставить. с четкой табуляцией чтоб красиво было.
>>563404
Почему на меня не обращают внимание?
https://plugins.jetbrains.com/plugin/9513-stackoverflow есть такой же для мы, но нет вставки "первый правильный"
Но я такой видел, он точно есть.
На инкапсуляцию не дрочат. Дрочат на няшный синтаксис шарпика с сахаром, которые ограниченные джавадебилы не могут осознать.
Не нормально. Сразу учись делать нормально, ты же срать учился сразу хорошо, а не в штаны? вообще не импользуй винформы, это мёртвая технология.
чтобы было. ведь если его нет...то его ж нет. а если есть, то всегда может пригодиться.
вообще назначение этого очевидно даже из его названия
Сказал как господь.
да стоит только добавить что нахуй вообще делегаты не нужны.
если ты исподьзуешь делегаты значит ты чето наговнокодил.
товарищ не отличает делегаты от DelegatingHandler?
ну а делегаты не нужны только школьникам которые первый раз за шарп берутся
ни то ни другое нахуй не нужно. если ты будешь работая с моим кодом выебываться делегатами я техуй сломаю. у себя делай че хочешь.
события не используешь?
LINQ не используешь?
CancellationTokenы не используешь?
такси не используешь?
во всем этом юзаются делегаты
так что ты это....трусы то надень.
ладно уел.
В дот нете нет обратной совместимости рантаймов чтоли? Пытаюсь запустить проект из 2020 года и уже поставил кучу версий этого говна рантаймного, а ему похую вообще.
Че блять он хочет от меня?
а все, запустилось после установки dotnet-runtime-3.0.3-win-x64
Джавист, спок.
Это мертвая технология еще 5 итераций ASP переживет.
Десктоп вообще мёртвая технология, так что какая разница, что из мёртвых разновидностей использовать, можно выбирать то, что больше нравится. Мне больше нравятся винформы, например.
Прямо илюстрация как ведение одной абстракции с четыремя чахлыми методами дико упрощает код. А челики которые думают в терминах контейнеров и функции потеряные.
Что советуете, ангуляр вообще используется в новых проектах или на нем только легаси? Мне нравится TS и ООП в Ангуляре, что-то к реакт вообще душа не лежит. Другие варианты не рассматриваю.
Получается всё-таки сишарперов заставляют становится фуллстеками? Если хочешь чистый бэкенд, то это только джава?
>Да, в винформах его меньше.
меньше нормального кода, которого не видать среди портянок ручного управления всем гуи.
>В шарпе надо постоянно переписывать программы под новые версии
Вот это збс. Заставляет говноедов поддерживать проекты и актуализация проводить. Сейчас наши джависты ебутся пытаясь перевести проект на самые последние версии вообще всего прыгая через 6 лет назад вбитые зависимости.
Упражнение называется прохождение аудита безопасности. Тебе служба безопасности просто говорит пока у тебя не будут закрыты все уязвимости что можно(читай стоять только ласт версии) не дадим никаких подписей.
И да в шарпе дохуя чего совместимо, а сейчас уже Майкрософт прямо сказали что надо держать актуальность не меньше -2 от текущего номера
Blazor
>ручного управления всем гуи
Ты так говоришь как-будто он сам собой где-то умеет управлять. Привязка любых моделей к гую это ад портянок.
>он сам собой где-то умеет управлять
да. именно так
>Привязка любых моделей к гую это ад портянок
декларативных портянок, которые
а) сильно короче ручной херни
б) используют правильный flow (хз как это сформулировать), а не инвертированный.
поясню подробнее
возьмем подход MVVM/MVU
там происходит наблюдение за стейтом или биндинг на вьюмодели (в общем то это одно и то же, только по разным углом). То есть меняется стейт - и все заинтересованные контролы меняют в себе все как надо. Биндинг позволяет это короче описать, вообще без строчки кода.
Новые элементы не заставляют ничего переписывать, ведь каждый контрол он "я и стейт".
А теперь возьмем обратный подход - на любое событие ты в коде идешь и вручную лезешь к каждому контролу что должен быть изменен и меняешь его состояние. У тебя нет точки наблюдения - все инвертировано и ты сам ко всем бегаешь и пишешь горы кода по их изменению на новые данные.
Причем это многословно пипец (твой скрин пруф)
Если ты чуть опытнее, ты можешь спрятать портянки за MVP, но это все хрень потому подход "по событию бегаем меняем где надо" априори ущербен.
Если добавляется новый элемент, то нам нужно подправить все места где этот элемент должен меняться. То есть добавить еще море портянок с дублирующимся кодом и нигде не забыть.
аналогично если добавляется условие, то происходит "комбинаторный взрыв" и расползание кучи if по всем этим участкам.
ps: в таком чокнутом стиле можно и на WPF писать и если что использовать свои шаблоны. Вопрос - нахера тогда винформс нужен.
https://youtu.be/BG4nnMR7uTs
По скрину выше.
У меня чистая модель Пазла. Она ничего не знает про свое отображение. Для нее отобржанием ялвялется кнопка винформы и она же хранит у себя модель(владеет пазлом, да). Весь остальной код(NewGame, MovePuzzle, Swap) работает как View Presenter - он знает что модель меняется и за ней надо обновить View, отсюда появляется все кнопкопетушение.
Смысл игры вот в чем: как не декларируй, как не обмазывайся наблюдателями и отдельными классами VP все равно получится тот же код связи Пазла и Кнопки, но через три абстракции передачи сообщений от модели к виду. Если не предполагается менять вид, то смылса в излишних телодвижениях нет - просто хреначим один презентер прямо в код формы где V намертво прибит к М и радуемся жизни.
>нахера тогда винформс нужен.
ВинФормы просто UI, под капотом можно как угодно писать.
Попробуй написать свой вариант если хочешь.
Вот ссылка: https://rosettacode.org/wiki/15_puzzle_game
>У меня чистая модель Пазла...работает как View Presente
да ну. в упор не вижу никакого презентера. Вижу смешение логики отображения и логики приложения. Ну разве что некоторые методы выделены ура ура.
с мелкими приложухами это еще ладно (хотя я это не признаю ибо лучше сразу сделать нормально и чисто, чем говно), но с большими у тебя будет там "война и мир"
>но через три абстракции передачи сообщений от модели к виду.
и что с того? абстракции для того и нужны чтобы скрыть детали. В этом их сила. Главное чтобы их не было сильно много, но пренебрегать ими просто глупо
>Если не предполагается менять вид, то смылса в излишних телодвижениях нет
ну тут каждому свое. я вот просто сразу сделаю чисто. потому что количество "лишних телодвижений" дает структурность, которая сильно перевешивает написание и удержание в голове контекста этой портянки.
>ВинФормы просто UI, под капотом можно как угодно писать.
ага. путем пердолинга в OnPaint
>Попробуй написать свой вариант если хочешь
по ссылке понятно. это примеры. это говнокод, но это ж примеры.
сравнивать нужно причесанный код по читабельности и структурности.
И тут что угодно порвет портянку на скрине ибо там не только ущербный подход, а даже без попыток сделать чище (что кстати можно и в винформсах)
итог: я понимаю что это просто пятнашки и для учебы. но лучше сразу приучать себя делить все на контексты, слови, зависимости и тому подобное. Чтобы от такой портянки сразу был рвотный рефлекс
ps: сам я старой школы и для меня не норм когда для простой вещи берется что-то монструозное и потом это все весит дохера и еле работает. Но даже мелочь я сразу пишу чисто. Уже не раз попадался на "да нафиг оно надо, оно написал и забыл", а потом приходилось переписывать.
На джаве тоже половина вакансий требует знаний фронта. Сейчас везде такая тенденция, но шансы найти почти чистый бекенд есть на любом стеке, даже на пхп.
Держи хоть 7.0 просто собирай на старой студии. В чем твоя проблема перейти на новую версию?
Версии синтаксиса и компилятора сильно завязаны на версии дотНЕТ и студии. Но тебе никто на мешает скачать и поставить параллельно 2022 2019 студию для пердолинга старых проектов. Но лучше их обновить.
Если тебе страшно обновить проект, то ты написал кусок говна. Я меняю версии и запускаю полный прогон тестов и получаю результат пройдены все тесты, автотесты завершены
Не генерируй числа тупо в рандомных местах. Инициализируй сразу правильную раскладку и дальше делай рандомные перемещения, как если бы это делалось вручную.
Хотя вряд ли будет легко изменить поведение с портянкой из запрограммированных мышкой button13_Click
> int GridSize
Как задать неквадратный грид? И что будет, если BlockCount не равно GridSize * GridSize?
Меня это не тревожи чесно говоря. Константы не меняются.
Залил изменения: https://rosettacode.org/wiki/15_puzzle_game#C#
Пацаны, обсирайте! Алсо, я выкинул линк.
Перекат без тега. Сидим в старом.
Выглядит наоборот, как-будто говноеды из майкрософт экономят на поддержке своего говнокода sdk иruntime и выписывают себе премии за регулярность релизов.
Просто перенесенная с Винды схема
Поддержка старых версий(старше 5 лет) это ебаный кал который тормозит развитие и делает из С++ кусок говна, зато обратная совместимость.
Обратная совместимость это зло и якорь.
Стоит, потом просто почитаешь доки и подтянешь свою базу под актуальную версию.
Почему так всё быстро? Нет, чтобы каждую версию выпускать раз в 3 года, потом ещё поддержку лет 5.
Школьник, ты? Нормальные люди хотят использовать новые фичи, не занимаясь при это переписыванием старого кода.
ну вообще касаемо рантайма и самого фреймворка переписывать не приходится. Максимум версию поднять и перекомпилить. Или вообще без этого.
А вот асп.нет страдает "сделаем все по новому"
К примеру, мы можем добавить аннотацию:
[Required(ErrorMessage = "Error! Enter data in field!")]
где сообщение об ошибке явно относится к представлению.
тогда чего ты споришь с учителем
на самом деле аттрибуты не относятся к логике, ведь это всего лишь метки при этом из общей сборки.Но вообще не гуд так вот мапить на модели, а лучше иметь для этого особые DTO объекты.
1 они отвязывают структуру модели от визуальной части
2 могут быть заполнены частично и это норма
3 могут переиспользоваться
4 могут иметь на себе аттрибуты биндинга из-запроса
5 будет больше котов в мире.
Студия подлагивает слегонца, хотя после 10 минут работы вроде пропёрживается и почти не чувствуется лагов, но все равно бывают фризы. Так что думаю код буду писать в легковесной VS code, а если че надо будет посерьёзней, то буду запускать вашу тяжеловесную иде.
Ебаться когда будешь бабу дилдаком еби, а когда уже дело сам.
Купи нормальный ссд и перестанет лагать. Вообще ты конечно не ведре работаешь полном
В VSCode тормозить будешь уже ты. Кто-то же должен делать то, что студия делает за тебя.
Пиздец, это ведро стоило 65к в 2018, это был средний компьютер. Сейчас оказывается это ведро охуеть. Может проградизды будут норм работать, чтоб ебучая иде не весила 50гб и чтоб не лагала на норм проце 4 ядра i5 2018 года????? У меня ведь еще и 16 гигов оперативы, это так-то дохуища просто я считаю.
>>564802
Ну так сначала надо понять вобще, че куда и как, смысл мне от помощи иде, если я даже понять эту помощь не способен.
Ладно кароче понятно, придется еще 2 месяца на толоке копить на новый "среднекомп", который опять через 4 года будет ведром.
Скоро вин10 закроют и надо будет ставить 11, а может и 12 выйдет с более высокими системками, а без них не будет новых дотнетов. Я так вынужден был с вин8 перейти на вин10 тупо ради новых дотнетов. Так что требования к железу для программирования на сишарпе будут расти.
Вот видите, человек аж на виме пишет! Значит вскода достаточно. Всем спасибо за советы и ответы.
>но все равно бывают фризы.
1. Поставь нормальный объемный SSD, вместо HDD.
2. Сделай полностью установку на SSD (сама IDE, хранилище пакетов и т.д.)
3. Проекты с которыми работаешь так же храни на SSD
4. В студии отключи все лишние нагрузки, вроде анализаторов кода, покрытие, лишние codelens и т.д. (гугл "повышение производительности visual studio" в помощь)
5. Отключай ненужные расширения. Часто они могут конфликтовать друг с другом. Так же не держи постоянно включенными те, которые тебе не нужны. Например какйо-нибудь спеллчекер можно включать только перед финальным коммитом.
Берём создаём чистый проект, создаём папку "pizda" и файл "zalupa.fs" в ней, пишем какой-то код, делаем публичным. Пока всё заебись - из Program.fs, лежащего рядом с файлом проекта, залупа доступна, код компилируется. А теперь делаем магию - кидаем прям мышкой в вижуал студии файл Program.fs в папку пизда и обратно. Имеем файл проекта идентичен тому что был до этого, все файлы лежат на тех же местах. Но залупа уже не доступна! Код не компилируется! Даже из консоли без студии dotnet build не работает после перемещения файлов.
Как индусы так сделали? Файлы проекта не менялись, а код больше не компилируется. Я бы ещё понял если это студия как обычно ебала мозг, но из консольки тоже хуй.
Я даже пробовал бэкапить всю папку проекта, но после того как файл перемещается, код уже не собирается. Хотя в файле проекта в ItemGroups всё верно прописано.
И ещё wildcards не работают, даже пример из документации не будет работать с F#. А если у меня нет студии и я пишу руками файл проекта, то с вложенными папками уже сразу нихуя не работает.
Вот так и пользуйся софтом ундусов, качество продуктов просто 10/10. Алсо, в сишарпе этого говна похоже нет.
Борщехлёбы должны страдать.
>Файлы проекта не менялись, а код больше не компилируется.
Я х.з. какая структура проекта в F#, но точно ли ничего не менялось?
Прямо вот если весь каталог под контроль версий взять, а потом проделать твои манипуляции и посмотреть действительно ли нет изменений. Может в каком-нибудь метафайле что и поменяется или новый файл добавится.
>Пиздец, это ведро стоило 65к в 2018, это был средний компьютер. Сейчас оказывается это ведро охуеть. Может проградизды будут норм работать, чтоб ебучая иде не весила 50гб и чтоб не лагала на норм проце 4 ядра i5 2018 года????? У меня ведь еще и 16 гигов оперативы, это так-то дохуища просто я считаю
Диск у тебя какой ебалай. ОЗУ твоё в хуй не нужно, важно мощный ссд и тогда у тебя все летать будет. Студия активно индексирует файлы и постоянно их дрочит сканом в фоне чтобы тебе дебилу аналитику выдать и стат анализ кода.
И да комп за 85к это просто комп средней руки, ничего особого
Таки да, учитывая нейросеточки без геймерского компа уже пограмировать не получится.
Не удивлюсь если потом запихнут прямо в студиую асистента, который не только жесткий задрочит, но и видюху спалит.
Получается выгоднее кодить на нормальных языках: PHP, Ruby, Python, Lua. Впрочем, любому адекватному человеку это и так понятно, просто до шарпистов не сразу доходит.
Ты абсолютно прав. Ты просто нас уничтожил. Завтра же пойдем записываться на курсы нормальных языков.
Таки просто никому в голову не приходит что в наше время кто-то собрал себе для работы пека на 16Гб ОЗУ и без м2 ссд на борту. У него из нормального железа только проц стоит, но на проц сейчас уже похуй хватит любого если не нужно собирать все за наносекунды.
Мне вот для нейронок не хватает 3080 и 32гб ОЗУ, иногда получаю вылеты из-за того что не рассчитал потребление памяти и получил по ебалу
Курсы не надо. Берешь "Dive in Python/Ruby/PHP" и вкатываешься за 2 недели максимум. Потом фрейворк один учишь 1-2 недели, потом 1 неделю на вротенд, потом 1 неделю на SQL и еще пару дней на ORM. Ну и всё по сути, всякие дизайн паттерны джунам не надо знать, поэтому просто пишешь микроприложуху крутецкую, выставляешь на обозрение, делаешь резюме и откликаешься на все доступные вакансии с сопроводительным. И ждем.
Что мы имели бы в шарпе? 2 месяца дрочить синтаксис, 3-5 месяцев asp учить, еще желательно WPF осилить для пущего эффекта. Короче месяцев 10 минимум займет.
Теперь сравни 1 месяц vs 10 месяцев. Кто захочет тратить свою жизнь на какой-то более "функциональный и уникальный и вобще крутой" язык, если можно хуяк-хуяк и всё готово???
какие у тебя фантастические сроки.
такое возможно только если уже есть опыт подобного на других языках.
а пхп вообще выучить невозможно ))))
чудный язык, где можешь быть про, но все равно без доки никуда из-за непродуманности.
Я тут смотрел видос Соера, где он хвастается, что читает талмуды за один вечер:
https://youtu.be/k0eDZVmbjUo
Но мне кажется, это не вариант для ученика, потому что ему надо разобрать материал подробно, потому что его спросят на собесе. А он читает для общего ознакомления, либо уже знаком с материалом.
Он прав.
Ну разве что ошибается про художественную. Там конечно нет кросс-понимания смысла вы раньше это уже видели" , но скорость чтения достигает 3-10к слов в минуту из-за того что и не нужно разбираться в прочитанном (чай не код же).
Потому при настоящем скорочтении художественная читается быстрей
А техническая быстро сканируется в поисках недостающих элементов пазла общей картины че как устроено
Ангуляр давно мёртв, новых проектов на нём никто не пишет, только поддержка легаси.
Нисколько там первые 100 страниц вступление и основы языка, ещё 100 в конце это всякие справки.
В итоге там 800 страниц темы которые неспеша читаются за 2-3 недели
Я хочу заставить класс реализовывать свойство нужного имени, но тип должен быть тот, который классу нужен.
Дженерики не предлагать, тип Object не предлагать.
Даже если взять какой нибудь ICommand, то там свойство property передается через Object. Можно как-то это переиначить в конкретный тип?
>Дженерики не предлагать, тип Object не предлагать.
я умираю с голоду. еду не предлагать, молитвы не предлагать.
это тебе к жавистам
Если что KeyGesture поддерживает INotifyPropertyChanged . Но явно ругается на Binding (не важно чего). На SO все почему-то приводят пример хардкодинг хоткеев в KeyBinding (пикрил 2)
Анон порекомендовал шрифт JetBrains, сам страдал.
У меня JetBrains Mono NL Light - не слишком жирный и не тонкий.
Вот я раньше делал кучу команд типа "нажал кнопочку и выполнилась команда из вьюмодели". Все просто и понятно.
Но вот у меня задача: я нажимаю кнопку, и прежде чем должна выполниться команда, возникает окно запроса ввода данных.
Проблема заключается в том, что вьюмодель не может содержать никаких окон и я не могу внутри команды иметь экземпляр этого окошка с запросом. Вероятно, окно должно находиться посредником между кнопкой и командой. Но как это дерьмо реализовать в MVVM?
в MVVM нет понятия окон. Это просто модель визуального состояния (плюс контроллер, что является жирным недостатком паттерна и потому его вырождают в MVVMC)
А значит можно сделать на уровне вида, чтобы он спросил до передачи вьюмодели.
Или же на уровне вьюмодели должен быть какой нибудь сервис IPromptService по аналогии со всякими IDialogSerivce-ами
нужно понимать что сервисы будучи спрятаными за интерейсами могут иметь любое знание о виде.
Также может быть банальный проперти Func<Result> у вьюмодели и на него вид забиндит свой обработчик, ведь целый сервис нахер не нужен ради одного случая.
>А значит можно сделать на уровне вида, чтобы он спросил до передачи вьюмодели.
Это я понимаю. У меня как раз траблы с реализацией это затеи. К примеру, в контекстном меню есть вот такой итем, по клику которого переименовываются выбранные папки в списке:
<MenuItem
Header="Rename Selected"
Command="{Binding Path=RenameCommand}"
InputGestureText="Ctrl+R" />
Тут напрямую идет команда RenameCommand из вьюмодели. Я вижу два варианта для вставки окна:
1. Я могу подписать итем на событие OnClick и там запустить окно, а затем запустить команду. Для контекстного меню я проблему допустим решу, но вот с запуском команды по хоткею такой финт не прокатит т.к. KeyBinding для InputBindings требует ICommand и туда нельзя передать делегат метода. Мне вдовесок придется избавиться от KeyBinding и по старинке городить в событии KeyDown проверку нажатых клавиш и уже там запускать нужные методы и команды.
2. В неймспейсе окна не являющегося частью неймспейса вьюмодели, я сделаю дополнительную команду, которая бы делала все тоже самое, что и метод OnClick в первом случае. Но тогда возникает проблема синхронизации с вьюмоделью.
Оба варианта нарушают MVVM и плодят города из кода.
1 не нарушает.
2 вообще не понял о чем ты
я предложил тебе 3 варианта. все они не нарушают мввм.
смотри
в 1 варианте нет никакого нарушения MVVM. во вьюмодели есть, допустим, метод DoLogin(user, password), на что она имеет право и как бы без разницы откуда берутся параметры - вид, в свою очередь, у себя может творить что угодно касаемо пользовательского ввода
во 2 варианте нет нарушения потому что просто объявляется интерфейс вида ICredentialProvider и кто-то там его реализует. То есть вьюмодель всего лишь спрашивает у этого сервиса "дай мне кредентиалы". А реализация может быть как завязана на вид, так и вообще из конфига данные дать. Таким образом, в сборке вьюмоделей живет всего лишь интерфейс, но не реализация.
3й вариант тоже ничего не нарушает, ведь вьюмодель может обьявить у себя любое свойство и Func<> ничем не хуже и не лучше. ну да, вид может забыть его установить и будет NRE, но точно так же вид может забыть установить любое другое свойство и в результате тоже будет ошибка.
Похуй на тег, тонуть заебало.
Заюзал вариант с передачей функции в свойство. Теперь при выполнении команды сперва чекается это свойство. Мне кажется это самый безболезненный вариант и позволяет работать с оригинальными командами.
Подписался
Так как комп рабочий, это не вариант. Чем можно заменить VS, eclips пойдет? Или что-то другое?
Ничем. Поставь себе актуальную ОС. ДотНЕТ у тебя старше 3 даже не будет работать в 7
nvm, я уже увидел про multitenancy, ух блять.
Не ебу почему в ебларуси на двач через раз пускает
Были вопросы про типы данных, коллекции, отличие Array от условного List, XML, состояния БД, LINQ. Вроде все, что сейчас могу вспомнить.
Уже прислали отказ. Сегодня собес в другую компанию.
Это разные структуры данных, вы не прошли собес. У массивов быстрый доступ к произвольному элементу, но медленное добавление новых элементов, у списков наоборот
Во всех мануалах по взаимодействию форм делается примерно следущее:
Form1 form1
{
buttonCallForm2_Click()
{
Form2 form2 = new Form2();
form2.Show();
}
}
А можно ли сделать вот так:
Form1 form1
{
buttonCallForm2_Click()
{
CalForm2Method();
}
void CalForm2Method()
{
Form2 form2 = new Form2();
form2.Show();
}
}
И что вообще происходит с переменной форм2, как и когда она диспосится, особенно в случае с методом, разве не тогда, когда метод отработал? Их именно поэтому и пихают в события? Это единственно правильный вариант? В событии переменная не исчезает?
Во всех мануалах по взаимодействию форм делается примерно следущее:
Form1 form1
{
buttonCallForm2_Click()
{
Form2 form2 = new Form2();
form2.Show();
}
}
А можно ли сделать вот так:
Form1 form1
{
buttonCallForm2_Click()
{
CalForm2Method();
}
void CalForm2Method()
{
Form2 form2 = new Form2();
form2.Show();
}
}
И что вообще происходит с переменной форм2, как и когда она диспосится, особенно в случае с методом, разве не тогда, когда метод отработал? Их именно поэтому и пихают в события? Это единственно правильный вариант? В событии переменная не исчезает?
> А можно ли сделать вот так:
Нет никакой разницы, создаёшь ты дочернее окно непосредственно из метода-обработчика или из другого метода, который вызвал обработчик.
> В событии переменная не исчезает?
Здесь тебе не C++. Объект будет уничтожен не сразу после того, как на него не останется ссылок, а по желанию левой пятки сборщика мусора. Но это не так важно, диспоуза не будет, пока пользователь не закроет form2. И обычно для дочерних окон вызывают не Show(), а ShowDialog(), который ждёт, пока не закроется окно, и только после этого продолжает выполнение метода. Show() показывает окно и сразу же продолжает выполнение метода и даёт обрабатывать новые события. Т.е. для Show() можешь делать что-нибудь ещё в родительском окне, пока не закрыто дочернее (например, можешь ещё раз кликнуть на кнопку, и будет открыто уже два дочерних окна, а ShowDialog() блокирует родительское окно, пока открыто дочернее.
Привет пацаны, подскажите как разместить свой пет проект на vps сервере, если он использует бд mssql, как это вообще сделать
Запощу уродский пост, но прошу рассказать, почему C# - лучший язык программирования на планете, как у вас написано в шапке.
Я же правильно понимаю принцип работы VPS. Я покупаю доступ к компьютеру (серверу), например на Linux и могу тутда устанавливать любые программы, в том числе MsSql и использовать ее уже для своих нужд?
>почему C# - лучший язык программирования
Так как это тред по C# Нет такого понятия как "лучший язык программирования"
>Golang или C#
Распиши плюсы и минусы. Или не расписывай и выбери тот, который нравится, это будет правильнее.
Сегодня только обновлялся. Все работает без всяких ВПН
Хочу в С# вкатиться первым языком, но не могу установить VS, так как на рабочем компе нет админки. Посоветовали скачать VS Code, но и тут проблема, не могу установить .NET из-за ошибки 0х80070005, для ее устранения тоже нужна админка.
На что еще можно заменить, на чем удобно в C# вкатываться?
Бля. Опять тред перепутал.
https://pastebin.com/aXia8KyB
TLDR - проще всего посмотреть на код, там есть комментарий. Вопрос только в том, можно ли как-то вызывать функцию при изменении запаса здоровья в другом классе, либо при вызове методов другого класса, не меня ничего в классе Health
Нужно изменить полоску запаса здоровья, но каждый раз делать это в методе Update(), который вызывается каждый кадр, как будто бы плохо, потому что это значение будет меняться очень редко, поэтому я и хочу узнать можно ли привязаться либо к изменению переменной во внешнем классе, либо к вызовам его методов, не меняя сам внешний класс
В Реакте например есть useEffect, который позволяет повесить на изменение значения переменной любой callback, который будет тригерриться только при изменении значения переменной
Имя параметра: index
Помогите пж выходит такое исключение в этой строчке, в инете гуглил хз ниче не понял
Если у тебя в массиве, скажем, 5 элементов, то валидные значения индекса будут от 0 до 5-1, т.е. от 0 до 4. Либо, если коллекция пустая, для неё нет валидных индексов.
Очевидно, что эти условия таои индекс не выполняет.
ИДИ НАХУЙ
В хелс классе делаешь публичный евент public event Action<int> который при изменении хп рассылает текущее значение. В хелсбаре делаешь метод, который параметром принимает инт. Метод подписываешь на эвент. Вуаля.
Попробуй TS, с шарпов сильно приятнее, да и сам язык поудачней будет
Это копия, сохраненная 3 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.