Вы видите копию треда, сохраненную 6 апреля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
— 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
Прошлый тред: >>2564359 (OP)
Опять джавадебил перекатил тред.
Анон, щас будет вот вообще пиздец нубский вопрос:
Если я захостю сайт через Apache по инструкции с MSDN и при этом у меня динамический IP, при переходе по этому адресу с других устройств, скажем на 228.359.1.69/Home/Index будет сайт работать?
Если у тебя нет виртуальных серверов в конфиге, а один, который отвечает на все запросы, то будет. А так да, белый айпи.
Проблема в первую очередь не в динамическом IP, а в NAT.
Если другое устройство находится в той же сети, что и твой сервер, страница откроется, например, если компьютер и мобилка подключены к одному роутеру, то с мобилки ты можешь подключаться с серверу, запущенному на компьютере. Но с мобильного интернета или с компьютера в другой сети доступа не будет.
Ну и сервер надо запускать не на локалхосте, а по адресу 0.0.0.0, иначе сайт будет работать только локально.
Смотря что за ммо-шка.
Смотря насколько низкоуровневых ботов ты хочешь сделать. Если достаточно кликать мышкой и нажимать клаву, то шарпа хватит, а если надо ломать сетевой протокол клиента и подсовывать ему фейкоту, то очевидно нет.
Нужен С++. Обычно тебе будет нужно взаимодействие с кодом игры, а почти все ммо написаны на С++.
Забудь про вообще, это мертвое наречие и на нем уже лет 50 не пишут ничего нового
Тут недавно всплывала тема про удаление папки obj.
Так вот, я очистил все obj и bin в каждом проекте решения, и у меня отвалились импортируемые с локального диска библиотеки.
Библиотеки лежали на другом диске и линковал прямо оттуда, а их местоположение не изменилось. Т.е. не было такого случая, что копировал ручками dll в папку с решением и как-то там случайно его удалил. При этом студия отказывалась видеть, пока я заново не прошелся по всем проектам и не перелинковал библиотеки заново.
Поискал, где эта библиотека находится в проетах и в 100% случаев она находится в папке bin (которые я тоже чикнул). При этом Nuget библиотеки вроде как восстановились.
Че за магия?
Короч упоминание библиотеки есть в двух файлах
собстно в проекте <project_name>.vbproj
и в папке \obj\Debug\net6.0-windows\, в файле <project_name>.vbproj.FileListAbsolute.txt
В первом файле указан абсолютный адрес к библиотеке и ее расположение не поменялось. Во втором уже относительный.
Сранно.
Моя личная библиотека, написанная еще на NetFramework. Лежит себе на диске типа D:\Code\Libraries\MyLibrary.dll
Добавляю в проект на net6.0 через "добавить ссылку". Собственно в файле .vbproj отображается полный путь к библиотеке.
Причем когда у меня возникла ошибка и посыпалось все решение, мне пришлось сперва удалить из ссылок мою библиотеку и только потом снова добавить. Иначе пишет, что библиотека не поддерживается.
>на net6.0 через "добавить ссылку". Собственно в файле .vbproj
А разве VB под .net6 есть? Я думал его еще на .NetFramework 4.8 стопорнули.
Во вторых сама идея подключать .NetFramework библиотеку к .Net6 проекту такое себе. Хотя бы под .NetStandart пересобери ее.
В третьих такой способ подключения библиотек сам по себе туфтовый. Создай свой локальный нюгет, помести туда свои библиотеки и подключай их как белый человек.
Алсо, если это твоя собственная библиотека, то намного проще ее подключить в виде исходников к проекту.
>А разве VB под .net6 есть? Я думал его еще на .NetFramework 4.8 стопорнули.
А как еще добавлять?
Зависимости -> Добавить ссылку.
в .vbproj пикрил. Ничем не отличается от добавления текстового файла.
>>582966
>>582963
>то намного проще ее подключить в виде исходников к проекту.
Да как-то не проще. Я не собирался ее редактировать, нах мне куча мозолящих глаза папок?
>Создай свой локальный нюгет, помести туда свои библиотеки и подключай их как белый человек.
Бля, было же просто. Не, ну давайте простые вещи делать через жопу, давайте погрузим данные в ракету, предварительно зарегистрировавшись в аккаунте NASA, отправим все это на Марс, шоб просто поковыряться в жопе.
Ну хоть есть возможность локально подключить и на том спасибо.
1. Почему в райдере нельзя добавить к нет кор проекту ссылку на COM библиотеку.
2. И почему мне выдает такую ошибку при регистрации dll.
Вот если я подписался на событие, то мне нужно реализовывать Dispose, чтобы не забыть отписаться. Меня этот подход немного давит.
А что если я передам ссылку на метод, который будет запускаться изнутри класса? Все равно надо потом это все подчищать?
class User { string Id }
-и-
class User { string UseriId }
Не очень понятно какой из них лучше использовать.
Че тут непонятного? Твой запрос должен быть очевиден пользователю.
Если у тебя много свойств с именем ID в классе, то приписываешь уточнение.
Если это единственный ID, то можно не надо.
Просто пирписав User к ID, как снежный ком придется приписывать User ко всем остальным свойствам.
Первый вариант хорош для создания Entity с одним свойством Id. Тогда можно будет создать репозиторий который будет принимать только наследников этого класса.
Копируются в выходной каталог как есть. В обжект хранятся промежуточные файлы
>я очистил все obj и bin в каждом проекте решения, и у меня отвалились импортируемые с локального диска библиотеки.
Это ненормально. При ребилде все библиотеки указаные в файле проекта должны быть скопированы обратно в /bin/ и там нормально увидиться. Если у тебя не так, то надо чекнуть рефренсы у проекта.
> Все равно надо потом это все подчищать?
Ды-а! Подписка на эвент создает делегат который держит ссылку на объект, и явное создание дегата с его передачей объекту-потребителю тоже держит туже самую ссылку. От событий надо отписываться, а делегаты занулять.
Просто появляется желтый треугольник над проблемной либой. Причем если я чищу obj из одного проекта, то как бы норм, а если чищу obj всех проектов решения, то выскакивает проблема.
Может где-то перекрестные связи между проектами. Одно требует от другого, когда то не готово. Технически не создаю рекурсию — студия не ругается, но через третье колено боюсь что вероятность есть. Я думаю, что проблема в этом.
Блять чел.
1) делай рестор пакетов решения
2) не чисти руками используй сука иде
У меня было решение на 20 проектов. Удалял даже руками обж и нихуя не было. Ты какую-то хуйню там наделал похоже
читай аутпут же. Там он напишет варнинги по которым рисует треугольники. Увы студия никак больше не поясняет почему треугольничает
насколько он вообще рулит?
в интернетах очень противоречивая информация, кто-то говорит мамой клянусь работает как часы, кто-то говорит что компилятору похуй вообще он лучше тебя знает
а я просто не знаю
пытаюсь сбэкпортить одну вещь на говно мамонта где его еще не было
Ну навесить же его можно на что угодно, так что это не более чем указание "я бы хотел чтобы оно всегда инлайнилось". А результат не гарантируется, ведь 100500 причин которые могут не дать его инлайнить.
ну короче не буду париться и закоменчу, все равно их использовать не могу
>насколько он вообще рулит?
Вроде это опциональный атрибут. Конпелятор его игнорит если заинлайненый метод больше определенного размера(32 инструкции IL) и в нем есть вызовы других объектов(т.е. не к своим данным обращаешься).
Переезжай в ДС.
Гугли c# subprocess pipe
Почему это говно провалилось?
Не провалилось.
Отбой, до самого дошло сразу после того как пост написал.
Увы, но других вариантов нет. Учишься, нарабатываешь опыт/проекты, стучишься в вакансии и доказываешь что можешь и умеешь.
static (string Name, int Age) GetTupleA()
{
return GetTupleB();
}
static (string Name, int Age) GetTupleB()
{
return ( "Иван", 1000);
}
Получится два абсолютно разных кортежа или как-то автоматом определяется одинаковая сигнатура?
SignInStatus { Success, Failure, Cancel }
Увидел в другой коде похожий enum, но там Cancel написан в прошедшем времени Cancelled. Какой вариант правильнее - мой или их? Мне кажется, если ты пишешь Cancelled, то другие значения должны быть Succeed и Failed тогда.
Я бы все отдал за вызов расширений из класса, для которого они не были написаны.
>>584462
У нас в бейсике добавляется аргумент <Extension> перед функцией-расширением, но параметры пишутся стандартно.
В шарпе тоже должен быть какой-то идентификатор, который бы отличал обычную функцию от функции-расширения. Это касается не только ReactiveUi, а вообще всех расширений.
https://metanit.com/sharp/tutorial/3.18.php
Не пытайся играть в колдунство, запоминая заклинания — загуглил бы про расширения и не ебался бы джва часа.
>Увидел в другой коде
Похоже на меня. С инглишем дубово и могу одно написать в прошедшем, другое в настоящем, перепутать selection с selected. Вообще, эти игры в склонения боком выходят, когда одно дург с другом переплетается, и у тебя уже целый зоопарк: одной свойство так, другое свойство сяк, метод вообще эдак. И уже визуально начинаешь путаться.
Я думаю, что лучше как у тебя. Наверно надо относиться к этому как ключевым словам — они неизменны и потому легко читаемы.
>Какой вариант правильнее
Все правильные. В нете есть соглашение, что окончание -ed пишут когда что-то уже строго произошло, -ing пишут когда вот прямо сейчас произойдет, и без окончаний когда время неважно.
>Кто сеймыч?
Писал так всегда.
бейсикодебил
Попробуй писать is Nothing и в конце строки не ставить ";"
>Попробуй писать is Nothing и в конце строки не ставить ";"
Даже если мои ноги сгниют от крокодила, а мать продам в рабство, даже тогда я буду выше этого.
Всегда так пишу. Но да, в EFCore были места, где он не мог это нормально прожевать. В новом вроде все чики-пуки.
Функциональщина не везде роляет. Иногда нужны простые if/else конструкции и там ?? не везде проканает.
Охуеть, ?? теперь уже функциональщина. Жду, когда функциональщиной объявят using.
<realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06">
...
</realty-feed>
И ёп жежь как оказывается не проблемно получить именно такой элемент с именно таким неймспейсом на шарпах.
во-первых по умолчанию туда пихаются неймспейсы по умолчанию xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema". Ладно их можно прибрать:
var s = new XmlSerializer(typeof(Feed);
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
s.Serialize(SomeStrem, new Feed(), ns);
Но, сука, не получается добавить туда вместо них xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06"
ns.Add("xmlns", "http://webmaster.yandex.ru/schemas/feed/realty/2010-06");
Даст результат
xmlns:xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06"
Попытки наебать
ns.Add("", "http://webmaster.yandex.ru/schemas/feed/realty/2010-06");
или
[XmlAtribute("xmlns")]
public string Xmlns = "http://webmaster.yandex.ru/schemas/feed/realty/2010-06"
Приводят к отсутствию неймспейса вообще, пока действую приведением опосля в нужный вид уже сериализованногго текста, но это же хуйня, какого хуя сериализация не может проходить по моим правилам, шо за бред? Есть тут кто имел дело с яшей.недвижимостью, памахите
Само по себе нет. Но способ использования предлагаемый тобой - да.
>Даст результат
>xmlns:xmlns
Нутк да, ты же добавляешь неймспес с названием "xmlns". Получается такое дублирование. Походу это у хуяндекса какое-то ебанутое представление о немспейсах(они пытаются дефолтный переопредлить на свой).
Но у меня бомбануло, от того что казалось бы простая задача оказалась трудновыполнимой
?&%::^$@'# — это не выразительные средства, а способ выебать себе и другим моск.
В WPF был метод OnStartup и события Initialized/Loaded. Эту подготовку надо выполнить непосредственно перед запуском самого приложения.
Какие в ASP (webapi) есть для этого средства?
#if DEBUG_CHECKS
//....
#endif
вроде можно #define там же c этим впилить и будет компилиться
но как его врубить для всего проекта?
Попробуй сделать сервис наследованный от IHostedService.
Там есть методы StartAsync и StopAsync, которые работают при запуске/завершении приложения.
Свойства Проекта - Построение - Символы условной конпеляции, пиши туда все что надо.
Тут подумал, а ведь нельзя так открыто собирать ID'шники, ибо по ним можно установить пользователя, например? Хочу обрезать все ID'шники до 8 символов с конца, потому что мне не нужен полный ID для отладки на сервере. Правильная мысль? И как бы лучше это в коде запилить? Может добавить метод StringUtils.EscapeId(...);
спасибо
Чел, речь вообще не об этом. В приложении используются сторонние сервисы для входа и у них есть ID. Типа фейсбук, гугл, эпл.
>А писать постоянные ConfigureAwait так выразительно аж пипец.
ну да, гораздо лучше этой ^!@$^&&=>(xyipizda)
ведь мы для людей пишем а не для таукитян или какой-то там машины ебучей
>ведь мы для людей пишем
Ты не поверишь, но людям не нужны бесполезные new, ;, излишние скобочки
Попробуй какой нибуь Parallel.Foreach сделать, так запутаешься в скобочках
Выразительность - не значит магические символы.
Попробуй банальное "хочу foreach но с индексом" и сам все поймешь
и да, как раз этот ConfigureAwait настолько "выразителен", что люди предпочитают его не писать даже если это стоит некоторого оверхеда.
Это... Поставь студию 2008-2015 под неты 3.5-4.6 Для шараги должно хватить за глаза. Все проекты сделаные в них в джва клика портируются на современные поделки микрософта.
Алсо студия 2008 сейчас воспринимается как фитоняшка. Она даже быстрее вс-кода, а ведь когда вышла была жирным тормозным чудовищем на фоне делфей, лол.
Есть же System.Reflection.Assembly через которые все пути достать можно.
>Попробуй банальное "хочу foreach но с индексом" и сам все поймешь
"хочу foreach но с индексом" - это фиаско. Foreach, ты как раз и используешь, когда тебе похуй на индексы. Если тебе не похуй, то ты не исползуешь foreach.
И да, в шарпе даже такую хуйню можно делать очень просто (см. пик)
> то ты не исползуешь foreach.
и использую что?
А то что на скрине это дичь. Выразительность этой портянки никакая.
Хорошая идея анон, спасибо, попробую наверное так и сделать.
>2585687
>Попробуй банальное "хочу foreach но с индексом" и сам все поймешь
Просто For?
>>585757
Чет сложнее обычного цикла.
ну да. это ж шарп )))
выразительность такая выразительность )
>>585797
дело не в сложности, а в читабельности
наслоение семантического шума просто потому что "а иначе и нельзя, это ж шарп"
Какой нибудь foreach(... in items.WithIndex())?
ну можно запилить такой метод типа да, но это будет велосипед. И каждый пилит такой свой велосипед со своим поведением. Ай красота (сарказм).
>Выразительность этой портянки никакая.
Какая тебе нахер выразительность? Ты о чем вообще?
Ты в любом другом языке, если задашся целью получить индекс в foreach, будешь примерно такой же хуйней пользоваться (кортежем или его подобием).
Если тебя смущает linq, то сделай экстеншен в который его спрячешь и все у тебя будет красиво и "выразительно".
Понавыдумывают себе какой-то хуйни, а потом носятся с ней.
Мне самому шарп в последнее время не очень нравится. Хотел с бейсика слезть, недавно открыл проект на шарпе, а там студия в очередной раз порекомендовала поставить ":", чтобы сократить хуйнюнейм. Как-то даже не смешно уже.
Вот эта хуйня вообще из C еще переползла в шарп, и она наверное в любом языке, с корнями оттуда есть.
Я не против одной хуйни, но когда этих хуевин уже 10 и каждая маркируется через ":", то это уже какая-то шиза.
Можешь хоть в блокноте код писать. Потом в консоли запускай dotnet build и dotnet run и все
Шарпаны, это ловушка!
>Какая тебе нахер выразительность? Ты о чем вообще?
О выражении вещей короче, без лишнего семантического шума
и при этом не скатываясь в магию а-ля "пишем на перле"
>то сделай экстеншен в который его спрячешь и все у тебя будет красиво и "выразительно".
это и есть проблема. я сделаю свой,другой чел сделает свой, а еще один вообще не сделает ибо любой велик это велик
кроме шарпа я активно пишу на питоне и на котлин.
те же вещи выражаются короче и чище. По сравнению с ними код на шарпе выглядит как "жава какая то". Очень много семантического шума, то есть то, что в другом языке можно выразить чище и короче и НЕ потерять в понятливости
ты же понимаешь что 1442 и "тысяча четыреста сорок два" означают одно и то же, но как бы есть нюанс.
А если и тут не понимаешь, то посмотри на визуал бейсик и попробуй его прочитать. Шарписту сложно читать визуал бейсик, хотя там ведь как бы тот же код написан, просто другим способом.
Платный Rider.
я правильно понимаю что он просто пустой дженерик массив возвращает?
https://referencesource.microsoft.com/#mscorlib/system/array.cs,bc9fd1be0e4f4e70,references
Бляя пиздец зумеры изобрели пустой массив.
эээх
Зачем авалония, когда есть winui? Да кривой, да багованный, зато нативный и красивый!
А я сейчас пишу тестовое на uwp, такая срань, хоспаде, окон нормальных нет, навигация путем вызова глобальных объектов, это же надо было придумать
Тут дело не в сглаживании, а в привязке к пикселям при прорисовке векторных шейпов букв. Почему "l" вместо палочки в один пиксель, рисуется три: желтая, черная, и синяя? Вероятно, идет не по центру пикслей. В WPF тоже не все волшебно — нужно подобрать подходящий размер шрифта, чтобы не блюрилось. Может быть так, что одни буквы норм, а другие в блюре.
Так что, на первом месте важно точное попадание в матрицу пикселей. А уж если это никак невозможно, то тогда в ход идет сглаживание. Решать все проблемы сглаживанием — дебилизм.
давно винуи стал кросс? ответ - никогда
>>586411
>В WPF тоже не все волшебно
в WPF есть кроме выбора сглаживания клиртайп еще TextFormattingMode там Display/Ideal, которые дают крутой результат - неотличимо от GDI и напрочь решают проблему "мыльности шрифтов WPF"
А вот у авалонии такой настройки есть. То есть субпиксельное сглаживание вроде есть, но такое себе.
>Да кривой, да багованный, зато нативный и красивый!
в чем он нативный? принцип схож с WPF и при этом работает медленнее чем WPF
А красивость - темы аля "модерн дизайн" и для WPF есть.
Вообще этот винуи выглядит как урезанный WPF с модерновыми контролами из коробки.
Как будто такие же вещи нельзя сделать в WPF лол
> в чем он нативный? принцип схож с WPF и при этом работает медленнее чем WPF
В том, что использует системные контролы, написанные на плюсах.
>TextFormattingMode там Display/Ideal
Hueta, даже VS им не пользуется.
Если, конечно, речь идет про связку
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="ClearType"
Да, каждая буква чистенькая, но при этом каждая буква сдвигается до оптимального для рендера места, из-за чего образуются конские щели между буквами. И весь текст выглядит словно дешевка.
Легаси говно - легаси дотнет.
Есть простой UserStorage, который сохраняет/загружает различные данные по ключу, на мобилках (пик 1)
Мне нужно добавить возможность сохранять персональные данные, чтобы они были доступны только конкретному пользователю по его ID. Так как в игре игрок может сменить аккаунт, загрузив другой через Facebook или Google.
То есть есть общие данные для всех: настройки графики, управления, например. Есть персональные связанные с конкретным аккаунтом: список новых предметов, которые игрок ещё не посмотрел, инфа о логине и т.п.
Пока набросал вариант (пик 2). Передавать alias(он же ID аккаунта) каждый раз при get/set не хотелось бы. Лучше его задать один раз в самом Storage.
Не, я какую-то хуйню написал. Не нужно трогать IUserStorage, не нужно добавлять новые сущности.
Нужно просто передавать user id через UserStorageExtensions, если я хочу сохранить какие-то уникальные данные для конкретного аккаунта.
Не ток изображения из пдф, но даже если они текст содержат, то страницы надо в картинки переводить.
Желательно без потери качества
Украл мою ссылку с гетом!
Я его уже читал.
Думаю мож реально гостскрипт пдф заюзать, но это юзеру нужно будет это приложение к себе устанавливать...
там есть еще апишка для конвертации, но я уже заебался хранить пароли в своем приложении и че юзеру делать, если токен надо обновить, а
>И весь текст выглядит словно дешевка.
хз что ты там софт пишешь
текст выглядит как родной виндовый
в общем то это и нужно
аляповатость "щас мы тут стилей накрутим будто у нас не десктоп, а вебсайт" - как раз не нужно.
>>586427
а толку? такое можно сделать на WPF и работать будет быстрее.
а еще на WPF можно делать и классические, а не только зумерские приложения.
Зато наш православный яндекс диск, у которого нет ни интерфейса, ничего, жрет под 500МБ.
Ебанулся? Поздно уже, скоро всех на нейросетку заменят
Решил глянуть что у меня там. А там виндоус как обычно срёт.
У шиндоса есть рабочий набор и выделеная виртуальная память. Они сильно не совпадают. Приложуха может думать, что она себе дохуя памяти выделила, но до тех пор пока она реально не начнет ей пользоваться у нее ничего нет.
Алсо, в нете память занимает рантайм сразу с запасом. Реально твое приложение может ей не пользоваться, но уже на старте она зарезервирована как рабочий набор и готова выделиться по первому new в коде.
>3rd technical interview
Ебануться. Я бы и на второе техническое не пошел бы. А тут третье и все для того, чтобы "Мы посмотрим, можно ли тебя куда-нибудь приткнуть"
Там пунктуация неправильная. "Третье, техническое интервью". Первым был скрининг с эйчаром, вторым звонок с хз кем просто поболтали о том как красиво писать код, а как некрасиво, а третьим было именно это техническое собеседование.
Ну тогда норм.
Вот есть у меня пдф файл, нужно его разрезать на страницы и я хочу параллельно каждую страницу дальше обрабатывать, как мне из одного метода в другой передать stream, чтобы память не утекала?
вариантов куча
от заброшенного TPL DataFlow
или же PLINQ
через "заводим несколько очередей и перекладываем по готовности"
до "тупо семафоры навешиваем и радуемся"
просто в таски все засунуть и вейт фор алл сойдет для запросов?
Дальше нужно будет их все также обработать и выбрать минимальный правильный
да можешь хоть Parallel.For
все зависит от твоей задачи, желания "не занимать потоки больше необходимого" (или плевать на это) и личных предпочтений "люблю вот такую абстракцию".
Билдер должен возвращать объект, который нетривиально создавать и заполнять самому. Через какие языкозависимые конструкции он работает - похуй, паттерны от языков не зависят.
Да пусть хоть object возвращает. Лишь бы можно было с ним взаимодействовать.
Есть базовый класс, который содержит поля и метод, который используется всеми наследниками.
Есть текст, в зависимости от того, содержит ли текст все ключевые слова я хочу создать экземпляр наследника.
Норм будет хранить тип и связанные с ними ключевые слова в каком-нибудь текстовом файле и сделать фабрику, которая будет использовать Activator.CreateInstance() и в зависимости от ключевых слов создавать экземпляр класса.
Ну и да, хочу, чтобы если находило один класс, то другие уже не проверяло.
Эт думаю сделать через if с условием.
Наскок это конченный подход?
Подход как подход. я такой подход даже в одной книжке видел
Но сам по себе подход говно
Хранить тип где то снаружи и любой рефакторинг грозит сломать этот тип...
понятно что в общем то двигать никто не будет, ведь это как плагины.
но лучше все таки сделать сопоставление
Представь у тебя примитивная система плагинов на уровне палеолита. и делаешь ты ее так
1 заводишь аттрибут PluginKeyAttribute
2 используешь на классах плагина это аттрибут так
[PluginKey("foo")]
class MyClass
3 на старте ищешь все это и заводишь словарик
key=>type
4 используешь в текстов файле уже жесткое что то типа (да как угодно хоть жсон)
foo|param=value
5 по foo ты знаешь тип
ну и делать через Activator.CreateInstance() тоже бяка. Можно, просто грязновато. в случае какой то ошибки получишь невразумительное исключение вместо нормального если бы делал нормальные фабрики.
>в случае какой то ошибки получишь невразумительное исключение вместо нормального если бы делал нормальные фабрики.
Фабрики? Типа абстрактную фабрику сделать или как?
ну никто не запрещает кроме класса который ты собираешься инстанцировать также иметь и фабрику для инстанцирования
хоть даже статический метод в том же классе с указанием имени метода в аттрибуте, или по конвенции, или еще как.
Тут же все "зависит". Если у тебя тупой файлик вида
foo|param=value¶m2=5
то активатору ты будешь кормить стринги, а значит конструктор класса должен получать обжектс, потом как то кастить. В общем неявность плата за универсальность.
С фабриками кода больше, но и нет неожиданностей. да и проверить файл с параметрами можно не инстанцируя все на свете.
>Как за этим следить?
регистрируй его в контейнере в первую очередь и жирный такой комент напиши что он обязан быть первым
ну и конечно в StarAsync дождаться все await. никаких "запустил и забыл авось успеет"
но вообще это нужно если у тебя остальные сервисы зависят от работы первого
>через метод расширения для IHost.
покажи о чем ты. Но вообще проблема стоит " у меня асинк инициализация как мне быть и принципиально не хочу GetAwaiter().GetResult() (хоть и знаю что ничего страшного не будет ибо нет контекста синхронизации)"
попутно же IHostedService может получить зависимости, а также есть команда стоп, которая асинковая по сравнению с подиской на завершене приложения.
> регистрируй его в контейнере в первую очередь и жирный такой комент напиши что он обязан быть первым
Разве порядок вызовов зависит от порядка регистрации?
> покажи о чем ты
Вот так:
https://pastebin.com/Vat2TTzp
Контейнер отдаст список в том порядке в каком в него добавляли
Так то метод с Ihost лучше тем что точно сработает первым
И репозиторий нужно?
Хм, окей, а как это сделать с фабрикой? Ну примерно, я сейчас не особо осознаю это.
В файлике я могу хранить ключевые слова в виде массива и само название класса наверное или что-нибудь, чтобы указать связь, что если текст содержит эти кейворды, то нужно вызывать либо эту фабрику, либо инстанцировать этот класс
DAL слой не такой уж и сложный в реализации и даже если тот кто ревьюит код против, то максимум, что он сможет тебе предъявить, это "я не люблю такой подход" или "у нас так не принято".
А вот за то, что ты запихнешь работу с данными во вьюхи, вероятность того что тебя опустят на-а-амного больше.
Спасибо за ответ. Тогда еще вопрос - я для удобства оборачиваю все команды и свойства во вьюмодели в регионы, а затем группирую эти регионы по типу (собственно команды, свойства, поля), как к такому относятся? Слышал, что советуют не использовать регионы.
По моему опыту 50/50. Просто те кто пользуется регионами обычно делают это молча, а те кто нет - постоянно высказывются, как они их не любят.
Хотя я раньше тоже любил все поделить на регионы, чтобы было красиво и понятно. А сейчас научился писать код так, что не вижу в них необходимости, за исключеием редких случаев. Все и так понятно.
Я часть кода временно заворачиваю в регион, чтобы глаза не мозолило и не утомляло постоянным скроллингом. А потом логически группирую, но чтобы в классе не было больше трех регионов. Шиза, это когда в каждом регионе по 1-2 функции или свойства.
А есть обратная шиза — делать зоопарк классов и раскидывать на миллиард папок, что сорт оф регионы. Все хорошо в меру.
>>588424
>я для удобства оборачиваю все команды и свойства во вьюмодели в регионы
А почему везде пихают команды прямо в тело вьюмодели? Почему не сделать специальный класс-сборщик всех команд? У меня на пикрил есть отдельное свойство Commands, в котором и лежат все экземпляры команд.
>А сейчас научился писать код так, что не вижу в них необходимости, за исключеием редких случаев. Все и так понятно.
научи и меня тоже...
Чудес не бывает. Вместо 30 функций в одном классе у тебя 10 классов по 3 функции.
Ну кроме случаев оверинжениринга, когда ты пишешь "в лоб".
Но говно где-то держать придется — не в регионах, так в папках; не в папках, так в проектах; не в проектах так в библиотеках.
Я использую регионы для разделения логики. А разделять регионами поля, свойства и методы не стоит, как по мне. Хотя вот в игровом движке на шарпе так разделяют:
https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework/GameWindow.cs
Ну отделять поля от классов это действительно абсурд, а вот когда у тебя куча расширенных свойств или свойств зависимостей, то в регион окутываю.
Нельзя нарушить закон сохранения говна.
А я питонист вообще-то. Как думаете меня выпрут если отказаться? Так-то проблема не только в языке. Этот сервис написали 10 лет назад с тех пор делали по 3 коммита в код на 10 строчек. Просто чтобы он продолжал работать. Сервис тупа создаёт вмки в облаке и конектит несколько вмок к одной локальной сети. Чтобы уже потом внутри этих вмок можно было кластер из наших сервисов накатить. Это для тестов. По факту я sdet, который тулзы для тестов пишет. Какого хуя мне нужно этот сервис пердолить? Они хотят чтобы я добавил фичу чтобы сервис дополнительные приватные сети на этив вмки накатывал. И обязательно делал это через 1 сетевой интервейс. Просто две сети накатать это пулреквест на 10 строчек. А вот настроить это через один интерфейс это ебать как пердолить надо. Сначала написать опёртку над консольным клиентом, который этими сетями управляет. Сейчас она кастрированая. Потом написать алгоритм выбора сетей из тех, что в облаке заранее созданы. Но нельзя просто спросить что за сети в облаке. Их нужно вручную положить в бд. В майкрасофт cql server. С их ебанутым синтаксисом. Вручную. Потом нужно орм для новой таблицы подключить. Толкьо потом можно алгоритм выбора свободных и подходязих сетей написать. Дальше как сервис создаст недокластер нужно ещё какие-то скрипты написать, которые будут интерфейсы настраивать внутри каждой вмки. И это на сищарпе. Нужно ещё что-то придумать с выбором мак адрессов. И под конец клинап поправить чтобы сначала допсети детачились, интерфейсы помечались свободными в бд и только потом удалялись вмки. Пиздец. На сишарпе это делать. В коде, который 10 лет никто не трогал. И ещё этот сервис гоняется на виндовой вмке в облаке. Без возможности автодиплоя. И без тестов. То есть мне нужно всё это без ошибок написать, собрать проект, скопировать все дллки на тот сервер подменив старые версии и там перезапустить этот сервис. Про ci не слышали когда его делали. Пиздец. Апгрейд с даунтаймом. Без тестов. Вручную. А я питонист вообще-то.
А я питонист вообще-то. Как думаете меня выпрут если отказаться? Так-то проблема не только в языке. Этот сервис написали 10 лет назад с тех пор делали по 3 коммита в код на 10 строчек. Просто чтобы он продолжал работать. Сервис тупа создаёт вмки в облаке и конектит несколько вмок к одной локальной сети. Чтобы уже потом внутри этих вмок можно было кластер из наших сервисов накатить. Это для тестов. По факту я sdet, который тулзы для тестов пишет. Какого хуя мне нужно этот сервис пердолить? Они хотят чтобы я добавил фичу чтобы сервис дополнительные приватные сети на этив вмки накатывал. И обязательно делал это через 1 сетевой интервейс. Просто две сети накатать это пулреквест на 10 строчек. А вот настроить это через один интерфейс это ебать как пердолить надо. Сначала написать опёртку над консольным клиентом, который этими сетями управляет. Сейчас она кастрированая. Потом написать алгоритм выбора сетей из тех, что в облаке заранее созданы. Но нельзя просто спросить что за сети в облаке. Их нужно вручную положить в бд. В майкрасофт cql server. С их ебанутым синтаксисом. Вручную. Потом нужно орм для новой таблицы подключить. Толкьо потом можно алгоритм выбора свободных и подходязих сетей написать. Дальше как сервис создаст недокластер нужно ещё какие-то скрипты написать, которые будут интерфейсы настраивать внутри каждой вмки. И это на сищарпе. Нужно ещё что-то придумать с выбором мак адрессов. И под конец клинап поправить чтобы сначала допсети детачились, интерфейсы помечались свободными в бд и только потом удалялись вмки. Пиздец. На сишарпе это делать. В коде, который 10 лет никто не трогал. И ещё этот сервис гоняется на виндовой вмке в облаке. Без возможности автодиплоя. И без тестов. То есть мне нужно всё это без ошибок написать, собрать проект, скопировать все дллки на тот сервер подменив старые версии и там перезапустить этот сервис. Про ci не слышали когда его делали. Пиздец. Апгрейд с даунтаймом. Без тестов. Вручную. А я питонист вообще-то.
Говна пожуй! C# лучший язык
Иди нахуй! Ты должен радоваться, что тебе дали возможность писать на шарпе
Ахуел? Сишарп шикарен
У райдера много свистоперделок для рефакторинга и удобства говнокодинга, типа автоскрытия using директив. Плюс юай отзывчивый. Ну и статический анализ достаточно бодрый.
Студия более деревянная и олдфажная, зато имеет ебовейшую интеграцию с докером, позволяющую дебажить 50 микросервисов как обычный хелловорлд. Просто нажимаешь кнопку и поехали прыгать по брекпоинтам.
Для статического анализа там есть решарпер, но он делает юай тупить еще сильнее.
Собственно интеграция с докером однозначно делает студию лучшей в моих глазах. А на работе заставляют использовать райдер, блядь
Ты какую-то хуйню написал.
Тебе нужно просто написать 2 скрипта на баше. Дергать их шарпом. Все. Нахуя ты вот так вот усложняешь? Ты джун чи шо?
Да там ебала жаба питона.
А ещё, можно ли полностью отвязать клиент от фабрики?
Чтобы при добавлении нового класса не нужно было менять клиент или уже существующую фабрику?
А чем это тличается от WPF? Там можно биндить сочетания клавиш к командам.
<ListView.InputBindings>
<KeyBinding Key="Enter" Command="{Binding btnUpdate}" />
</ListView.InputBindings>
или самое тупое - подписка на событие по KeyDown, где ты запускаешь команду из DataContext.
В wpf то можно, там вообще много чего можно... А вот в uwp не все так просто. Там нет inputbindings, есть только бехавиоры срабатывающие при нажатии клавиши, но они не работают, по крайне мере у меня.
> или самое тупое - подписка на событие по KeyDown, где ты запускаешь команду из DataContext.
Пока так и сделал только previewkeydown, обычный опять же не работает, пришлось добавить в команду проверку клавиши, что по моему нарушает принцип mvvm.
Вот это уже интересно, спасибо. Только смущает, что можно вызвать только функции из codebehind, никакого mvvm
Мне говорили, что не нарушает.
Там главное правило, чтобы view не переплеталось с modelView. А в загоне view ты можешь делать что угодно, но ты не можешь к примеру пердать экземпляр своего ListView вьюмодели. Собсно смысл в том, чтобы одна часть могла работать без другой и могла быть взаимозаменяемой.
Я тоже делал проверку без InputBindings. Не помню по какой причине. Но как я уже писал, я создал класс Commands — хранилище всех команд вьюмодели, который был сорт оф словарь ресурсов, поэтому я мог спокойно пройтись циклом по всему списку доступных команд.
А каждой команде хранил сочетание клавиш keyGesture. Сопсно при событии KeyDown, получал тот же keyGesture из keyEventArgs и просто проходил по списку и сравнивал. Т.е. у меня не было лесенки из else.
>>588657
>из codebehind, никакого mvvm
Так метод же находится не во вьюмодели. Че не так? Это может быть написано в partial class твоего view. Ну есть же всякие конвертеры данных. Они тоже частично на шарпе пишутся и успешно применяются в MVVM.
В общем случае держать тонкими контроллеры или вьюмодели нужно. вьюмодели и так слишком жирные обычно.
>>588424
>Слышал, что советуют не использовать регионы.
А это те которым "если тебе нужны регионы значит ты что то делаешь неправильно, делегируй". Но по факту вьюмодели по своей сути "god objects" и дербанить это не очень удобно (рождаются всякие MVVMC), но обычно это велосипеды же.
А еще есть такой же момент вида "вьюмодели в папке viemodels, контролллеры в controllers, виды в views" что конечно верно. Но feature папки удобнее не только в модели, а и в этом деле.
>>588650
>что по моему нарушает принцип mvvm.
принцип MVVM гласит что вьюмодели не должны знать явно про вид. То есть вьюмодель предоставляет данные, а как и кто их рисует или не рисует, а там вообще тесты - личное дело буковки V
Так что вид может использовать биндинги, может не использовать, может совпадать по структуре с вьюмоделями, может не совпадать - его личное дело и ничего не нарушает.
Да ну все просто
1 имя класса в файле хранить плохо. Причина простая - а вдруг ты захочешь его переименовать или еще чего, а если обфусцирую. И даже если ты "мамой клянусь этого делать не буду тут на века", то все равно ИМХО лучше отделить имя инстанцируемого класса от имени в файле. Я не любитель "авось тут у нас все будет хорошо", вон в шарпе некоторая работа с ресурсами, некоторые конфиги используют прямое указание класса с нейспейсами и любой рефакторинг все ломает. Раздражает.
2 Инстанцирование этого класса. Если у тебя параметры к этому классу всегда одинаковые (набор кеев), то конечно ты можешь их распарсить, проверить этот список и засунуть в конструктор.
А если параметры разные? разное количество и типы?
И тут появляется зависимость от порядка значений в файле (минное поле) или твой конечный класс должен иметь конструктор который принимает какой нибудь IDictionary<object, object> и оттуда все сам достает.
Можно ли так? Ну конечно можно. Вернее оно будет работать. Но если ты привык все делать чисто, то у тебя будет глаз дергаться что класс вместо прямого принятия параметров принимает objects и сам парсит. Нормальный класс должен иметь нормальный типизированный конструктор, а грязь "инстанцирования" прячется в какой нибудь фабрике, которую ассоциируешь с классом.
файлику незачем знать про фабрику. Это код интерпретации этого файла должен знать "ага существует фабрика, вот ее и вызовем вместо Activator"
Делаешь базовый класс MySupperDupperFactory.
В нем метод IMySupperDupperClass Create();
Делаешь класс FileKeywordsFactoryResolver с методом GetFactory(string path). Фабрики получаешь через интерфейс, четко указав список тех что тебе нужны(для понимания будет лучше, можно )
В нем - получаешь фабрики и по твоей логике - выбираешь нужную фабрику.
Собственно - да. Вот так бы наверное и сделал.
Жавист порвался от зависти. Бывает
Вот допустим я делаю команды с записью в историю (свою собственную). Допустим одна команда создает папку и делает запись в историю, а другая команда перемещает файлы и делает запись в историю.
А теперь у меня новая команда — переместить файлы обернутые в новую папку. Т.е. команда последовательно выполняет две команды выше, каждая из которых сохраняет точку истории.
Тут напрашивается некая группа точек истории, чтобы юзер нажал всего один раз Ctrl+Z, но отменился сразу целый ряд действий. Такое я видел в vba скриптах, когда ставился некий маркер в начале и в конце операции. Типа:
ActiveDocument.BeginCommandGroup "My Command"
... тут ряд команд ...
ActiveDocument.EndCommandGroup
Но вот что меня смущает. А что если мне надо перенести тысячу файлов, каждый в свою папку? Этож как история засрется. Ведь в каждой точке истории хранится попутная инфа, которая в данном случае будет тупо дублирующимся мусором.
Как такое решается или решается ли вообще? Усложняется команда? Т.е. у меня команда по умолчанию должна иметь возможность создавать N папок? А команда по перемещению файлов иметь возможность по умолчанию перемещать в N разных директорий?
Так у меня в некоторых случаях и так команды перегруженные. Ну к примеру когда ты помещаешь папку с похожим именем в директории, то ее бы следовало переименовать — это тоже должна быть отдельная команда со своей историей. Или после того как переместил, ты должен итемы визуально выделить — это еще одна команда. Но у меня пока все это дерьмо хранится в одной команде.
Хз что делать: eсложнять команды (хотя мне хочется их еще сильнее дробить) или засирать память.
Прям таки усложнять. Команда просто имеет контекст для отмены одного шага. Если контекс это батч операций... ну и что.
>ActiveDocument.BeginCommandGroup "My Command"
Сорт оф транзакция да. В винформах что-то похожее есть для любой нетривиальной операции с визульным компонентом. Например написал команду которая свапает два цвета у контролов - установка нового цвета записывается в историю, и получается там две операции при свапе, но команда логически одна. Поэтому появились транзакции - т.е. группы команд которые можно отменить или повторить по требованию. В предельном случае транзакция состоит всего из одной команды, но их может быть сколько угодно.
И именно поэтому вы джависты его себе спиздили, при этом еще и криво.
Я видел где функции почему-то возвращают булевый статус, а объекты результата возвращают через референсный параметр метода. К чему такие сложности?
>Хз, наверное надо было соглашаться на то, что дают.
Если есть где жить. Если есть хоть какая финансовая поддержка (родители, жена). То для самого-самого старта вполне неплохая сумма.
>Я видел где функции почему-то возвращают булевый статус, а объекты результата возвращают через референсный параметр метода. К чему такие сложности?
Это микрооптимизация чтобы не вычислять хеши два раза или не бросать дорогие исключения на тривиальные ошибки парсинга.
Как пример со словарем - тут хеш ключа вычисляется два раза:
if (Dict.ContainsKey(Кey))
{
Result = Dict[Key];
// что-то дальше делаем с Result
}
Превращается в:
if (Dict.TryGetValue(Кey, out Result))
{
// что-то дальше делаем с Result
}
>Что эффективнее: возврат Null или False для случаев, когда нужно к примеру найти какой-то итем?
Без разницы на самом деле. Главное чтобы пользователи методов были готовы поймать null или обработать False.
В некоторых случаях хороший вариант возвращать - дефолтный объект-заглушку нужного типа. Тогда даже проверять ничего не надо, ведь с этим объектом алгоритмы идущие дальше не поломаются.
Метод find возвращает ienumerable<t>, если ничего не найдено то пустой.
Get возвращает объект, или выбрасывает исключение.
TryGet возвращает результат в виде bool, и значение как out параметр.
Пидарасы возвращают null.
> И тут появляется зависимость от порядка значений в файле (минное поле)
Да, я тоже об этом думал, причем один класс может отвечать на несколько кейвордов.
> файлику незачем знать про фабрику
Но фабрике нужно как-то знать о том, как именно эти кейворды ассоциировать с именно этим классом.
А еще как-то нужно собрать все фабрики, в идеале бы не нарушать open closed principle
Пидорас, не оправдывайся.
>Но фабрике нужно как-то знать о том
Ну конечно нужно. Это ведь сама причина создания этой фабрики
А фабрику можно или в реестре фабрик хранить как чел выше предложил (подходит если весь код твой и в рантайме типы не добавляются)
или прямо в конечном класса статический метод Create который "я типа тут такой перегруженный конструктор, имею право"
или а том же аттрибуте где указываешь PluginKey можно и фабрику указать и тогда фабрика будет найдена автоматом.
фломастеры.
> реестре фабрик
Я, если честно, не понял, как оно должно работать.
Есть где-нибудь пример кода, который это реализует, чтобы вас не заебывать вопросами.
Кто-то должен уметь конструировать конкретный объект. Значит это в минимуме метод. Куда то этот метод нужно приткнуть.
А значит это в минимуме хоть тупой словарик вида Dictionary<string|Type, Func<paramobject, object>> где можно "дай мне фабрику по ключу/типу"
или класс обертка над подобным словариком чтобы можно было красиво так запросить .GetFactory<TResult>();/.GetFactory(resultType);
Но так как ты работаешь на уровне рефлексии и тебе дженерики не нужны, то у тебя может быть даже одна большая фабрика которая умеет создавать все типы где ты просишь "сделай мне объект"
банальное
factory.Create(resultType);
и если забудешь написать, то он при кодировании упадет "я не умею конструировать такие объекты"
Не усложняй простые вещи. В этой задаче сложность на уровне "куда положить? да пусть тут лежит, как то пох",
то есть вопрос стоит так - если я добавлю еще один класс, то где мне придется дописывать код, удобно ли это делать и что будет если я забуду написать фабрику для нового типа - на деле ничего не будет, ведь если кодер не имбецил то он хоть раз запустит проверить "как работает код что я написал" и получит ошибку в рантайме и допишет.
но методы расширения для статиков так и нет (
Зачем? Одна из сутей метода расширения — подхватить экземпляр в качестве одного из параметров. В случае со статическими методами в этом нет смысла. Что мешает просто обратиться к методу напрямую?
Мешает отсутствие этого самого метода. Приходится заводить разные SomeClassEx
>говорят жить без него не могут очень полезный
Синдром утенка самый натуральный. Вижла не менее удобна.
Для новичков вообще похуй.
>Какие вопросы могут задать на эту вакансию-мультитул?
"Вы готовы разгребать все это говно?" Это единственный вопрос который они имеют моральное право задать.
Правильный ответ, если что: "Нет".
> А значит это в минимуме хоть тупой словарик вида Dictionary<string|Type, Func<paramobject, object>> где можно "дай мне фабрику по ключу/типу"
О, я это уже видел, значит, хитростей тут каких-то нет.
хитрость в том что писать тип как строку можно только в некоторых случаях - некоторая работа с ресурсами (плохо, но такой уж дотнет), конфигурация (а это уже плохой подход, но опять же дотнет это) и в логировании (ну тут хотя бы выбора может не быть, ок)
в рабочих же файлах лучше избегать этого
Кек. Я даже знаю над чем придется работать по этой вакансии. В моем банке примерно на такой же куче говна вся эта механика крутилась, но сейчас уже все это на .Net6 переписано и другую БД. Плюс очереди на подходе. Правда от XML-к никуда не деться, но тут уже проблема, что это формат ЦБ и от него никак не уйти.
>Правда от XML-к никуда не деться, но тут уже проблема, что это формат ЦБ и от него никак не уйти.
Я не понимаю этого, схуяли ваще? Кем это установлено? Почему бы не перейти на нормальный жсон или прото?
Короче кроличья нора оказалась глубже, чем я думал. Проблема с мерцанием это фундаментальная проблема винды и хуй ты ее решишь.
https://stackoverflow.com/questions/53000291/how-to-smooth-ugly-jitter-flicker-jumping-when-resizing-windows-especially-drag
+ Ещё одна причина писать на винформах.
Я к херам избавлялся от стандартной рамки окна и делал прозрачным задник.
Это точно впф? Как будто открыл редактор VBA 6. Даже меню похожее.
И нахера тебе фпв на шиндовс 7? Ты бы еще на ХР запустил. Если у тебя так лагает с пустым практически окном, то земля тебе пухом.
Короче хуй знает чет там запустил.
> Это точно впф? Как будто открыл редактор VBA 6. Даже меню похожее.
На гифке просто пример мерцания.
> И нахера тебе фпв на шиндовс 7? Ты бы еще на ХР запустил. Если у тебя так лагает с пустым практически окном, то земля тебе пухом.
Это не у меня лагает, это у всех лагает, ты бы хоть материал по ссылке прочел. Буквально открываешь большинство приложений и будет такая хрень.
1144x856, 0:07
>На гифке просто пример мерцания.
Это не просто пример, это ответ почему мерцает.
>Это не у меня лагает, это у всех лагает
У меня не лагает.
>большинство приложений и будет такая хрень.
Если не долбоебы делали, то устанавливали фон прозрачным или в цвет окна. Да, контент подтягивается за окном, но вместо черноты прозрачный фон.
На видеорил самый простой вариант, можно еще лучше.
>>591289
... единственный геморный вариант черного фона — при загрузке окна, который возникает даже с опцией AllowTransperency. Тут надо оптимизировать так, чтобы все тяжелое говно разом не подгружалось.
И вообще, я какого-то единого подхода для себя не нашел, вот чернотой при старте я мучаюсь.
Зачем тогда полумерами ограничиваться. Возвращай уже нормальный Result<Maybe<T>> и анврапер нормальный не забудь сделать.
(T)value
от
value as T
Я только понял, что второй вариант работает только с классами.
> (T)value
Если value не типа T, кинет эксепшен.
> value as T
Если value не типа T, результат будет null.
> Если value не типа T, результат будет null.
Если T является структурой, то он вообще не даёт скомпилировать. А (T) при этом компилируется.
ОКР? Да, збс, наша тема.
Вроде как выигрывает мне время.
Ну я просто имею список из тасков и хочу подождать, пока хотя бы один из них выполнится и запустить следующий асинхронный таск
Вчера делал HTTP-сервер. Заняло это 3 часа, включая гуглеж, проверку и общение с анончиками в /b/.
Цель была сделать максимально примитивный сервер, который может отдать html-файл из папочки www.
В общем. В /b/ анон сказал что лютый говнокод и меня не возьмут на работу.
Объясните, че не так-то?
https://pastebin.com/QYKrWNsH
Слушайте, посоветуйте пожалуйста книг/ресурсов по написанию хорошего кода. Я так-то шарп знаю, но вот максимально редко пользуюсь всякими интерфейсами делегатами и прочей хуйней. А я хочу писать качественный код, который быстрый, удобочитаемый и модифицируемый. Помогите мне!
Нет никакой проверки на то, что всё было задиспожено, методы имеют ебанутые названия, отсутствует кодстайл, где-то запятые проёбаны и имеют неодинаковый вид тоже самое с фигурными скобками, нет в названии асинхронных методов слова "Async". Поля раскиданы хуй пойми где и инициализируешь их на месте, а не в конструкторе. Во многих местах - публичные set. В методе Main вообще отстутствует await оператор для метода Process (28 строка).
Во флюент-билдере не стоит пихать прямо внутрь метода другие методы, поскольку это нечитабельно - метод в методе, лучше выносить в переменную. Вообще возьми за привычку всё выносить в переменные.
Отсутствуют модификаторы доступа для полей (некоторые помечены, некоторые нет). Бест-практис говорит нам всегда добавлять private, хоть он и по умолчанию такой (код читабельнее).
В HttpRequest - pipe не readonly, почему?
Ну а вообще в том треде я тебе сказал, у тебя неплохие познания есть, иди устраиваться на работу.
> В методе Main вообще отстутствует await оператор для метода Process (28 строка).
Так и должно быть для обработки нескольких запросов одновременно
А на будущее..? Я так-то таненбаума осилил, две книги, это думаю тоже без проблем
Эх хоть кто-нибудь по перевой ссылке в шапке перешел...
>Принципы, паттерны и методики гибкой разработки на языке C#, Роберт С. Мартин, Мика Мартин
Вот еще https://ru.stackoverflow.com/a/474416/422180, надо бы в шапку добавить, чуть позже отредачу пастбин
Спасибо
А еще такая фигня, как алгосы изучать лучше? Я просто такой человек который если что то не использует на практике то очень быстро это забывает. А алгоритмы я вообще нахуй нигде не использую... На литкоде решать их?
Гугли "Александр Куликов алгоритмы" на ютубе и смотри, совместно читай Кормена 1 издание. Ну если у тебя прям совсем нулёвые знания - то начинай с Грокаем Алгоритмы, а дальше переходи к вышеперечисленному. Совместно с этим решай задачки тут https://projecteuler.net/archives, потом как нарешаешься - переходи к литкоду.
>А (T) при этом компилируется.
Потому что такой формат каста вообще не думает. Но вообще, если тебе приходится кстить струтктуру, то что-то ты делаешь не так.
Структуры нужны для краткосрочных, часто локальных операций, где собсно тип уже известен. Их не передают в другие функции через object какой нибудь. Особенно если структура сложная, то вся эта мандула будет передаваться по значению, а не по ссылке.
Все функции, принимающие структуры, принимают самые простейшие явные типы. К примеру какой нибудь расчет площади прямоугольника логически может принимать один параметр в виде структуры Size с двумя свойствами Width и Height, но принимает он два параметра типа double: Width и Height.
А какой нибудь прямоуголник не принимает два параметра Size и Position. Он принимает ЧЕТЫРЕ параметра: Width, Height, X, Y.
А уж принимать структуры неизвестного типа — это лютый бред. Это как унитаз прикручивать к потолку.
>>591767
База какая-то такая:
Графы:
- способы представления графа (матрицы смежности, инцидентности, список рёбер и т.д.)
- обход в ширину, глубину
- проверка графа на ацикличность и поиск произовольного цилка
- топ. сортировка, поиск компонент связности и сильной связности
- проверка графа на эйлеровость, поиск эйлерового пути/цикла
- алгортимы поиска кратчайших путей (дейкстра, форд-белман, флойд-уоршол)
- минимальные остовные деревья (алгоритмы прима и крускала)
- сети и потоки в сетях (эдмондс-карп, min cost max flow, в общём, всё, что есть в Кормене, нужно на этот счёт прочитать и понять).
Жадные алгоритмы и динамичексое программирование:
Ну собственно прочитать про одно и про другое, почитать примеры задач, решающиеся одним и другим способом, и самому нарешивать тонны задач, чтоб набить руку и наметать глаз. (всякую хуйню про жадные матроиды и алгоритмы радо-эдмондса можешь не читать, по крайней мере на первых порах).
Структуры данных:
- Куча, стек, очередь (возможные реализации их трейдофы).
- Бинарные деревья поиска, самобалансирующиеся бинарные деревья поиска (красно-чёрное, avl, декартово)
- Система непересекающихся множеств
- Дерево отрезков и задача RMQ
- Хэш-таблицы; методы разрешения коллизий
Строки:
- Z-функция и префикс-функция. Их эффективное вычисление
- Алогоритмы поиска подстроки в строке (как минимум КМП, но вообще их дофига и желательно в них немного покопаться, чтоб хотя бы примерно представлять ,какие там идеи используются и что вообще бывает)
- Бор. Ахо-Корасик
- Суффиксные деревья. Укконен
- Суффиксные автоматы
Комбинаторика:
Умение генерировать комбинаторные объекты типа перестановок, размещений, сочетаний, деревьев и т.п. (есть например в искусстве программирования Кнута).
Немного вычислительной геометрии (кмк, не обязательноl; просто чтоб потрогать область)
- Ориентированная площадь треугольника
- Проверка отрезков на пересечение и поиск точки пересечения (то же для прымых и окружностей)
- Поиск выпуклой оболочки: Джарвис, Грэхем-Эндрю
Параллельно с этим идёшь на какой-нибудь codeforces/informatics/topcoder или любую другую твою любимую площадку с олимпиадными задачи и решаешь-решаешь-решьаешь. В процессе всплывёт ещё куча неупомянутых мной более мелких алгоритмов (например, я вообще ничего не писал про всякую теория чисел типа решета эратосфена, поиска нод-а и тому подобных вещей). Всё это доботываешь по ходу дела. Хороший ориентир - способность стабильно решать на кодфорсесе задачи под номерами 3-4 из div2. Это уровень при котором ты будешь железно проходить алгоритмические секции вообще не парясь (я бы даже сказал, что это оверкилл, потому что на алго. секциях обычно дают задачи по типу литкода, а они всё же несколько проще, чем олимпиадные в большинстве своём).
>>591767
База какая-то такая:
Графы:
- способы представления графа (матрицы смежности, инцидентности, список рёбер и т.д.)
- обход в ширину, глубину
- проверка графа на ацикличность и поиск произовольного цилка
- топ. сортировка, поиск компонент связности и сильной связности
- проверка графа на эйлеровость, поиск эйлерового пути/цикла
- алгортимы поиска кратчайших путей (дейкстра, форд-белман, флойд-уоршол)
- минимальные остовные деревья (алгоритмы прима и крускала)
- сети и потоки в сетях (эдмондс-карп, min cost max flow, в общём, всё, что есть в Кормене, нужно на этот счёт прочитать и понять).
Жадные алгоритмы и динамичексое программирование:
Ну собственно прочитать про одно и про другое, почитать примеры задач, решающиеся одним и другим способом, и самому нарешивать тонны задач, чтоб набить руку и наметать глаз. (всякую хуйню про жадные матроиды и алгоритмы радо-эдмондса можешь не читать, по крайней мере на первых порах).
Структуры данных:
- Куча, стек, очередь (возможные реализации их трейдофы).
- Бинарные деревья поиска, самобалансирующиеся бинарные деревья поиска (красно-чёрное, avl, декартово)
- Система непересекающихся множеств
- Дерево отрезков и задача RMQ
- Хэш-таблицы; методы разрешения коллизий
Строки:
- Z-функция и префикс-функция. Их эффективное вычисление
- Алогоритмы поиска подстроки в строке (как минимум КМП, но вообще их дофига и желательно в них немного покопаться, чтоб хотя бы примерно представлять ,какие там идеи используются и что вообще бывает)
- Бор. Ахо-Корасик
- Суффиксные деревья. Укконен
- Суффиксные автоматы
Комбинаторика:
Умение генерировать комбинаторные объекты типа перестановок, размещений, сочетаний, деревьев и т.п. (есть например в искусстве программирования Кнута).
Немного вычислительной геометрии (кмк, не обязательноl; просто чтоб потрогать область)
- Ориентированная площадь треугольника
- Проверка отрезков на пересечение и поиск точки пересечения (то же для прымых и окружностей)
- Поиск выпуклой оболочки: Джарвис, Грэхем-Эндрю
Параллельно с этим идёшь на какой-нибудь codeforces/informatics/topcoder или любую другую твою любимую площадку с олимпиадными задачи и решаешь-решаешь-решьаешь. В процессе всплывёт ещё куча неупомянутых мной более мелких алгоритмов (например, я вообще ничего не писал про всякую теория чисел типа решета эратосфена, поиска нод-а и тому подобных вещей). Всё это доботываешь по ходу дела. Хороший ориентир - способность стабильно решать на кодфорсесе задачи под номерами 3-4 из div2. Это уровень при котором ты будешь железно проходить алгоритмические секции вообще не парясь (я бы даже сказал, что это оверкилл, потому что на алго. секциях обычно дают задачи по типу литкода, а они всё же несколько проще, чем олимпиадные в большинстве своём).
>(то же для прымых и окружностей)
Смотрел стрим Tsoding-а про анти-алиазинг геометрических фигур. У меня вопрос: почему все начинают дрочить на кружки и прямоугольнички, вместо изучения того же самого для кривых безье, которые могут быть и кружком, и треугольничком, и небом, и Аллахом?
Я смотрю на этого Цзодинга, как он сперва голову ломает над алгоритмом сглаживания для кружка, потом как голову ломает над алгоритмом сглаживания для треугольничка и у меня кровь течет из глаз. Ну напиши ты алгоритм для безье один раз и он будет работать везде. Не хочу, хочу жрать говно, хочу чтобы у меня появился ромб и я сидел бы час и переписывал бы все заново.
> А уж принимать структуры неизвестного типа — это лютый бред. Это как унитаз прикручивать к потолку.
Подскажи тогда, как тогда лучше реализовать пикрелейтед?
Get - по ключу выдаёт либо загруженные данные, либо сначала их загружает из json файла и после возвращает. Данные кэшируются внутри.
Set - задает и помечает данные, что они изменены (IsChanged=true)
Save - сохраняет все изменённые данные обратно в json файлы по ключам
Создавать каждый раз объекты при вызове Get не вариант, ибо это мобилки и лучше не дёргать лишний раз GC.
Ты при реализации интерфейса указываешь конеретный тип или так и оставляешь структурой?
Если твои структуры — примитивные типы, типа bool, int, float то и хрен с ним, у тебя особо выбора нет, да тебе это и не нужно.
Если бы ты в Value пихал структуру из 100500 свойств, то GC ты бы не изнасиловал, но зато изнасиловал бы что-то другое, причем куда более варварскими методами.
Можно сделать перегрузки, если у тебя не зоопарк структур.
Во первых - в шарпе нет динамических массивов? Чет гугл по запросу динамик аррэй выдает только си и плюсы.
Во вторых - я сейчас читаю книгу каких то ебаных болгаров полупидоров и мне уже неистово подгорает. Они бросают тебе задачу и в подсказках пишут "пиздуй в интернет". Короч задача реализовать вот эту хуйню
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
до десяти миллионов. КАК БЛЯДЬ? Мне че массив на 10 миллионов ячеек создавать чтоб у меня комп утонул нахуй?
Те решения что я находил в интернете довольно элементарны но мне они нихуя не помогают потому что они идут до N Где N не больше тысячи. А мне надо 10 блядь миллионов лимит.
То есть заносить в массив каждый результат умножения на простое число. А потом смотреть каких чисел нет в массиве те и простые.
Я не могу подсчитать сколько простых чисел чтобы сделать массив, я конечно же не буду делать массив на 10 миллионов ячеек, и я не знаю как в си шарпе сделать динамический массив а задать длинну массива заранее я не могу ибо не знаю сколько членов в нем будет.
Нихуя не работает выше 120, тут короч надо сохранять новое простое число и потом добавлять проверку его деления по модулю
> динамических массивов
Вместо них используют коллекции, всякие List, Dictionary, HashSet и т.д. Размер заранее неизвестен, добавляй туда сколько угодно элементов, коллекция будет автоматически изменять размер.
Ехал дебич через дебич, видит дебич в реке дебич.
У тебя даже на примере показывается от 2 до 131. Что мешает вот так же твои 10млн поделить на диапазоны чисел и последовательно применять свое ссаное сито к каждому диапазону?
Что мешает загуглить сперва какие коллекции и массивы бывают в шарпе?
Я и есть профан, чел, первый семетр шараги.
>>592278 (Del)
>>592263
>>592257
Понял, буду гуглить
>>592271
>Что мешает вот так же твои 10млн поделить на диапазоны чисел и последовательно применять свое ссаное сито к каждому диапазону?
Руки из жопы
Вот я и хочу подзадрочить алгоритмы. Есть какая-то книга на примете?
Короч я понял, надо посыпать голову пеплом, повесить на себя табличку "the end is nigh" и кричать на жд вокзале что скайнет грядет.
magnet:?xt=urn:btih:0D5B1AC5981F6A535369EF314F00C1F67B7DF0F3&tr=http%3A%2F%2Fbt4.t-ru.org%2Fann%3Fmagnet&dn=%D0%A2.%D0%9A%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%2C%20%D0%A7.%D0%9B%D0%B5%D0%B9%D0%B7%D0%B5%D1%80%D1%81%D0%BE%D0%BD%2C%20%D0%A0.%D0%A0%D0%B8%D0%B2%D0%B5%D1%81%D1%82%2C%20%D0%9A.%D0%A8%D1%82%D0%B0%D0%B9%D0%BD%20-%20%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B8%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7.%20%D0%98%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%203-%D0%B5%20%5B2013%2C%20DjVu%2C%20RUS%5D
вот на рутрекере нашел если надо комуто
>в большинстве задач
Поражало, что люди сперва ориентируются на большинство, а потом скулят от конкуренции. В любой области болшинство хуи пинают и нажимают одну кнопочку. Хочешь плыть в эту сторону — флаг тебе в жопу.
>единственное
Был почти в десятке проектов с совершенно разными стаками, и у всех была единственная проблема - разваливающийся под собственным весом говнокод, который невозможно поддерживать.
Вместо мудреного алгоритма ты можешь захардкодить какой-нибудь массив на миллион значений, и оно будет работающим и поддерживаемым.
Но если ты систематически делаешь даже мелкие косяки в архитектуре, проекту пизда. Через N лет в него просто невозможно будет вносить изменения.
Че тебе мешает делать лениво?
> IStringLocalizer.
Нахуя? Просто пишешь расширение строки, например LocaliseThis(), которое считывает локаль, находит нужную строку в жсоне и возвращает ее.
Оно медленнее работает на пару секунд.
Ибо ждёт всех тасков, а так ждёт любой таск и работает дальше.
Потому что для программиста фраза
"хочу подождать, пока хотя бы один из них выполнится и запустить следующий"
переводится как
"хочу выполнить много тасков но с лимитом одновременного выполнения"
Можно кстати не как анон говорит с семафорами а так.
У тебя есть ConcurrentQueue<Func<CancellationToken, Task>> в нее пишешь то что надо выполнить
У тебя есть метод Task ProcessQueue(CancellationToken ct), в котором - из очереди достается очередная задача, выполняется.
Собственно все. Ограничение одновременно выполняемых тасок будет строится на количестве одновременно запущенных тасок ProcessQueue.
ProcessQueue примерно так выглядит:
while(ct.IsCancellationRequered is false)
{
var t = _queue.TryDequeue(out var task) ? task(ct), Task.Delay(100, ct);
await t;
}
> "хочу выполнить много тасков но с лимитом одновременного выполнения"
А причем тут лимит одновременного выполнения? Я не отсылаю десятки тысяч реквестов к API, чтобы это не было необходимо.
В лучшем случае всего 16 реквестов
называй как хочешь, суть это не меняет
если ты ждешь окончания задачи чтобы начать новую - значит ты лимитируешь выполнение. Например, тредпул - он заканчивает одну из тасок, удаляет ее из своей внутренней очереди и начинает новую.
Разницу видишь с твоим описанием? А разница не суслик - ее нет
>если ты ждешь окончания задачи чтобы начать новую - значит ты лимитируешь выполнение.
Не, мне просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод передать.
Ну просто это разными методами можно сделать, я хочу по мере поступления, а так можно все таски дождаться и запустить батч из следующих тасков
ну делай по мере поступления
OrderByCompletion в виде "хочу чтобы удобна" легко гуглится
http://sergeyteplyakov.blogspot.com/2015/06/process-tasks-by-completion.html
также есть тут https://github.com/StephenCleary/AsyncEx
И тот код что ты изначально намутил тоже нормальный - вот в питоне твой подход встроен в стандартную библиотеку
сам я такое не юзаю ибо ссылки выше, да и хотелки побольше (лимит выполнения и лимит очереди (ну не люблю я подход когда миллион задач сразу становится в очередь и другим не советую))
И чому же?
Нормальная практика.
Допустим, у тебя есть задачи, которые надо в фоне обработать. Ты их в очередь пишешь. Ограничиваешь число обработчиков, в зависимости от ресурсов сервиса. У очереди - делаешь лимиты, чтобы не было переполнения, либо выталкиваешь старые задачи, которые уже "протухли". Собственно, все, обработчики - по мере сил - берут в обработку задачу, обрабатывают, потом идут за следующей.
Так много где делается.
> просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод
Почему нельзя просто:
var resA = await fooA();
await FooB(resA);
?
Если хочешь их В одну задачу зарихнуть:
await Task.Run(async () => {
var resA = await fooA();
await FooB(resA);
});
Если тебе нужно много таких.
То в цикле просто запускаешь задачи. Добавляешь в список.
Потом Task.WhenAll(tasks);
потому что проверять в цикле на "есть чё" это дичь. Это противоречит самому принципу await
Это как заказать пиццу и каждую минуту выбегать из квартиры проверять не несут ли вместо тупо открыть когда позвонят.
> просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод
Можно без есть чо.
Делаешь у очереди семафорчик. Какой-нибудь SemaphoreSlim. При добавлении - релизишь. При взятии задачи в обработку - входишь.
Обработчик - делает:
while(true){
var task = await _queue.GetTask(cancellationToken);
try{
await task(cancellationToken);
}
catch(Excetpion e) {_logger.Error(e); }
}
Конечно можно. Ведь именно семафор и был предложен )
хотя конечно над семафором/очередями много разного наворотили более высокоуровненого
технология найс, скоро все буду кодить нейронки на шарпах, а питон отомрет нахуй, так что смело вкатывайся
Вот ты его троллишь. Но сама-то технология - действительно крутая. Другое же дело, что пистон - слишком уж дохуя всего захватил.
> очередной высер майков
Подозреваю что это. Веры нет в их начинания учитывая что они уже в шестой раз переделываю гуй и скачут по версиям как хоромоги.
Так даже решают проблемы многопоточной записи в файл или другой ресурс. Делаем очередь куда пишут потоки, запускаем параллельно таску в которой пишем в файл получая данные из очереди по одному.
Можно писать и многопоточно, главная фишка отсутствие кода синхронизации в рабочих потоках и следовательно ОЧЕНЬ дорогих остановок и запусков потока на ядре. Зато на задержки потоков вывода нам насрать пусть подтармаживают
С другой стороны, можно создать свой asp.net core проект и запустить на Amazon AWS. Только придётся самом разворачивать сервер на винде.
Мне нужно обрабатывать около 20 млн API запросов в день. На Азуре это выйдет мне примерно в 350 баксов в месяц. На своём amazon сервере без понятия во сколько это обойдётся и не будет ли дрочки с превышением трафика.
>asp.net core
Ты же в курсе, что можешь вообще на любом серваке такие приложения развернуть. Т.е. ты тупо выбираешь сначала тот который потянет твои 20 млн в деньЕсли не секрет, то что?, и деплоишь туда.
> await _queue.GetTask(cancellationToken);
Это что-то, что я сам должен написать или есть готовое?
Кста, видел этот код, это же хуйня какая-то, если что-то действительно выкинет ошибку, то семафор никогда не релизнется.
Надо ли в таких случаях semaphor.Release() помещать в catch?
В том и шутка, что "я не знаю почти ничего, а то что знаю - неправильно".
всегда нужно помещать в безусловное выполнение вида finally, ContinueWith, using (для асинксемфоров, стандартный в using не умеет)
> есть готовое?
Можешь https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.channels.channel-1?view=net-7.0
Использовать.
По хорошему - надо свое писать.
кто не достучался?
WebView/WebView2
Шарп - не си и не кресты.
через unsafe обратись
Собственно с биндингом проблем нет, НО у меня теперь возникла задача регистрировать изменения состояний чекбоксов в истории действий. Обычно запись в историю делают команды, но тут нет никакой команды, тут просто меняется свойство.
Даже если я захочу по событию клика чекбокса применять команду, то внутри итема нет доступа ко вью-модели. Как быть-то? У модели тоже нет доступа.
Как такое дерьмо разруливается в MVVM? Как выполнить действие если изменилось свойство?
Что значит не можешь? Для любого элемента можно определить любой контекст данных.
В смысле фиксить, если так по инструкции?
- Window имеет дата контекст вью-модели,
- ListView имеет дата контекс списка вьюмодели,
- Шаблон ListItem имеет дата контекст элемента списка.
>>594607
>Для любого элемента можно определить любой контекст данных.
Ну да, и он у меня как контекст итема списка вьюмодели. Он не видит все что выше по условной иерархии. Это надо что-то типа RelativeSource до уровня Window.
Все, так и сделал. Обратился по имени к элементу выше и забрал у него дата контекст.
Ну и варианты где вьюмодель списка подписана на события вьюмодели итема через обычное событие или INPC также абсолютно нормальные (главное не забывать про отписку, если она нужна).
>на события вьюмодели итема через обычное событие
Хотел так, но подумал, что гемора будет больше — не только из-за подписки, но и из-за потери контроля над расстановкой чекбоксов сразу для нескольких итемов. По сути начнется спам командой, которая по одному чекбоксику будет сохранять в историю. Я просто не знаю как это адекватно обработать в одно действие.
А вот если ловить событие со стороны представления, то физически пользователь может кликнуть только по одному чекбоксу, следовательно будет всего одно событие, а дальше мне надо обработать выбранные итемы и сохранить в историю как одно действие.
К тому же в WPF подписка автоматом подчищается, правда ведь?
>К тому же в WPF подписка автоматом подчищается, правда ведь?
Ну биндинги и прочее сделаны через слабую подписку. Но если ты в коде через что то решил подписаться, то как подпишешься - так и будет.
MVVM фреймворк может предоставлять скрытно слабую подписку на свои компоненты, но за областью этого ты все решаешь сам.
Лично я во вьюмоделях использую подписку с лайфтаймом.
Есть БД. Есть табличка Users.
У User'а, есть:
Id - то что бд дает
InnerId - Id пользователя в системе вцелом, нужно чтобы значения этого столбца, шли друг за другом, без дырок, потому что другой сервис имеет следующую логику: Начиная с 1 и пока не получит 404 - запрашивает нужное ему от пользоватля, при 404 - начинает с самого начала, считая, что весь список прошел.
IntegrationId - то же что и InnerId , но для сторонних систем, используется хитрый JSONrpc-протокол, запрашивается другое, но логика такая же.
Собственно, эти два InnerId и IntegrationId - все подсирают. Потому что вставка нового пользователя, по этим правилам - это проверка на дырки и сдвигание всех пользователей, чтобы дырки не было. Удаление в системе должно быть, потому решить проблему просто помечанием как "удаленный" - нельзя. Менять логику для InnerId еще бы можно было, т.к. внутренняя хуяня, в принципе можно убедить как-то нормально сделать, но вот IntegrationId - это стороннее ПО, которое охуевшим стандартом придумано, и его обязательно поддерживать, а хуи оттуда - покладут болт на мои визги, что медленно выходит.
Я в душе не ебу, как сделать вот это вот требование с одной стороны - правильно, с другой, чтобы оно не тормазило все остальное. Локать всю таблицу при каждой вставке-удалении, ну как-то такое.
Сначала, чтобы чуть ускориться - я решил отказаться от EF. Помогло, но не как-то сильно. Потом - я решил, что добавлю триггеры и хранимки. Уже чуть лучше помогло, но тоже хуяня на самом деле.
Пока что единственное что я придумал, это вообще в базу не лазить лишний раз, держать все это в памяти, а раз в условную минуту - отправлять состояние. Но пиздец же какой-то. Кажется, что я какую-то хуйню делаю. Да. Так оно - более-менее нормально работает, но чет хуйня же какая-то.
Предложите мне нормально решение-то. Я заебался уже. Месяц ебусь. Начинаю чувствовать себя профнепригодным.
InnerId используется как индекс, можно вкорячить логику отдачи пользователей отсортированных по возрастанию, а сам айди удалить нахой.
IntegrationId использовать как обычный айди, обычный айди удалить.
А вообще я бы мамкиным архитекторам, которые придумывают такую ересь, покупал билет домой в индию.
Хотя у меня в тиме ребята, в целом адекватные, тоже часто норовят плдобную хуйню куда-нибудь вкорячить.
В смысле просто через yield return отдавать пользователей по очереди, игнорируя значение innerid
При удалении заменить удалённого на последнего в таблице, последнего удалить.
Завтра собес, я весь метанит и мсдн перечитал, но жутко нервую.
vs code + аддон c#
Я заметил такую странную вещь иногда, что вроде бы вношу изменения в код, а реакции никакой. Я начинаю судорожно искать ошибку где я накосячил, начинаю выводить в консоль некоторые переменные ... и код начинает работать.
Я конечно видел кнопку "перестроить решение", но я думал, что студии хватит ума перестроить тот проект, в котором я внес изменения.
Не знал, что метанит - advanced level.
>но жутко нервую.
А чего нервничать? Завтра и узнаешь какие будут вопросы. Как будто у тебя первое и последнее собеседование.
У меня сегодня был собес. Спрашивали про дженерики, я не смог толком ответить сказал, мол, это классы, которые помимо аргументов конструктора принимают также аргументы типа и работают с этими типами, ещё спросили про await, я переволновался и сказал, что это просто ожидание выполнения функции, про возвращение управления не сказал. Ещё не смог толком объяснить суть внедрения зависимостей хотя использовал его в тестовом, также спросили устройство листа, и тут я завалил. Впрочем меня все равно пригласили на тестовую неделю и даже предложили больше, чем я просил изначально
Поимел немножко удачи. Молодец.
Джозеф Албахари.
По C# 9.0 есть Полный справочник и краткий. В первом около 1000 страниц, во втором 200.
Разморозил профиль на линкедине. За 2 недели написали всего 4 человека. Из них 3 это какой-то скам от индусов. И одно предложение фуллстаком в Европе (удаленно ясен хер) за 3к евро пиздец охуевшие собаки.
Ладно бы просматривали, видели красные флажки и уходили, сука, даже просмотров мало. 1-2 в день.
> advanced level
Ну. Если бы я проводил такое собеседование, то вопросы были бы в духе:
Каков размер строки "12345"?
Имеем следующий код:
'
void Foo1()
{
IEnumerable<int> data = new int[] {1,2,3,4,5};
Print(data);
}
void Foo2()
{
IEnumerable<int> data = new List<int>{1,2,3,4,5};
Print(data);
}
void Print(IEnumberable<int> data)
{
foreach(var it in data)
Console.WriteLine(it);
}
'
Чем будет отличаться выполнение Foo1 от Foo2?
Имеем следующий код:
public static class A
{
public static int a = 0;
public static void Run()
{
for(int i = 0; i < 100; i++)
i++
}
}
...
(new Thread((_)=>A.Run())).Run();
(new Thread((_)=>A.Run())).Run();
Thread.Yield();
Console.WriteLine(A.a);
Что выведется в конcоль? Почему?
Какие принципы SOLID нарушает Stream?
Как сделать свой класс, который можно await'ить?
Сервер в огне, запросы выполняются дюже долго, периодически все падает, нужно выяснить в чем причина. Что вы сделаете, для того, чтобы найти причину и как будете исправлять?
Какой-то еблан включил trace в конфиге для прода. Место на сервере заканчивается. Какие действия предпримите и какие меры будут приняты, чтобы подобного не повторилось?
Нужно производить локализацию ответов бекенда, на основе геолокации запроса. Как будете это делать?
> advanced level
Ну. Если бы я проводил такое собеседование, то вопросы были бы в духе:
Каков размер строки "12345"?
Имеем следующий код:
'
void Foo1()
{
IEnumerable<int> data = new int[] {1,2,3,4,5};
Print(data);
}
void Foo2()
{
IEnumerable<int> data = new List<int>{1,2,3,4,5};
Print(data);
}
void Print(IEnumberable<int> data)
{
foreach(var it in data)
Console.WriteLine(it);
}
'
Чем будет отличаться выполнение Foo1 от Foo2?
Имеем следующий код:
public static class A
{
public static int a = 0;
public static void Run()
{
for(int i = 0; i < 100; i++)
i++
}
}
...
(new Thread((_)=>A.Run())).Run();
(new Thread((_)=>A.Run())).Run();
Thread.Yield();
Console.WriteLine(A.a);
Что выведется в конcоль? Почему?
Какие принципы SOLID нарушает Stream?
Как сделать свой класс, который можно await'ить?
Сервер в огне, запросы выполняются дюже долго, периодически все падает, нужно выяснить в чем причина. Что вы сделаете, для того, чтобы найти причину и как будете исправлять?
Какой-то еблан включил trace в конфиге для прода. Место на сервере заканчивается. Какие действия предпримите и какие меры будут приняты, чтобы подобного не повторилось?
Нужно производить локализацию ответов бекенда, на основе геолокации запроса. Как будете это делать?
> (new Thread((_)=>A.Run())).Run();
(new Thread((_)=>A.Run())).Start() конечно.
Без подсказок - хуево(((
>Какие действия предпримите и какие меры будут приняты, чтобы подобного не повторилось?
И каков правильный ответ? Роллинг логов не решение этой проблемы, а уволить еблана или закупить дисков мы не имеем полномочий. А настучать по кумполу поучительно, но тупиковый путь
Вопрос же на то чтобы посмотреть как будет рассуждать кандидат. Имеет ли он вообще опыт в таких задачах. Какой уровень инфраструктуры был у него не прошлых местах работы и че он там делал. Потому что может быть он там 5 лет жсоны гонял, а грейды ему давали за "лояльность", а не потому что как специалист рос.
Из того как решать, по очевидным подходам: поднять запасной сервер, в котором такой хуйни нет, и перенаправить трафик туда, пока чиним тот что засран.
Из мер, тоже очевидных - пайплайн переработать, репы разделить, чтобы конфиги лежали отдельно от основного кода, политики пересмотреть, чтобы кто угодно не мог лазить и править конфиги.
Хороший мидл - уже сталкивался с этим, и как минимум проговорить то что дядьки вокруг делали - может.
>>596157
Обычные вопросы для мидла+, стремящегося к сеньеру. Если чел на вопросе про строки, потоки посыпался - уже можно скипать, это джун-самозванец. Дальше - оцениваем какие проблемы решал в реальной жизни, как рассуждает, какие решения предлагает и либо повышаем планку начального грейда, либо понижаем.
>Каков размер строки "12345"?
Зависит от кодировки 5-10байт, но вроде для энтих буков также само.
>Чем будет отличаться выполнение Foo1 от Foo2?
Скоростью?
Я у себя в методе сохранения истории действия требую массив, чтобы был доступ к length и чтобы компактнее было.
видимо речь идет про реализацию INotifyCompletion
>Зависит от кодировки 5-10байт, но вроде для энтих буков также само
у дотнета utf-16, на символ 2 байта + хидер конечно.
Понял, что не так.
Гугл не хочет запросом принимать пдф файл версии 1.3.
Кто знает, есть ли способ обновить до 1.4 хотя бы И нет, изменить заголовок не сработает
Антончик, подскажи по ключам для вижлы.
Например у меня на офисном компе стоит Visual Studio Enterprise. Я например знаю ключ продукта и это единый ключ для всех установок в офисе.
Что в теории произойдет если я дома на своем компе установлю такую же и попытаюсь активировать её этим ключом?
Смогу ли я вообще её так активировать?
Запалит ли меня работодатель? (по количеству установок например или еще как сможет посмотреть)
Сможет ли он обрубить ее, так что вижла в тыкву превратится?
Да ебать, на написание этого уйдет больше времени и сил, чем на весь остальной проект
Ну наверно по количеству установок, когда очередному сотруднику будут выдавать ключ. Но тут вообще вопрос к подходу твоей компании. Обычно никто ключи не раздает офисному быдлу направо и налево, для этого есть специальная должность, идет учет кому выдали ключ, кому нет — именно по той причине, что есть такие гниды навроде тебя, которые пользуются чужим доверием. Т.е. здесь речь идет о какой-то микроконторке, которая купила ключ на авито и ей вообще похуй на последствия. В таких микроконторках можно пойти к боссу и попросить для работы.
Чел ... скачай с торрента, в чем отличие? Ты же ведь типа все равно нарушаешь закон, пользуешься втихушную пока никто не спалил — это ровно то, чем является торрент версия.
Или ты думаешь купленный интерпрайз золотом помазан?
Если у тебя ключ установлен неофициально, то отличий нет от спизженной.
Но блять, я так не люблю ебаться с гостшарпом и остальной хуйней, это надо будет дополнительно к приложению устанавливать его, нужно сохранять файл, читать из файла, удалять файл, эх.
>есть специальная должность, идет учет кому выдали ключ, кому нет
Классическая история, когда новенький добродушный системный администратор по дружбе дает офисному сотруднику ключ, а тот раздает его бабушке, теще, жене, собаке. Через неделю (в зависимости от размера компании) всё вскрывается, и сисадминчигу дают пизды старшие - так он с кочергой в жопе проходит обряд посвящения, приходя к единственно верной мысли, что среди офисного отребья друзей и товарищей быть не может.
Ну а если сиадминчек раздает ключи вообще всем, не установив, так сказать, эмоциональную связь с каким-то конкретным индивидом-крысой, то такого сисадминчега надо увольнять вовсе. Если только в компании все эти ключи - пыль в глаза.
Ну тогда от этого ключа тебе ни тепло не холодно. Можешь так же за копейки купить ключик на авито. Проеб заметят когда захотят зарегистрировоать нового юзера, а свободных не окажется или будет меньше предполагаемого.
Могут ли превратить в тыкву? Хз как в вижуал студи, но вероятно сбрасывается для всех и регистрируется заново, но уже по уму сисадмин собственноручно регистрирует и ведет отчетность.
Компилятор сам за тебя сделает лучше.
Нет это херь, братиш. Одно присвоение буквально одна реальная инструкция проца, а проверка условия и присовение это целых три инструкции из-за чего станет немного тормознее.
Тут правило орков во все поля: красное едет быстрее чем меньше код тем быстрее он работает.
И ещё такой вопрос: Не поздно ли я начал изучать в 17 лет? А то вечно этот вопрос гуляет в голове и не даёт покоя. Всех благодарю за ответы
>Не поздно ли я начал изучать в 17 лет
Самое время наоборот, к 20 лет уже будешь иметь 3 года, по сути мидл.
Чем на шарпе можно тестировать контракты апи?
Я уже заебался. Привыкли, блядь, люди делать монолиты, что если что-то сломаешь, то везде пиздец. Потому, если у них собирается - ну и похуй, я же свою работу сделал)))
Собственно. Я, могу поступить как крыса, начать стучать управленцам, но понимая как думают управленцы - они забюрократизируют все это дело и, скорее всего назначат меня следить, чтобы апи чужое не ломалось.
Очевидный заеб и я ебал это в сраку.
Потому, первое что хочу попробовать - это протолкнуть идею с тестами апида, блядь, я с трудом юнит-тесты протолкнул, пиздец сколько воевать пришлось, но теперь полегче жить стало, когда детские ошибки сразу фиксятся, и можно джунов посадить реально что-то полезное для других делать, а не придумывать им работу, чтобы УЧИЛИСЬ. Но очевидно же, что если их нужно будет вручную постоянно делать - все забьют. Потому - жду предложений чего-то в духе Spring Cloud Contract, но для шарпов. Можно конечно надрочить постманом и проганять так. Но ХЗ, не думаю что те кто забывают сами проверить, что их изменения ничего не сломали - будут постманом тестировать это.
Единственно что не радует - неразумные писатели библиотек зачем-то завышают требования к своим поделиям. Нахуя они это делают и главное зачем непонятно.
ulearn.me
>поддерживать устаревшее
Мне почему-то кажется, что бесконечная гонка за новым куда более изматывающее занятие чем фиксация версии либы на разумном пределе и оставление ее в покое.
Вокруг того же .Net 3.5 давно нет толпы хипстеров с шилом в жопе и тягой бесконечно улучшать все и вся, и знаешь, жить как-то спокойне. Если ты нашел на гитхабе что-то что под него работает, то это будет просто работать годами, а не ебать мозг обновлениями, сломаными апи, апдейтами безопасности, сетевыми холиварами призывающими перейти на что-то другое, вбросами маркетологов/евангелистов нахваливающих всю эту парашу и прочим суетливым булшитом. Просто работает и все! Охуенчик же. Есть конечно обратная сторона в виде 150 незакрытых багов которые не починят никогда. С ними можно жить ведь они тоже навсегда, а не каждый раз новые с каждым релизом.
>Новые фичи дают возможность переписать проще и оптимизировать.
Но по факту ты тратишь столько же времени, потому что частота переписывания увеличивается.
Насчет оптимизации тоже спорно, ибо оптимизируют в одном месте, но в то же время пытаются сделать некоторые вещи проще или гибче в использовании, что наоборот ухудшает производительность. Тот же WPF никак не проще винформсов, даже из коробки — из-за попытки быть гибким и универсальным одновременно. Там одними только словарями ресурсов можно похерить все сбереженные миллисекундочки.
>Стал еще более убежденным старовером.
Это возраст чел. Но я порой с грустью вспоминаю эти "бесполезные" метания с молодой горящей жопой, когда время казалось бесконечным. А с попытками все рационализировать приходит застой и эффективной деятельности становится не больше, чем раньше.
>Но по факту ты тратишь столько же времени, потому что частота переписывания увеличивается
Не увеличивается, никто ведь не заставляет переписывать.
>>597939
>Тот же WPF никак не проще винформсов, даже из коробки — из-за попытки быть гибким и универсальным одновременно.
Он гораздо проще. Просто попробуй сделать интерфейс со всплывающими меню, переключением страниц и анимациями и там и там, а потом сравни затраченное время.
>Есть конечно обратная сторона в виде 150 незакрытых багов которые не починят никогда.
Ты забываешь еще один ньюанс - отсутствие поддержки для современных решений. Возникнет у тебя например необходимость сделать интеграцию с каким-нибудь сервисом по grpc, и соснешь ты со своим 3.5 с проглотом.
>потом сравни затраченное время
Затраченное время для кого? Для машины? Еще раз перечитай мой текст, там написано, что в новых обновлениях ради удобства пользователя создают создают универсальный и гибкий инструмент, который своей массивностью перекрывает все оптимизации, поэтому оптимизации не стоит воспринимать всерьез.
Что касается затраченного времени пользователя, то на старых версиях просто не делают то, что геморно.
>Затраченное время для кого?
для программиста. На WPF элементарно делают вещи, которые на формсах ты будешь неделю пилить и то получится хрень. ну да, формсы работают быстрее, но я к этому времени уже получу деньги и уеду в закат, а ты будешь продолжать пердолиться с OnPaint
>Как это обнаружить?
круто знать теорию, но ее никто!!! не знает. всякие там тулзы разве что но то такое
>Можно ли его избежать?
ref (и в параметрах методов и локал), in, readonly
>Подскажи в каких случаях будет копирование стуктуры.
Ну когда ты просто обращаешься к свойству структуры, то ты получаешь значение этого свойства. Но вот если ты захочешь передавать методу структуру целиком, или же целиком возвращать, то вот тут уже начинаются вопросики, ибо будут передаваться все N значений структуры.
Если ты передашь методу структуру с десятью свойствами, а ПО ФАКТУ метод будет юзать от силы 2 свойства — вот это хуета какая-то. Эффективнее передавать только эти два свойства.
А если ты используешь 100% переданного, то вроде это не пробелма.
А так бывают структуры из двух свойств, к примеру Size, и даже есть совсем сложные типа Rect, где есть как минимум четыре свойства. Но все они используются чтобы избавиться от так называемых "телескопических" эффектов при инициализации. Их никто не передает взад-вперед. Вот надо построить прямоугольник, ты передаешь структуру Rect (из ширины, высоты, x, y) и все 4 свойства будут задействованы.
Короче, если ты уверен что данные всей твоей структуры будут использованы на 100%, то проблем нет.
Формат — это отличительный знак по сути, потому что имя может быть каким угодно.
Как по твоему программа будет искать файл и вообще распознавать каким образом его читать?
https://devblogs.microsoft.com/premier-developer/avoiding-struct-and-readonly-reference-performance-pitfalls-with-errorprone-net/
вот так все плохо. расширение давно не обновлялось в нюгет
со студией 2022 вообще хз
а прочтение статьи оставляет желание забить на этот вопрос
>апдейтами безопасности
А потом тебе нужно пройти аудит в СБ ИТ для релиза приложения. И ты сосешь хуи.
>Мне почему-то кажется, что бесконечная гонка за новым куда более изматывающее занятие чем фиксация версии либы на разумном пределе и оставление ее в покое
Пиздец сложно раз в год обновить конфиг, специально все делают что переход максимально простой.
Мне хватило один раз пол года обновлять приложение и руками переписывать старые либы под новые версии чтобы перестать быть старовером. Приключение называется "прохождение аудита безопасности приложения" где тебя индус, мексиканец и китаец ебут за кучу уязвимостей
Через биндинг получается очень уж геморройный мицелий привязок. Событием тоже срать как-то не комильфо.
Запихнул в базовую модель. У каждой дочерней вьюмодели пришлось таки реализовать свойство Parent и по этим парентам добираюсь до базы и меняю оригинал.
Более простого подхода без гемора я не нашел. Еще бы автоматом родитель назначался.
ну у тебя же пет проект. там свобода и можно перешагнуть через каноны
Делать все по науке слишком много гемора. Потому если наука не требуется, то можно мудрить.
у меня вот в таких вещах везде ходит context где помимо очевидного шарится словарик шаред вьюмоделей ака контроллеры. Типичная проблема - вьюмодель это god object и хочется разделить собственно данные для вида и команды. Особенно если одна команда и где то в меню и на статусбаре она же. И биндить такое жесть. А так везде доступен этот словарик и можно прямо биндить на него. Набор этих "контроллеров" существует в рамках какого то рутового Workspace, коих может быть сколько угодно ибо определяют регион, а не являются одним на весь проект.
сложно сказать удобно ли, ведь теперь после того как такой контроллер что то поменял он должен всех уведомить, что добавляет уже другого гемора.
Называется настройки приложения, ты можешь сохранять в выделеном хранилище любые данные приложения и получать к ним доступ путем инъекции зависимости. При внедрении тебе соберет объект настроек и выдаст его.
Почитай про внедрение зависимостей и IOptions
> К примеру если я хочу реализовать галочку "Больше не показывать это окно".
Делаешь статичный класс GlobalApplicationSettings
В нем:
public Dictionary<string, bool> ShowWindow { get; } = new();
При первом появлении окна - ставишь смотришь в словаре, если нет - ставишь тру.
При пометке галочкой - ставишь false. Сохраняешь на диск или в реестр.
Все.
Не еби мозги не себе не людям. Делай максимально просто. Ты в любом случае не будешь свои окошки переиспользовать.
Да. У этого класса - в конструкторе - делаешь инициализацию настроек из файлика.
Типа блин. Камон. Хороший код, это простой-понятный код, который решает задачу здесь и сейчас и который можно выкинуть нахуй, как только задача поменяется.
Такие вот дела. Да. А делая сложную хуйню с внедрением зависимостей, хуе-мое, регистрацией всего этого дела, выделяя классы под опции к твоей хуйн, ты потом неделю говно выгребать будешь, когда тот код что был нужен станет неактуальным.
дай угадаю, у тебя в проекте есть папочки Енум,Моделс,Хелперч и т.д., где лежить разнешестный кал?
Или лучше в Java Spring вкатываться?
Или как везде - тухло?
Одинаковые перспективы.
Да я то в Android-разработку иду - а там говорят что работы нет, то во фронтенд - и там тоже с работой вроде туго.
Решил на C# игры делать, а заодно и .net выучить - но вдруг надо Java Spring зубрить или еще куда перекатываться? перекатывайся в сантехники
> Да я то в Android-разработку иду - а там говорят что работы нет
Работы мало, да и то говно.
> фронтенд - и там тоже с работой вроде туго.
Там норм, но большая конкуренция.
> Решил на C# игры делать
Примерно как с андроидом.
> заодно и .net выучить
Учи ASP.NET Core. Бэкенд - самое нормальное направление.
> вдруг надо Java Spring зубрить или еще куда перекатываться
Если мало времени, советую поскорее выбрать что-то одно, а не скакать по десяткам сфер, а то рили вкатишься в сантехники. Если времени овердохуя, можешь посмотреть всё, повыбирать, вдруг в итоге вообще вкатишься в нейронки.
В нейронки тоже пробовал вкатиться - но не понравилось.
Ладно, буду пробовать ASP.NET Core.
Спасибо за совет, анон.
>А делая сложную хуйню с внедрением зависимостей
Никогда не понимал, что такого сожного в DI. Одна из самых простых и удобных концепций.
Сложность DI во много вокруг того что на него накручивают: регистрация дочерних зависимостей, детект отказов и логика восстановления, подмены зависимостей по условиям - вот это вот все знатно выносит моск. А так есть патерн еще проще чем DI, а именно сервис локатор. Но его сейчас предали анафеме за то он принципы солид нарушает.
При чем тут сложность DI как концепции? Сложность ретуалов вокруг него.
Раньше я делал как:
class A<B> where B : IB, new()
И норм, жил как-то. Получал зависимость снаружи, но при этом мне не нужно было ебаться с тем, чтобы прописать его куда надо, не нужно было в рантайме ловить хуйню, что зависимость не прокинулась, покрывать тестами как раз внедрение нужных зависимостей и прочей хуйней заниматься.
Крочое, удобно было.
Сейчас - модный дорч, что мы вообще нигде new сами не используем - бесит, больше карго риуталов делать приходится. При этом, по факту, ты все равно НИКОГДА, не будешь подкитывать другую реализацию, делаешь интерфейс, только чтобы мокнуть его в тестах. Все.
Короче. Я только проснулся. Хуй знает понятно ли мое негодование. Но суть такая. Не DI сложен, а пайплайн работы вокруг него.
раньше ты писал фабричный код создания объектов вручную
теперь DI пишет его за тебя
в чем сложность? а нет ее.
ну да бывают моменты когда хочется подменить реализацию или враппер какой, а контейнер мелких слишком примитивен для этого.
но это ж проблема конкретной реализации.
> в чем сложность?
В том что я как ебанат, делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs и вписывать каждый раз: services.AddScoped, services.AddSingleton, дополнительно - пиздовать в файлик appsettings.json и добавлять там секию с настроичками, делать MyClassOptions и т.д. Просто потому что УУУУУ, ТАК НАДА. Кому надо - непонятно.
Вот допустим. Мне надо было недавно добавить поле которое должно браться из конкретного файла, который должен лежать в конкретной папочки к ответу определенному.
Как я должен ПО НАУКЕ СДЕЛАТЬ:
interface IMyFiledProvider
{
puiblic string FileContent { get; }
}
public class FiledProviderOptions
{
public string Path { get; set; }
}
public class FiledProvider : IMyFiledProvider
{
public FiledProvider(FiledProviderOptions options)
{
FileContent = File.ReadAllText(options.Path);
}
public string FileContent { get; }
}
Пойти, зарегистрировать эту хуйню. Потом не забыть добавить в конструктор того класса, который генерирует ответ IMyFiledProvider и только потом добавить поле.
Охуенно? Охуенно!
Подумай, почему я не стал так делать.
> в чем сложность?
В том что я как ебанат, делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs и вписывать каждый раз: services.AddScoped, services.AddSingleton, дополнительно - пиздовать в файлик appsettings.json и добавлять там секию с настроичками, делать MyClassOptions и т.д. Просто потому что УУУУУ, ТАК НАДА. Кому надо - непонятно.
Вот допустим. Мне надо было недавно добавить поле которое должно браться из конкретного файла, который должен лежать в конкретной папочки к ответу определенному.
Как я должен ПО НАУКЕ СДЕЛАТЬ:
interface IMyFiledProvider
{
puiblic string FileContent { get; }
}
public class FiledProviderOptions
{
public string Path { get; set; }
}
public class FiledProvider : IMyFiledProvider
{
public FiledProvider(FiledProviderOptions options)
{
FileContent = File.ReadAllText(options.Path);
}
public string FileContent { get; }
}
Пойти, зарегистрировать эту хуйню. Потом не забыть добавить в конструктор того класса, который генерирует ответ IMyFiledProvider и только потом добавить поле.
Охуенно? Охуенно!
Подумай, почему я не стал так делать.
>делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs
далеко не каждый класс так то, а только те, которые нужны чтобы их где то резолвили
>дополнительно - пиздовать в файлик appsettings.json
Вообще не относится к DI, а относится к "здравый смысл говорит что не нужно все в кучу скидывать, а разделить где что лежит чтобы потом быстро находить" . Да и изменять потом конфиг путем перекомпиляции - после первого же раза тебе это надоест
> ПО НАУКЕ СДЕЛАТЬ:
по науке ты должен сделать интефрейс IВотЭтоПровайдер
и уже в имени реализации будет указано откуда чего как.
и да, сходить зарегестрировать где это нужно. Потому что без регистрации ты будешь сам писать new Реализация(options), а потом выделишь все это в фабричные методы, то есть просто будешь делать то, что за тебя генерит контейнер.
сначала приходит понимание что СТОИТ потратить время на структуру где чего лежит чтобы все было чистенько и не было DRY
А потом и понимание что не стоит писать фабрики ручками.
>Подумай, почему я не стал так делать.
молодость и неопытность, еще не поел говна "и так сойдет все равно менять ничего больше не буду", а потом пришлось менять.
А как поешь, то даже в мелких проектах будет у тебя сразу подобие порядка.
Гайз, опишите плез кейсы, когда CQRS + Mediatr полезно использовать.
> и да, сходить зарегестрировать где это нужно. Потому что без регистрации ты будешь сам писать new Реализация(options), а потом выделишь все это в фабричные методы, то есть просто будешь делать то, что за тебя генерит контейнер
Эх. Вот я про это говно и говорю.
И да. Я, как нормальный человек, на самом деле давно сделал: ServiceAttribute, и метод расширения RegisterServicesFromAssembly. Но все равно буду гореть. Потому что ебатория какая-то по дефолту. Вот когда сделают нормально, чтобы не нужно было свой атрибут и метод расширения делать - тогда и успокоюсь.
> молодость и неопытность
10 лет коммерческой разработки, чел.
многие либы у себя точно так же позволяют сделать "найди все сам в сборках и зарегай". суть от этого не меняется же.
>>599693
>10 лет коммерческой разработки, чел.
я ж о том и говорю. "давай давай, некогда думать как лучше". не искусство, а ремесло.
Так нифига ж не лучше. Лучше, это когда я могу - просто выкинуть не нужный класс, и нихуя не сломается. Тут - я выкинул один класс, пиздуй разрегистрировать, пиздуй ту хуйню остальную удаляй. Куча ебучих ритуалов, из-за тупой реализации DI.
При этом, сделать самому нормальный DI - намного проще, но ебучие джуны же увидев свою реализацию контейнеров - обосрутся и приходится уже на уровне выше меньше выебываться, чтобы остальная команда - не страдала.
Эх. Вот раньше как было охуенно. Берем ADO, делаем папочку sql, свой DI нормальный, три слоя и погнали. Не. Теперь делаем говно, потому что майки учат говно, а джуны - по урокам майков учатся. Грустно короче. Да.
>При этом, по факту, ты все равно НИКОГДА, не будешь подкитывать другую реализацию, делаешь интерфейс
Схуя ли? Банальный пример - паттерн Стратегия. Запихиваешь в контейнер все реализации одного интерфейса, а потом в контексте резолвишь нужную.
И зачем делать это через DI? Чтобы что? Или ты в стратегию дохуилиард зависимостей просовываешь? Ну просовывай их прямо в контексте.
>Ну просовывай их прямо в контексте.
А нахуя роутеру стратегии знать что там и как нужно самой стратегии?
Тебе хороший пример скинули а ты все копротивляешься
Раньше я думал, что лютый сечас тренд "СЛОЖНА СЛОЖНА ХАЧУ прОЩе ЛАПШУ ТЯНУТЬ" идет от джунов, но теперь вижу, что тут еще второй фронт пожилых шлеп, которые повторяют за умными дядями, но не понимают зачем и им пришло "озарение" - "не я тупой, а они"
Причём тут дженерик и DI. Как ты собрался условно настройки приложения таким образом передавать или реализации интерфейса? В каждом месте руками указывать класс реализации и потом руками же менять?
Есть ощущение что ты 10 лет писал говнокод и вообще не понимаешь термины которые используются
>В том что я как ебанат, делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs и вписывать каждый раз: services.AddScoped, services.AddSingleton
Сделай нормальные суффиксы и резолвер по именам, не?
Можно просто написать расширение, которое с помощью рефлексии добавляет все классы из определенных папок.
Выкидывает с необработанным исключением, ошибка в методе от telegram.bot
Ты точно понимаешь что ты делаешь?
https://telegrambots.github.io/book/2/send-msg/native-polls-msg.html
Я хочу получать сообщение из которого надо скопировать текст и отправить в sql запрос, однако бот не дожидается второго сообщения и копирует пустое поле
С хера не любят? Оч даже любят. Просто у шарпа была оооооочень долгая проблема с тем, что он был привязан к винде. Собственно, очень много где - это не подходило. Допустим, в нефтянке, на заводах всяких и прочих местах, где АйТи - не совсем свое - шарп нормально так укоренился, пока майки не решили убить классический фреймворк.
Блядь, половина того что удаленно снимает показание с твоих приборов учета, в РФ либо на плюсах(тех что C++/CLI), либо на шарпе, иногда еще дельфи, да. На заводах - аналогично, половина автоматизации заводов - это шарпы, дельфи, и плюсы. Есть часть легаси веба на ASP.Net, который еще старый, до того как там появились эти ваши вебапи и прочее.
Тырпрайз, у нас тут исторически на жаве писался.
Банки - тоже.
А когда майки таки отпустили поводья и сделали .netcore - уже как-бы рынок остального АйТи - поделен у нас. Стеки устоялись. Шарповоду, который не хочет на завод, по большей части дорога только в ДоДо, 2гис или банки, которые появились позже. Ну или в гейдев с юнькой.
А почему так сложилось? Потому что винда - всегда была проблемой для шарпа. Язык-то охуенный, но когда начинается реальное IT, никто не хочет с ней связываться. Вот и жил себе долго шарп сбоку, в областях автоматизации всякой.
А потом такие смотрят с приоткрытым ртом, когда в код, сделанный по заветам "карго-культа" новые фичи добавляются просто дописыванием новых имплементаций и парой строчек в di, а не разъебывая половину проекта, как они привыкли.
Но он же умный, он получил год опыта 10 раз.
Всё правильно он "нафантазировал"
Ну ок. Ты зашел на опасную территорию.
Давай. Вот тебе кейс.
Система опроса с очередями. Логика была простой: устройство - воркер, воркер пытается опросить устройство, сохраняет результат опроса в базу. Все изначально просто - по TCP общаемся без особых проблем.
Ок. Все норм. 10к потоков спокойно опрашивают че там надо.
Теперь - у нас есть COM-порты, через один COM-порт подключено 2к устройств.
Давай, объясняй, как твой DI поможет решить проблему того, что нельзя пытаться открыть из разных потоков один и тот же COM-порт.
>как твой DI поможет решить проблему того
Ты микроскопом суп хлебаешь?
DI решает другие проблемы
> новые фичи добавляются просто дописыванием новых имплементаций и парой строчек
Так каким образом новая фича в опросе через COM-порт будет реализована-то? Нужно же просто по заветам карго-культа чет там дописать.
очень просто
твой воркер не работает ни с какими устройствами напрямую. Он принимает какой нибудь IDevice и с ним работает.
Вот когда ты захочешь заменить device с tcp реализацией еще com реализацией, то ты сможешь просто переконфигруривать все в DI и твой воркер получит другой девайс
а твоя проблема - тупо решается средствами синхронизации потоков.
Ты же понимаешь (видимо нет) что не все пихается в DI?
Если тебе нужен семфор, ты же не принимаешь его в конструктор (кроме случаев если тебе нужен общий семафор, что бывает нужно менее чем 1/1000000 случаев ибо это грязно), а рождаешь его на месте.
Недавно услышал, что теперь synchronisation context выпилили и с дедлоками все лучше
никто его не выпиливал. его просто нет в асп.нете и поэтому можно не писать ConfgureAwait(false) и типа не иметь проблем.
типа.
Если ты не понимаешь пользы, так я приведу пример.
Вот захочу я переписать уродскую модель виджетов в асп.нет на няшную модель компонентов - так я в итоге просто зарегистрирую в контейнере свой чето там движок и все заработает
А все почему? А потому что майки открыли точку расширения фреймворка и у меня есть возможность в ней заменять нужные части на свои. И для этого мне не нужно делать форк, чего то патчить в рантайме и так далее.
Начнем с того, что твой воркер нарушает принцип единой ответственности.
Я бы инжектил в него список комманд, реализующих простой интерфейс с методом doasynk, и выполняющих одну итерацию бизнес логики.
Отдельные команды, чтобы выгребать из портов данные и писать их в конкаррент очереди в памяти.
Отдельные комманды, чтобы выгребать данные из очередей и держать коннект на ком порту.
Отдельные комманды, чтобы забирать данные из очередей и писать их в базу.
Понадобится lpt порт прикрутить - добавляешь комманду в енумерабле, воркер ее крутит.
Заранее извиняюсь за почерк, бахнул пива и пишу с телефона.
> Начнем с того, что твой воркер нарушает принцип единой ответственности
Каким образом-то?
Он буквально делает вот что:
while(stopToken.IsCancellationRequired is false)
{
var task = await _reader.ReadAsync(stopToken);
var interface = task.Interface;
if(interface.IsOpen is false) interface.Open();
for(int i = 0; i < _retrys; i++){
var protocol = task.Protocol;
var request = protocol.CreateRequest(task.Mapper.ToProtocol(protocol));
var response = await interface.SendRequestAsync(request, stopToken);
if(responce.IsSuccess)
{
await _dataArchive.SaveData(task.Mapper.FromProtocolToData(typeof(protocol), respose.Payload));
break;
}
}
if(task.CloseInterfaceOnComplete is true) interface.Close();
}
И что быстрее If bool, или delegate метода внутри цикла?
Замерь, разницы не увидишь.
Меня дрочили теорией по бд и устройством v8 собесился на фулстека.
По шарпу было два вопроса, по которым я спорил с интервьюером - как работает IDisposable и деструктор, и про структуры. В первом он мне пытался доказать, что Dispose удаляет объект из памяти, а я говорил, что не удалет, а убивает неуправляемые ресурсы. По второму говорил, что GC чистит структуры, что очевидно не так. Я же прав??
В конце правда по чесноку сразу сказал, что я не подхожу, и признался, что у них жуткое легаси на вебформах, так что я не расстроился.
Тяжело...
Dispose - скмантическм вида close/finally. Ресурсы тут не причем. В диспозе можно хоть ктудху вызывать
Gc не трекает структуры.
мда. тяжко на мобиле писать. добрался до компа и поясню шире
В общем Dispose - настойчивая!!! рекомендация вызвать этот метод когда объект уже не нужен чтобы он корректно очистил свое состояние.
Но это не значит что это неуправляемые ресурсы. Я могу использовать (и активно использую) using(IDisposable) как альтернативу try_finally и где тут неуправляемые ресурсы? А нигде. Так что у Dispose семантика Close и это может быть что угодно вообще. В том числе и ничего - не все, что есть IDisposable, требует этого вызова - в районе HttpClient такое есть.
Другое дело что просить вызвать Dispose не значит что его удобно вызывать, но это уже совсем другая тема.
Так что это просто паттерн "очень!!! прошу вызови этот метод чтобы я корректно освободил ресурсы/ сделал нужное дело" без конкретики что именно будет происходить
Структуры живут на стеке. GC не заведует стеком, но вот при боксинге структуры попадают в кучу и тогда GC знает про обертку и трекает ее.
>жуткое легаси на вебформах
эээх. а ведь они ищут того кто им перепишет на новое, а ты их подвел )
>что GC чистит структуры
Может и чистит. Если у структуры есть поле ссылочного типа его содержимое находится в куче. GC очевидно занимается отслеживанием живых структур которые держат на ссылку.
>что быстрее If bool, или delegate метода внутри цикла?
Делегат намного тормознее. Для вызов каждой функции нужно сохранять контекст предыдущей, выделять память под локальные переменные, потом это все очищать.
Оказывается, что есть единая история, типа как в проводнике, когда не важно в каком окне идут изменения — все это часть одной истории.
А есть отдельная история для каждого документа, как это делается в фотошопе или в той же вижуал студии. Это конечно удобно, до тех пор, пока ты не решишь реализовать для файлов функцию Cut/Paste.
Эта срань делает зависимой одну историю от другой. Я раньше ругался на программы типа 3д макса, считая их древним говном мамонта, а разрабов ленивыми уебанами, не могущими сделать "так как в обычном проводнике". Оказывается вот оно че.
В фотошопе, к примеру, нельзя переместить слой из одного проекта в другой — только дублировать.
И ладно бы студия, у которой просто текст, где перемещение текста это по сути копирование с уничтожением оригинала. В этом случае Ctrl+Z в источнике просто оставит копию. Но ведь есть тяжеловесные объекты типа как 3д-модель со своим уникальным ID, и по сути, перемещение из одного документа в другой — это перемещение ссылки на этот объект. А время физического перемещения там может занять до минуты.
Конечно есть решение, но оно неоднозначное и пока не представляю как это может аукнуться в будущем. Напрягает, что так не реализовано нигде.
Да. Проходишь интервью, узнаешь вопросы, отправляешь в прошлое самому себе список вопросов. Просто и продуктивно.
Т.к. связей в айти у меня нет, то хочу спросить у здешних гуру.
Учась на 3м курсе в неплохом вузе в столице решил, что пора искать первую работу в ит, именно на бэк на C#. Очевидно, что резюме на hh +/- пустое т.к. опыт официальной работы был ток в фастфуде, но, думаю, что вставлять это на hh себе дороже. Сначала пытался надыбать стажировки на шарпах, но их вообще по пальцам пересчитать, потом решил биться на джуна, но, честно говоря, уже складывается ощущение, что бьюсь головой о стены. Я в своих пет-проектах (a.k.a курсачи/лабы в ВУЗе/хакатоны) юзал стек из Jquery, ASP Net Mvc, Core, EF Core, голые SQL запросы, PostgreSQL, Mssql и т.д.. Даже есть пару сертификатов, что я прошёл отбор на группу повышения квалификации в вузе, причём успешно закончил. Но вот уже откликнулся на 34 вакансии, где-то с сопроводительным письмом, где-то без, где-то решал тестовые, где-то нет и на данный момент стата из 34 вакансий: 21 отказ и 13 игноров.
В общем, однокурсник, который устроился на 1С хотя шёл на джависта говорит, мол, жди апреля, там финансовый год начнётся, поэтому я остыл и пока решил подождать до апреля, а теперь собственно вопрос: "Правильно ли я делаю вещи клипая ненужные никому pet-проекты, решая литкод и читая книги, может быть лучше просто как-то офигительно наврать на hh про несуществующий опыт работы? Или может ходить на всякие C# встречи, что люто хайпятся в рекламе вк/hh? Или может купить курсы с "100% трудоустройство после окончания" (хотя этот вариант нереальный т.к. я бомжара 100 уровня, даже учиться в вузе начинал в кредит, благо смог на бюджет перейти)?"
Спасибо, значит я на верном пути, но mindbox мне, кстати, уже отказал, буквально пару недель назад, что меня удивило т.к. я тестовое решил прям как надо, конечно, по моему неджуновскому мнению. А что такое "сисдиз"?
Судя по всему это сокращение от "системный дизайн", а что подразумевается под этим словосочетанием?
- Умение использвоать системы контроля версий с веточками и girflow?
- Паттерны проектирования вроде строитель, одиночка и т.п.?
- Принципы программирования типо Solid, Kiss, Dry?
- Принципы ООП?
Просто это я тоже изучаю (хотя, думаю, могу сказать, что изучил)
А вот и ответ, хорошо, спасибо попробую, про контур вообще до э
того не слышал. Наверное, действительно на джуна мне рановато без опыта пытаться, попробую добиться какой-нибудь стажировки за еду.
Сами потоки тут не причем
Это сам объект (или то что он использует) запоминает поток создания ибо ему это важно, ну и проверяет что его вызовы в том же потоке
Попробуй в озон на стажировку поступаться. https://tech.ozon.ru/routestart
У меня знакомый qa-мануальщиком на нее попал. Неделю назад закончил стажировку и теперь там джуном работает.
Бляяяя чел. Пусть твои 2000 устройств пишут в очередь, а другие потоки это читают и делают что надо.
Передашь IDataWriter для адаптера твоих вокреров. Они не зная что там находится внутри пишут в него данные. Пишем хоть вообще отдельное приложение или фабрику ридеров которые читают из IDataRider.
в качестве реализации используем потокобезопастные коллекции или вообще отдельный сервер очередей.
Получаем архитектуру где 1000 устройств пишет куда данные и не знает что с ними происходит, может в текстовый документ пишут или в Пентагон данные шлют, а возможно там вообще 10 разных вариантов одновременно.
Ридеры читают данные откуда-то, им неизвестно откуда они берутся. Сами ридеры это возможно вообще разные физ машины или набор потоков.
У меня ощущение что у тебя проблемы с пониманием концепции интерфейсов и сокрытия деталей реализации. Твои все эти штуки не должны вообще знать о природе хранения данных, это не их дело
>Правильно ли я делаю вещи клипая ненужные никому pet-проекты, решая литкод и читая книги, может быть лучше просто как-то офигительно наврать на hh про несуществующий опыт работы
Хуйней занят. Литкод это бесполезная хуета, твои проекты нахер никому не интересны и их никогда никто не будет смотреть.
> Передашь IDataWriter для адаптера твоих вокреров. Они не зная что там находится внутри пишут в него данные. Пишем хоть вообще отдельное приложение или фабрику ридеров которые читают из IDataRider.
Угу.
Получаем. Пришло время почитать у 1000 устройств, которые висят на одном COM-порте. Все обработчики обосрались, они ретраят. В результате - сбор пошел по пизде. ЗАТО АРХИТЕКТУРА, да.
тебя уже не вылечить. иди на завод
Ваше не вкатывайся в .net, это говнище умирает ну как минимум не развивается. Я сйечас локти кусаю что 2 года назад в голанг не перекатился.
С чего он обосрались дебис? С того что ты хочешь через 1 порт опросить 1000 устройств? Извините блять кодом нельзя решать проблемы того что ебанутый. Ты ещё спроси а че ваша архитектура не умеет решать проблемы хардвера
Чел. Я не ебанутый. Это обычная практика.
Так вот. Независимо от архитектуры, мы должны учитывать, что вот для COM-порта надо еще на уровне поставления задачи разруливать, иначе пизда. Если мы так же хотим, чтобы через ПэЭлКа какой-нибудь хреновенький можно было опрашивать - мы так же должны учитывать че там за ПэЭлКа и в ряде случаев - не создавать задачи чтения, пока сеанс связи через ПэЭлКа с другим устройством не завершится. И все это вот.
Ну, че поделать. Да.
Но мне выше говорят, что все можно сделать абстрактно и потом просто строчку дописать, все будет заебись. Не будет, блядь.
Это обычная практика. У тебя стоит модем подключенный через COM, через него по CSD устройства в полях опрашиваются.
Пошел нахуй, неуч. Ходить нахуй - это стандартная для тебя практика.
Протокол ModBus предполагает использование адресов ведомых устройств в диапазоне 1-. 247. Каждое устройство в сети должно иметь уникальный адрес.
https://intellect-module.ru/downloads/manuals/inode_35D/ModBus_RTU.pdf
>У тебя стоит модем подключенный через COM, через него по CSD устройства в полях опрашиваются.
У тебя, шизло. В фантазиях.
Период опроса говна в полях сколько лет, если говн несколько тысяч?
Ебать ты коневод сфероконей в вакууме.
В целом, подход может сработать, потому что спрашивают, обычно, документацию + некоторые практические моменты (популярно встречающиеся, но в доке описаны скудно), таким образом, просто задрочить документацию профита не даст, а если времени пилить пет-проект нет, то и подавно. Хотя я бы советовал совмещать документацию и вопросы к собесам - чувствовать будешь себя уверенней, да и в работе пригодится.
Вы видите копию треда, сохраненную 6 апреля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.