Это копия, сохраненная 1 августа 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Литература вторым постом
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://docs.microsoft.com/ru-ru/dotnet/csharp/
— https://metanit.com/
2. Онлайн-компиляторы:
— https://ideone.com/
— https://dotnetfiddle.net/
3. WinForms или WPF?
Зависит от задачи. Для небольших проектов, скорее всего, будет достаточно винформочек. В случае, если разрабатываемое приложение достаточно серьёзное, то возможно его стоит писать с использованием WPF. WPF очень хорошо работает с паттерном MVVM ( https://ru.wikipedia.org/wiki/Model-View-ViewModel ), и позволяет пилить очень кастомизированные интерфейсы с помощью XAML, что в случае с WinForms делать намного сложнее.
4. Мне тут знакомый_нейм сказал, что C# умирает, это правда? Может не стоит его учить?
C# активно развивается, недавно вышел .NET 5 и С# 9.0. Дотнет стал полностью опенсорсным и кроссплатформенным. В том же энтерпрайзе он очень даже востребован. Но в то же время стоит реально оценивать свои возможности и ресурсы. Основная часть вакансий приходится на ДС и ДС2. "Чистых" C#-разработчиков требуется буквально несколько десятков на всю страну. Вакансий в несколько раз меньше, чем в других направлениях. Порог входа намного выше, чем, например, в том же фронтенде.
5. Какую IDE выбрать?
Для Windows самым очевидным вариантом будет Visual Studio ( https://visualstudio.microsoft.com/ru/downloads/ ). Бесплатной Community-версии более, чем достаточно для большинства задач. Также есть версия для macOS.
Кроссплатформенный полуредактор/полуIDE VS Code ( https://code.visualstudio.com/ ).
Кроссплатформенный IDE Rider ( https://www.jetbrains.com/rider/ ).
Также существуют C#-плагины для Atom и Sublime Text, но функциональность там достаточно сильно урезана.
6. С# для мобильной разработки
https://dotnet.microsoft.com/apps/xamarin
Новые возможности C# 9.0: https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/
Текст шапки: https://pastebin.com/pbK8CGqw
— The C# Player's Guide, третье издание (RB Whitaker) — отличная книга для ньюфагов, всё расписывается довольно подробно, очень много примеров кода.
— C# 9 and .NET 5 – Modern Cross-Platform Development (Mark Price) — подойдёт для ознакомления с платформой. Затрагивает все технологии, имеющиеся в .NET (веб, мобильная разработка, машинное обучение), ни во что не углубляясь.
— C# 8.0 in a Nutshell (Joseph Albahari и Eric Johannsen) — огромнейший справочник, over 1000 страниц, покрывает почти все области, начиная с синтаксиса и базовых типов и заканчивая интеропом и рослином.
— C# 8.0 Pocket Reference (Joseph Albahari и Ben Albahari) — просто выжимка из книги сверху, можно всегда держать рукой.
— Pro C# 8 with .NET Core 3 (Andrew Troelsen) — 1600-страничный учебник по шарпу, покрывает BCL, WPF и ASP.NET, небо и даже аллаха.
8. Более хардкорный материал
— CLR via C# (Jeffrey Richter) — это классика, это знать надо.
— C# in Depth (Jon Skeet) — написана в виде истории версий C#, начиная с C#1.0. Описываются возможности, которые были добавлены в определенной версии и далее достаточно хардкорно и подробно эти возможности расписываются.
— Writing High Performance .NET Code (Ben Watson) — отличная книга. Фокусируется на методах оптимизации приложений, профилировании. Крутейшая и достаточно детальная глава по GC. Рассматриваются достаточно известные проблемы вроде "for vs foreach", "класс vs структура", кастинг, боксинг, перфоманс регулярок, коллекций, исключений. Короче всё, что нужно, чтобы вам перезвонили.
9. Литература по WPF
— Pro WPF 4.5 in C# (Matthew MacDonald)
— Windows Presentation Foundation 4.5 Cookbook (Pavel Yosifovich)
10. Литература по ASP.NET
— Pro ASP.NET Core 3 (Adam Freeman)
— Professional ASP.NET MVC 5 (Jon Galloway, Brad Wilson, K. Scott Allen, David Matson)
11. Литература по асинхронности и параллелизму
— Concurrency in C# Cookbook (Stephen Cleary) — книга, написанная в формате "проблема - решение". Кроме базовых вещей, вроде асинков и параллелизма рассматриваются TPL Dataflows, Rx (реактивные расширения), тестирование всего этого асинхронного добра, ну и работа этого всего на более низких уровнях абстракции.
— Multithreading with C# Cookbook (Eugene Agafonov) — в основном ничего интересного, но есть довольна неплохая глава про синхронизацию, пусть и не слишком детальная.
— Pro Asynchronous Programming with .NET (Richard Blewett, Andrew Clymer) — опять же, интересного немного, но неплохие главы про асинхронность + UI и анализ дампов памяти в windbg.
12. Литература по мобильной разработке
— Creating Mobile Apps with Xamarin.Forms (Charles Petzold)
— Xamarin.Forms Projects (Johan Karlsson, Daniel Hindrikes)
— Mastering Xamarin.Forms (Ed Snider)
13. Литература по машинному обучению
— Introduction to Neural Networks for C# (Jeff Heaton) — изучение нейронных сетей с примерами кода на шарпе. Под конец пишем программу для распознавания символов и нейроботов.
— Machine Learning Using C# Succinctly (James D. McCaffrey) — довольная коротенькая книга на тему машинного обучения с примерами кода на C#. Ничего особого: k-средние, классификация, наивный байес, но с кодом, который всегда можно поразбирать, если что неясно.
14. Разработка игр
Unity-тред в /gd/
15. Но я не знаю английский, как я буду это все читать?
На некоторые из перечисленных книг есть переводы, которые можно найти на том же рутрекере, однако зачастую эти переводы неактуальны и/или содержат неточности. Кроме того, переводы обычно пилятся только для нескольких самых популярных книг, более-менее серьёзный материал не переводят. Всегда можно сесть со словарем и понемногу читать, переводя непонятные фрагменты. Это очень полезно, так как в любом случае в программировании без знания английского делать нечего. Если очень хочется, то гуглить по запросам: "C# 7.0. Справочник. Полное описание языка", "C# для профессионалов. Тонкости программирования", "Программирование на платформе Microsoft .NET Framework 4.5 на языке C#".
16. Что еще нужно знать, чтобы взяли работать за еду?
— Базы данных — подойдет любая книга по MSSQL/MySQL/PostgreSQL. DDL, DML. Джойны, индексы, нормализация. В контексте шарпа еще ORM: Entity Framework, Dapper.
— Системы контроля версий — обычно гита достаточно: add/commit/push, merge, rebase, checkout, remote, diff, разрешение конфликтов.
— GitHub — issues, пулл-реквесты, теги, релизы, Actions.
— Алгоритмы — сортировка, поиск, оценка сложности алгоритмов, рекурсия, алгоритмы на строках.
— Структуры данных — связанные списки, деревья (бинарные, красно-чёрные, b-деревья), хеш-таблицы, графы.
— Если идти в веб — HTML, CSS, JavaScript, веб-сокеты, REST, JS-фреймворки (Angular, React, Vue).
— Паттерны проектирования, стиль кода, архитектура приложения, внедрение зависимостей, MVVM (если хочется в WPF), SOLID.
17. Я не умею читать, что посмотреть?
— C# Fundamentals: Development for Absolute Beginners — https://goo.gl/meyyxO
— Набор курсов по C# от O'Reilly Media (28 часов, на английском) — http://rutracker.org/forum/viewtopic.php?t=5082978
— Канал по C# IAmTimCorey (на английском) — https://www.youtube.com/user/IAmTimCorey
— The C# Player's Guide, третье издание (RB Whitaker) — отличная книга для ньюфагов, всё расписывается довольно подробно, очень много примеров кода.
— C# 9 and .NET 5 – Modern Cross-Platform Development (Mark Price) — подойдёт для ознакомления с платформой. Затрагивает все технологии, имеющиеся в .NET (веб, мобильная разработка, машинное обучение), ни во что не углубляясь.
— C# 8.0 in a Nutshell (Joseph Albahari и Eric Johannsen) — огромнейший справочник, over 1000 страниц, покрывает почти все области, начиная с синтаксиса и базовых типов и заканчивая интеропом и рослином.
— C# 8.0 Pocket Reference (Joseph Albahari и Ben Albahari) — просто выжимка из книги сверху, можно всегда держать рукой.
— Pro C# 8 with .NET Core 3 (Andrew Troelsen) — 1600-страничный учебник по шарпу, покрывает BCL, WPF и ASP.NET, небо и даже аллаха.
8. Более хардкорный материал
— CLR via C# (Jeffrey Richter) — это классика, это знать надо.
— C# in Depth (Jon Skeet) — написана в виде истории версий C#, начиная с C#1.0. Описываются возможности, которые были добавлены в определенной версии и далее достаточно хардкорно и подробно эти возможности расписываются.
— Writing High Performance .NET Code (Ben Watson) — отличная книга. Фокусируется на методах оптимизации приложений, профилировании. Крутейшая и достаточно детальная глава по GC. Рассматриваются достаточно известные проблемы вроде "for vs foreach", "класс vs структура", кастинг, боксинг, перфоманс регулярок, коллекций, исключений. Короче всё, что нужно, чтобы вам перезвонили.
9. Литература по WPF
— Pro WPF 4.5 in C# (Matthew MacDonald)
— Windows Presentation Foundation 4.5 Cookbook (Pavel Yosifovich)
10. Литература по ASP.NET
— Pro ASP.NET Core 3 (Adam Freeman)
— Professional ASP.NET MVC 5 (Jon Galloway, Brad Wilson, K. Scott Allen, David Matson)
11. Литература по асинхронности и параллелизму
— Concurrency in C# Cookbook (Stephen Cleary) — книга, написанная в формате "проблема - решение". Кроме базовых вещей, вроде асинков и параллелизма рассматриваются TPL Dataflows, Rx (реактивные расширения), тестирование всего этого асинхронного добра, ну и работа этого всего на более низких уровнях абстракции.
— Multithreading with C# Cookbook (Eugene Agafonov) — в основном ничего интересного, но есть довольна неплохая глава про синхронизацию, пусть и не слишком детальная.
— Pro Asynchronous Programming with .NET (Richard Blewett, Andrew Clymer) — опять же, интересного немного, но неплохие главы про асинхронность + UI и анализ дампов памяти в windbg.
12. Литература по мобильной разработке
— Creating Mobile Apps with Xamarin.Forms (Charles Petzold)
— Xamarin.Forms Projects (Johan Karlsson, Daniel Hindrikes)
— Mastering Xamarin.Forms (Ed Snider)
13. Литература по машинному обучению
— Introduction to Neural Networks for C# (Jeff Heaton) — изучение нейронных сетей с примерами кода на шарпе. Под конец пишем программу для распознавания символов и нейроботов.
— Machine Learning Using C# Succinctly (James D. McCaffrey) — довольная коротенькая книга на тему машинного обучения с примерами кода на C#. Ничего особого: k-средние, классификация, наивный байес, но с кодом, который всегда можно поразбирать, если что неясно.
14. Разработка игр
Unity-тред в /gd/
15. Но я не знаю английский, как я буду это все читать?
На некоторые из перечисленных книг есть переводы, которые можно найти на том же рутрекере, однако зачастую эти переводы неактуальны и/или содержат неточности. Кроме того, переводы обычно пилятся только для нескольких самых популярных книг, более-менее серьёзный материал не переводят. Всегда можно сесть со словарем и понемногу читать, переводя непонятные фрагменты. Это очень полезно, так как в любом случае в программировании без знания английского делать нечего. Если очень хочется, то гуглить по запросам: "C# 7.0. Справочник. Полное описание языка", "C# для профессионалов. Тонкости программирования", "Программирование на платформе Microsoft .NET Framework 4.5 на языке C#".
16. Что еще нужно знать, чтобы взяли работать за еду?
— Базы данных — подойдет любая книга по MSSQL/MySQL/PostgreSQL. DDL, DML. Джойны, индексы, нормализация. В контексте шарпа еще ORM: Entity Framework, Dapper.
— Системы контроля версий — обычно гита достаточно: add/commit/push, merge, rebase, checkout, remote, diff, разрешение конфликтов.
— GitHub — issues, пулл-реквесты, теги, релизы, Actions.
— Алгоритмы — сортировка, поиск, оценка сложности алгоритмов, рекурсия, алгоритмы на строках.
— Структуры данных — связанные списки, деревья (бинарные, красно-чёрные, b-деревья), хеш-таблицы, графы.
— Если идти в веб — HTML, CSS, JavaScript, веб-сокеты, REST, JS-фреймворки (Angular, React, Vue).
— Паттерны проектирования, стиль кода, архитектура приложения, внедрение зависимостей, MVVM (если хочется в WPF), SOLID.
17. Я не умею читать, что посмотреть?
— C# Fundamentals: Development for Absolute Beginners — https://goo.gl/meyyxO
— Набор курсов по C# от O'Reilly Media (28 часов, на английском) — http://rutracker.org/forum/viewtopic.php?t=5082978
— Канал по C# IAmTimCorey (на английском) — https://www.youtube.com/user/IAmTimCorey
Вы понимаете, что никогда работу с нуля не найдете?
А куда идти? В С++ что ли?
Дурында, это как раз самый рабочий вариант. Раньше вкатывались на дельфи и вижуал бейсики, альтернативой были хардкорные кресты или зеленые ещё скрипты.
Хотя зумеры может и не оценят, или ты и есть он?
Создал web проект и добавил в него функциональности (пик 1)
Запускаю
dotnet publish -r win-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true
чтобы создать финальную версию сборки, которую можно будет прикладывать к резюме и выебываться, но оно мне создало почему-то 2 папки (bin и obj), в которых кучи файлов в папках Debug. Но я не хочу Debug, я хочу PublishSingleFile. Где мое приложение и как его сделать в нормальном виде?
По адресу bin\Debug\net5.0\win-x64\publish
содержится пик 2, это мое приложение? Но почему оно в папке Debug и состоит из множество файлов? Что за кучи файлов по соседству с папкой publish? Как вообще этот файловый ад понимать? Почему минимальное приложение создало 649 (пик 3) файлов?
Допустим я вызываю typeof(int).Name. Как вместо Int32 получить int?
Вряд ли. Это же алиас и в рантайме, скорее всего, уже нету инфы, писал ты там инт или Инт32.
Посмотри ил код мне лень.
Ну или решение влоб - создай дикшинари со своими "общепринятыми"
Какой нахуй зумер. Я в профессии 7 лет. У нас вакансия в банке на джуна открывается раз в 2 года, блядь.
1. Performance паттерны - Spam<T>, Memory<T> - зачем, как и где? В прод лили такую хуету? Если да, то в каких местах и для чего? Примеры с Marshaling и Unmanagement кусками говна не интересны.
2. Что думаете за array of structs? У кого нибудь stackoverflow вылетало на этой хуйне? Поправьте, если не так - стэк распухает до тех пор, покуда живет контекст исполнения, т.к. если не использовать такого рода паттерны, хип покуда наполняется его чистит GC, что по вопросам стэка? Реально ли его вообще забить? Как стэк затригерить на SOF я так знаю, я про array of structs
Поделитесь опытом программирования на C# на маке. Это рабочий вариант, или только винда?
Пробовал читать Гриффитса, дак тот вообще может 10 страниц обсуждать применения null. На примеры тоже скупится. А ведь хороший пример мог бы заменить все это переливание из пустого в порожнее.
Может Прайса почитать? Но его тоже критикуют, что книга у него получилась не для профессионалов, да и новичкам не сильно подойдёт.
Дело не в вопсросах, а в том, чем я занят. За три года ни разу не пользовался структурами, может один раз массивами, это уже -2 правильных ответа. И вообще иногда кажется, что отвечать на вопросы для миддлов мне легче, чем для джунов.
А потом вижу код лида:
string BuildRequest(){
var s = "";
var str1 = "tag1:val1";
var str2 = "tag3:val2";
var str3 = "tag3:";
var str4 = "tag4:val4";
var str5 = "tag5:";
var str6 = "tag6:";
var str7 = "tag7:";
var str8 = "tag8:";
var str9 = "tag9:val9";
if( str1!= null)
{
s+=str1+";";
}
if( str2!= null )
{
s+=str2+";";
}
if( str3!= null )
{
s+=str1+";";
}
if( str4!= null )
{
s+=str4+";";
}
if( str5!= null)
{
s+=str5+";";
}
if( str6!= nul )
{
s+=str6+";";
}
if( str7!= null)
{
s+=str7+";"
}
if( str8!= null )
{
s+=str8+";";
}
if( str9!= null)
{
s+=str9+";";
}
return s;
}
И вот после этого мне как-то пофиг становится что тут про мой код говорят. Возникают совсем другие мысли, типа: БЕЖАТЬ!!!
А потом вижу код лида:
string BuildRequest(){
var s = "";
var str1 = "tag1:val1";
var str2 = "tag3:val2";
var str3 = "tag3:";
var str4 = "tag4:val4";
var str5 = "tag5:";
var str6 = "tag6:";
var str7 = "tag7:";
var str8 = "tag8:";
var str9 = "tag9:val9";
if( str1!= null)
{
s+=str1+";";
}
if( str2!= null )
{
s+=str2+";";
}
if( str3!= null )
{
s+=str1+";";
}
if( str4!= null )
{
s+=str4+";";
}
if( str5!= null)
{
s+=str5+";";
}
if( str6!= nul )
{
s+=str6+";";
}
if( str7!= null)
{
s+=str7+";"
}
if( str8!= null )
{
s+=str8+";";
}
if( str9!= null)
{
s+=str9+";";
}
return s;
}
И вот после этого мне как-то пофиг становится что тут про мой код говорят. Возникают совсем другие мысли, типа: БЕЖАТЬ!!!
Я про то и говорю, что те, кто залезли в ит раньше - говнокодеры, но чтобы их не вытеснили реально талантливые ребята, они придумали собесы, чтобы никого больше не пустить в ит.
Книги для кодеров всегда нужно воспринимать как справочник.
Писать код > читать про конструкции языка.
Це просто аксиома.
Сделай, допустим, ToDo-лист, очередной. Подумай, что тебе для этого нужно. Какие операции с ним ты хочешь делать добавить, удалить, отметить как выполненное. Выдели сущности задача. Какие структуры данных подойдут для решения список. Затем подумай над архитектурой приложения MVC. А книгу бери/гугли, когда не понимаешь что-то. Допустим, ты не знаешь как передать структуру в метод так, чтобы а - не создавать новую структуру; b - изменения в методе влияли на структуру которую ты передал в метод. Вот, ищешь это в книге/гугле. Применяешь, запоминаешь. И так вот пока не получишь готовый ToDo-лист.
Где-то тут или в бугурт треде была прохладная про то как нулячего дрота наняли чтоб он на собесах своей алгохуитой валил всех
Че это за хуйня? Оно же никогда не будет нулл, не? Может это какая-то автогенерируемая хуита?
Какая ЗП у тебя и лида, штоб понимать уровень организации?
>2106951
>2106952
аргументируйте
>Никогда на High load проектах не был?
Нет. Да и нахуй тебе твои спаны, если все равно, скорее всего, ботлнеком будут ИО операции.
> Может это какая-то автогенерируемая хуита?
Не
> Какая ЗП у тебя и лида, штоб понимать уровень организации?
У меня - 30к, у лида - 300к.
Ну, значит кестрел пишут дегроды. Там lock постоянно используется.
Судя по этому https://stackoverflow.com/questions/24262401/how-iis-server-worksthreading
ИИС сам по себе треды трогать не будет.
Рантайм уже заберет сколько надо, если одновременно и есть свободные треды в пуле, то да, нааверное 10, хз
- - - - - - - - -
public int X { get; } => Class.StaticMethod(A, B);
- - - - - - - - -
Свойство, доступное только для чтения, ... за что отвечает этот недокусок лямбды вконце?
Я понимаю, что в случае
int Prop => Func();
это просто сокращенная форма для
int Prop { get { return Func(); }; }
Но меня интересует пример, когда есть и скобки и этот кусок (нашел это в статье на хабре: https://habr.com/ru/post/338518/ (пятый по счету блок кода):
public int Number3 { get; } => MathFuncs.GetSumOf(Number1, Number2);
Не на МСДНе не в книжке подобного не встречал, поэтому и стало интересно - что это такое.
Ты мог просто посмотреть IL код и убедиться, что во всех случаях он одинаковый, даже не вникая в его суть.
Спасибо большое, я не заметил этот комент
И есть класс IndicatorProvider, в котором можно получать Indicator'ы. Можно получить полный список, можно получить фильтром по некоторым параметрам и ещё ряд специальных опций получения.
Соответственно, я хочу, что конструктор Indicator'а был доступен только IndicatorProvider'у, чтобы в IndicatorProvider'е создался необходимый набор Indicator'ов, и затем они могли быть получены только из IndicatorProvider'а, чтобы доступа к конструктору Indicator'а не было больше нигде в коде.
В С++ я мог бы легко это реализовать через friend class. Но как сделать в C#?
Я мог бы включить функционал IndicatorProvider'а в класс Indicator, но не хочу его загромождать, т.к. в IndicatorProvider'е далеко не один метод.
Я мог бы добавить исключение в конструктор Indicator'а, когда IndicatorProvider инициализирован, но это будет слишком криво обеспечивать, чтобы статический конструктор IndicatorProvider'а вызывался всегда строго раньше любого возможного вызова Indicator'а.
Я мог бы использовать рефлексию, но это слишком уродливо.
>Как наконей запомнить, нахрена нужны автосвойства?
Запоминать не надо. ПРОСТО юзаешь их для всех пабликов.
>Чем они лучше полей?
Дают возможность наговнокодить. Плюс ченджтрекеры для ебучих декстопов.
Собственно вопрос в чем. Какие есть нормальные способы, не переписывая кучу кода, как-то распределить нагрузку на один инстанс приложения? Я придумал - сделать две очереди обработки, собственно, этого пидораса прожерливого в очередь с низким приоритетом, которую обрабатывает 1 ядро, остальные - в очередь с высоким приоритетом и там все оставшиеся ядра. Но кажется хуйней какой-то. Типа, блин, во первых - потому что придется придумывать какой-то объект для ожидания завершения задачи в очереди, либо хуярить коллбеки как не в себя, во вторых - ну, не нравится мне что-то это решение, выглядит перемудренным, в третьих - сама ситуация когда разом 10к стучатся меньше чем за секунду - выглядит надуманной, да, я ее легко могу на своей пеке смоделировать, но в реальном проде как-то не верится что такое может быть, задержки же, вся хуйня, балансировщики, хуе-мое.
Хуй знает. Можно мидлвейр написать, который будет тротлить через тред слип рандомный или какой лучший способ, если более Н инстансов.
1) поставь лоад балансек перед сервером, сделай n инстансов. Поднимай новые инстансы если в очереди на обработку больше чем n * capacity запросов. Потом скалируй вниз, когда простаивать начинаешь
2) сделай worker pool, который может выполнять ограниченное кол-во запросов одновременно. Клиент при запросе получает handle, который он может потом поллить с вопросом "Ну чё, готово?"
Много еще что можно придумать.
>2) сделай worker pool, который может выполнять ограниченное кол-во запросов одновременно. Клиент при запросе получает handle, который он может потом поллить с вопросом "Ну чё, готово?"
Че за worker pool?
Бассейн с рабочими. Каждый рабочий умеет делать таску, но рабочих ограниченное количество. Когда рабочий выполняет таску - суёшь его обратно в бассейн
>Ну, я примерно так и думал, но мне говорят - сделай чтобы этот конкретный запрос не тормозил все, и времени тебе до вчера.
Тогда профайлер в руки и вперед.
ну ты и пидор
>Ну, дык я ужо. Ускорил и так обработку этого запроса раз в 20, сейчас на 10к - минута уходит, раньше уходил час.
Если всё уже обёрнуто в таски - можешь захуячить свой task scheduller, который умеет в обработку n количества CPU-bound запросов.
Они имеют только методы сравнения через оборачивание в object, а это ж медленно, и тогда какой смысл городить struct вместо class?
не могу документайшн таску на 30 мин сделать за неделю
Олсо, совсем они ф-ционал нонпремиум похерили, нихуя ниудобно (наверное так и надо). 140 баксов в год, ууу сука.
Не понимаю как делать узлы в которых еще будут узлы, к примеру структура будет
узел1 -> {подраздел1; должность1; подраздел->{должность2; должность3}}
Как такое организовать в БД? Не понимаю структуру таблиц.
Ну решение влоб: ParentNodeID + NodeType колонки. Ну или без типа, но две таблицы для должности и подразделения. Так наверное даже лучше бужет. В подразделении будет иерархия, в должности нет, но у тебя вроде бы много типов.. Ну и гугли чтото типа sql tree для запросов с with.
Решение со звездочкой- что то типа нестед сетов.
Решение хипсерское- графовые бд
Ну пишешь ты либу какую-то и не хочешь кишками светитт, только интерфейсами, вот и юзаешь. Потом еще в тестах френдли ебнул и тестишь даже кишки
CREATE TABLE Departments (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
ParentId INTEGER NULL,
Name TEXT NOT NULL,
FOREIGN KEY (ParentId) REFERENCES [Departments](Id)
);
CREATE TABLE Employees(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
DepartmentId INTEGER NULL,
Name TEXT NOT NULL,
FOREIGN KEY (DepartmentId) REFERENCES [Departments](Id)
);
Кстати, кто знает, напишите, насколько валидно вот это:
FOREIGN KEY (ParentId) REFERENCES [Departments](Id)
Т.е. ограничение forein key на эту же таблицу.
Или может этот как-то по другому делается?
Нормально.
Но у тебя таки по факту много типов нод. Директор, отдел и сектор тоже ноды. Для вашего завода и так сойдет. Но можно еще подумать. Например, саму иерархию хранить в одной таблице а уже сами велью (емплойи, департменты) в другой
Вместо текста нварчар(300) юзай.
Чтобы, например, не реализовывать сортировку для каждой коллекции по 100500 раз. Про struct и class вопрос не понял, должно быть пофиг struct или class для этих двух интерфейсов.
типа чтобы вместо var x = 1.0;
он бы написал double x = 1.0;
???
var-ы делают код нечитаемым. Но писать руками имена особенно с дженериками замотаешься.
Нашел как это в студии делать через рефакторинг, но что-то многовато кликов. Можно ли сделать одним сочетанием клавиш?
Есть какие-то рекомендации насчет целесообразности применения Linq? В Clean code про это естесственно ничего нет.
Давай примеры что у него на линке, а ты против.
Ну сделай перфоманс тесты и его линки, скорее всего, обосрутся, особенно пг памяти
Ctrl+W
ППХПХПРХАХАХАХАХАХПХПХАХАХАХ. Как же я проиграл на всю квартиру. Уже соседи по батареям хуярят.
Я в базе вот так сделал
NodeType
{
int id;
int? parentId;
string Name;
}
Node{
int id;
int typeId;
string Name;
}
А на уровне приложения уже плясал бы.
То что можно таким образом строить иерархию. Как-бы в том и суть. Родитель null - мы нашли корень. Если у нас в таблице несколько корней - мы можем сразу найти все корни и пройтись построив несколько деревьев. Допустим, у тебя логика такова, что есть фирма, она является корнем, у фирмы - есть филиалы, у филиалов - оффисы, в оффисах - отделы, в отделах - начальники, ну а у начальника - проекты, у проектов сабпроекты, ну а у каждого сабпроекта может быть еще один сабпроект до бесконечности и в конечном счете на каждом уровне относительно проектов - есть назначенные люди.
Вот тебе говорят: Анонов - сделай запрос чтобы можно было посмотреть все проекты такого-то хуя и назначенных на них людей в фирме. С тем что я выше описал это изи: находим вершину дерева и проходимся рекурсивно вниз. Как ты будешь определять корень без null - ну, разве что ссылается на самого себя, но это хуйня потому что для того чтобы такую сущность получить - тебе придется ебатеку устраивать на уровне базы, вместо того чтобы просто сделать parentId - null
Чому так? При запуске окна wpf оно открывается через жопу. В чем проблема?
Работаю в команде, где все одинакового уровня недомиддлы и кажется, что нихуя не развиваюсь.
Для начала попробуй полить системник святой водой, на рабочий стол поставить фото Гейтса и кактус перед монитором. Если не поможет, значит дело серьезное - придется искать светлого мага-программиста.
DI, как и весь SOLID и ООП, это искусственные барьеры для поднятия планки вката в IT и наебки работодателей. Бесполезные, увеличивающие объем кода, высосанные из пальца принципы. К сожалению, остается просто вызубрить. Необязательно понимать это все, пользуйся Autofac-ом.
https://www.c-sharpcorner.com/UploadFile/85ed7a/dependency-injection-in-C-Sharp/
там говорят что это пример реализации ДИ но нет, это полная хуйня, на втором пикриле пример кода который делает ТО ЖЕ САМОЕ но умещается в 10 строках и не создает спагетти код,
а теперь рассмотрим случай когда инжеция нужна, вот мне надо надо например передать класс Identity.UserManager будет ли это работать? НЕТ КОНЕЧНО потому что иди нахуй вот почему
то-есть реально хуйня без задачи, усложняет то что ты можешь написать, но когда нужно у него лапки блять, безполезнейшая хуйня которую я только видел в программировании
Не надо, у меня много лет опыта в программировании, просто ди это реально хуйня без задач, она не выполняет свою главную функцию, через нее нельзя передать нужные тебе зависимости.
опять таки я читал документацию по идентити и знаешь что там писало о передачи ваисимостей? НИХУЯ, а обычная реализация не работает, так каким образом они себе представляют использовании этой хуйни?
>не выполняет свою главную функцию
Главная функция - снижение связанности кода. Прекрасно выполняется.>>11775
>идентити и знаешь что там писало о передачи ваисимостей? НИХУЯ
А почему в доках по Identity должны писать про DI?
>обычная реализация не работает
У всех работает, а у тебя не работает. Угадай гле проблема.
>Главная функция - снижение связанности кода.
Я представил примеры двух реализаций, как видишь спагетти код именно там где используется идентити
>А почему в доках по Identity должны писать про DI?
потому что без ди идентити НЕ ВОЗМОЖНО использовать где либо за границами контроллера, тоесть есть например у меня контроллер который должен найти пользователя когда выполнилось какое-то условия например выстрелил хенгфаер, и что дальше? нулл рефернс или клонирование севрвиса и до свидания, весь этот фреймворк просто не имеет смысла без ди а он естественно не работет нихрена
>У всех работает, а у тебя не работает. Угадай гле проблема.
Да что ты говоришь маня, пруфов что это вообще в принципе может работать ты конечно же не приведешь
Спагетти код именно там где используется идентити -> DI
то-есть есть например у меня контроллер -> класс который
быстрофикс
>Я представил примеры двух реализаций
Ты представил какой-то хэлловорлд и на основании того, что там появилось несколько строк, делаешь выводы о ДИ. Охуено, че.
Остальной твой высер комментировать не буду. Конфигурируй все вручную, никакой магии в дефолтном сервиспровайдере нет.
>Ты представил какой-то хэлловорлд
>ЭТО ДРУГОЕ
>Остальной твой высер комментировать не буду
>ПУК СРЕНЬК НЕЧЕГО ОТВЕТИТЬ
Как бы с первых ответов было понятно что ты ничего в этмо не смыслишь и по этому ничего по делу ответить не сможешь, я только не понимаю нахуя ты вообще что-то предъявляешь если сам в этом 0
Хочет сениор реввью
0
Получил сениор ревью
0
юз табс интсефд оф спейсес
0
документ олл методс/пропс/классес лайк ГетЮзер - гетс юзерс
0
Ревьюрит раз в полугодие
0
Пока заревьюрил мастер ушел вперед
0
Мержешь с мастером
0
Полиси ту реверт апрувалс он коде чейндж
0
Жди еще пол года внимания его величества
>https://www.c-sharpcorner.com/UploadFile/85ed7a/dependency-injection-in-C-Sharp/
Atul Rawat хуйни не напишет. И код стайл прекрасен. И проперти инжекшн - бест практис.
В следующем выпуске от Atul Rawat - юзама сервиса локатор инстюд канстрюктар инжекшн евривиа
Ты же толстяк, признайся плиз? Найти насколько уебищную статью по ДИ это мастерство
> выстрелил хенгфаер
Ты сам себе в ногу выстрелил.
Хуею, если честно, я сам тупой додик, но аудитория тута это финиш какой-то
По ДИ, лучших примеров нет, на мсдн ВОДА лютая, ничего не понятно, никаких примеров, и даже то что есть не то что не работает, даже не компилируется, поэтому да, тот рафат он гений что вообще заставил это говно рабоать. про стак оверфлов я вообще молчу, там на секундочку советуют передавать зависимости в контролер и ВДУМАЙСЯ делать из менеджера ГЕТ запросы на контролер, что бы получить например имя из индентити.Ебана в рот это казино Депенденси инжекшин, такая хуня что просто от осознания того что что-то такое вообще существует в природе у меня руки трясутся.
>делать из менеджера ГЕТ запросы на контролер
Че? Кидай ссылку.
Чего ты вола ебешь? Поствь себе кор, юзай коробочный ДИ и не городи свои велосипеды в рамках учебы - хорошо, но походу ты слишком тупенький и/или пожилой для этого, что там н еработать-то может?
Че? Кидай ссылку.
Линка нет, но зуб даю что такое видел и сам лулзы ловил.
>Чего ты вола ебешь? Поствь себе кор, юзай коробочный ДИ и не городи
я так-то на коре 3.1
>что там н еработать-то может?
уже 1000 раз написал, вот еще раз
потому что на том примере индуса ГДЕ ОН САМ НАПИСАЛ ИМПЛЕМЕНТАЦИЮ все просто, но и ДИ если честно в таких случаях нахер не нужна давай посмотрим на ситуацию когда нам нужна зависимость именно потому что у нас нет собственной имплементации, и что тогда? ну вот смотри есть у нас идентити и вот смотри хочется мне получить какого-то пользователя при старте веба, не будет о том зачем надо, или что могу просто сделать запрос до базы, ну хочется мне сделать так как вот. на мсдн пишет что так можно и так делать круто стильно молодежно, ну ок. и смотри в трех скринах как все фейлиться если эту хуйню попытаться применить в Реальной жизни где нужны РЕАЛЬНЫЕ зависимости которые негде больше барть коме через ДИ, а не в самописных сферических маня-примерчиках в вакууме
пикрил один где я пытаюсь получить результат
пикрил2 где все фейлиться
пикрил 3 из за чего все фейлиться
Какой у тебя опыт, гнида? Ты зеленей водоросли. Ты даже не можешь прочитать, что тебе компилятор пишет. Еще блять регистрирует IAuthManager, а заинжектить хочет UserManager. Иди Шилдта читай, тебе до DI еще ползти и ползти.
Братик, ты в трех соснах заблудился.
В третьей пикче ты скобки забыл.
Во второй, зачем тебе testDi, ты наркоман?
В первой, ты нахуй инстанс вручную создаешь, совсем ебобо? В конструкторе контроллера IAuthManager принимай. Не забудь нормально зарегать в стартапе как IAuthManager , так и идентити говно это коробочное.
дай угадаю, ты до этого на каком-то легаси говне нулевых сидел?
>Ты даже не можешь прочитать, что тебе компилятор пишет. Еще блять регистрирует IAuthManager, а заинжектить хочет UserManager.
я прекрасно знаю что он хочет, проблема именно в том что мне нужен UserManager а могу только IAuthManager у которого нет UserManager смотри пикрил
Только с уставшим и давно не актуальным пропахшим нафталином массивом, который уже ни один API не возвращает?
Ты сейчас с кем разговаривал?
Пажилой пиценосец не может прочитать ошибки ((на русском)) в студии
0
Не может понять говнокод уровня хеловорда от уважаемого Atul Rawat
0
Говорит о ДИ и ИоК контейнере дотнетовском, но инстансы вручную создает
0
Читай Шилдта
0
Читай ИЛ код
0
Читай машинный код
0
Читай вибрации от дроселлей процессора и ССД
0
Читай Библию
0
Читай по губам
0
Маааам, а как срать синглтон сделоть? ((((
>В третьей пикче ты скобки забыл.
Речь шла о другом прочитай этот пост >>11989
>В первой, ты нахуй инстанс вручную создаешь, совсем ебобо? В конструкторе контроллера IAuthManager принимай. Не забудь нормально зарегать в стартапе как IAuthManager
а что мне толку от него, интерфейс не имеет имплементации которая должна быть в testDi который по идее должен наследовать нужный нам UserManager в котором такая имплементация есть
>дай угадаю, ты до этого на каком-то легаси говне нулевых сидел?
ну на вебформах, да
Ну так подключи services.AddIdentity(); или как там правильно, оно настроит и юзерманагера и все нужные зависимости (разве что еще EntityFramework как провайдера для хранилища надо отдельно подключать).
так он подключен, смотри пикрил, проблема именно в том что использовать его можно только в контролерах. а когда хочу юзать в своем классе оно не работает и в общем вся идея что бы нужный класс получил в конструктор зарегистрированный интерфейс который имплементирует класс, который наследует нужную нам зависимость я знаю как это по дебильном звучит, но бля со стороны выглядит что именно так это типа доожно было работать, естественно это нихуя не работает
> использовать его можно только в контролерах
От того что ты это повторяешь, правдой это не станет.
>так он подключен
Хорошо, а ты AuthManager откуда берется, когда там налл в конструктор приходит?
потому что я делаю так, так программа хотя бы стартует, иначе у меня ошибка компиляции и программа даже не заводится а дебажить как-то надо
Божечки, как всё плохо. Ну так если ты передаешь в конструктор налл, то почему ты ожидаешь что-то другое там? И причем тут встроенная система DI, если ты создаешь класс вручную?
>ну на вебформах, да
Из увожения к инвалидам помогу тебе в твоей проблеме.
Удоляй нахуй testDi.
Убеждаешься, что идентити у тебя настроен, смотришь чтоб в стартапе было что-то типа
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
Добавляешь в стартап как тут >>11952 на третьей пикчи.
В контроллере в КОНСТРУКТУРЕ принимай IAuthManager. Не надо никаких нью. Его и юзай
>Удоляй нахуй testDi.
Удалил
>Убеждаешься, что идентити у тебя настроен, смотришь чтоб в стартапе было что-то типа ...
ну есть такое пик 1
>Добавляешь в стартап как тут 2111952 (You) на третьей пикчи.
Добавлено, пикрил 2
>В контроллере в КОНСТРУКТУРЕ принимай IAuthManager. Не надо никаких нью. Его и юзай
Ты троллишь? я же говорил, вот в контролере все отлично работает. мне нужно что бы работало в моем AuthManager
>Ну так если ты передаешь в конструктор налл, то почему ты ожидаешь что-то другое там?
конечно когда я передаю налл я, ожидаю что там будет налл. я передаю что бы программа хотя бы запустилась и я мог посмотреть что происходит в других местах
> если ты создаешь класс вручную?
Это как так? Не понимаю о чем ты
Кредит помощи инвалидам: 3
Использовано: 1
Остаток: 2
Если ты используешь зависимости в твоем AuthManager, то и его инстанс надо создавать используя IoC container (в твоем случае дефолтный коровский).
Тебе надо где-то инстанцинировать AuthManager окромя веб контроллеров?
>Тебе надо где-то инстанцинировать AuthManager окромя веб контроллеров?
Конечно, ведь вся суть Ди заключается именно в том что настроитв зависимость один раз его можно использовать где тебе надо, то-есть везде где я вызову метод из AuthManager, в данном случае в мейне
>Это как так? Не понимаю о чем ты
Если ты через new сам руками создаешь класс, DI (для простоты буду называть так всю инфраструктуру с этим связанную) никак тут не задействована.
>работало в моем AuthManager
А AuthManager ты где используешь? Если это несвязно с запросом, то тебе надо вручную из сервисМанагера тянуть нужный сервис через GetService<T>.
> в данном случае в мейне
Ебаный стыд, а сразу нельзя было сказать. Гугли как сконфигурировать сервисы до того как стартанет вебсервер и тащи через GetService<UserManager>.
>Если ты через new сам руками создаешь класс, DI (для простоты буду называть так всю инфраструктуру с этим связанную) никак тут не задействована.
не понимаю каким образом можно использовать класс не создавая его
А AuthManager ты где используешь? Если это несвязно с запросом, то тебе надо вручную из сервисМанагера тянуть нужный сервис через GetService<T>.
Здесь >>12056 то-есть в мейне, но в общем не важно я хотел бы этот менеджер использовать где-угодно, ну согласись делать гет запрос на контролер это костыль костилей, я не верю что это нельзя сделать нормально
>ведь вся суть Ди заключается
Еще раз - суть DI в ослаблении связанности. Научись различать DI, DIP, IoC
>>12063
>использовать класс не создавая его
Делегировать создание классов и разруливание зависимостей IoC контейнеру.
>я хотел бы этот менеджер использовать где-угодно
А где это угодно-то? У тебя это угодно есть либо до старта сервера (уже написал выше про это), либо во время работы сервера (а там по сути цикл запрос-ответ. а запрос идет через мидлвари, в которых DI отлично работает).
>Делегировать создание классов и разруливание зависимостей IoC контейнеру.
>А где это угодно-то? У тебя это угодно есть либо до старта сервера (уже написал выше про это), либо во время работы сервера (а там по сути цикл запрос-ответ.
Ну я хотел бы как использовать как до старта так и после, ну то-есть хотел бы инициализировать и позже уже работать по запрос-ответ
например в данном случае мне хотелосы бы проверить есть ли админ, если нет создать, а дальше работать как обычно как любой другой менеджер вызывая статические методы
автофак IoC контейнер, можешь использовать его вместо дефолтного майкрософтовский сервисМанагер. Если ты думаешь что будет принципиальная разница, и автофак магическим образом будет менять твои наллы на реализации интерфейсов, то нет. Разница в деталях.
>>12073
>проверить есть ли админ, если нет создать
А почему нельзя сразу задать нормальный вопрос, а не влетать в тред с криком а-ля "вы все дебилы понапридумывали неработающей херни ряяяяяяя"?
Читай:
https://dotnetthoughts.net/seed-database-in-aspnet-core
>так и после
насчет после не знаю, возможно там уже будет задиспозено все что можно. Не пробовал.
>>12074
Почти. CusomDataSurceStorage тоже зарегистрируй в IoC, и дальше serviceProvider.GetService<CusomDataSurceStorage>()
>проверить есть ли админ, если нет создать
Я это ЧИСТО для примера сказал, у меня уже есть такая проверка, она мне не нужна, мне нужно решить это именно так как об этом пишут на мсдн. что мол все офигено, бери класс, там будут все зависимости и тп, а когда пробую создать и сделать у меня не получается
Почти. CusomDataSurceStorage тоже зарегистрируй в IoC, и дальше serviceProvider.GetService<CusomDataSurceStorage>()
у меня же нет доступа до serviceProvider в мейне, как мне тогда получить Identity.UserManager и передать его в AuthManager который я создаю в мейне перед стартом вебСервера?
>Почти. CusomDataSurceStorage тоже зарегистрируй в IoC, и дальше serviceProvider.GetService<CusomDataSurceStorage>()
у меня же нет доступа до serviceProvider в мейне, как мне тогда получить Identity.UserManager и передать его в AuthManager который я создаю в мейне перед стартом вебСервера?
>>12075
Да. Читай https://docs.microsoft.com/ru-ru/dotnet/core/extensions/dependency-injection-usage
Пойми ты как оно работает в принципе, что бы создавались инстансы, кто-то их должен их создавать. Так вот, когда ты просто в конструкторе ожидаешь зависимости, ане создаешь их внутри класса - это уже DI (подкласс/реализация IoC).
Дабы не охуеть в екшене/мейне, создавая инстансы для передачи в конструкторы, используют IoC container. В твоем случае - коровский. Вот он и должен знать куда и как что пихать. IoC container не пропихнет зависимости в твой обьект волшебным образом, ты должен предоставить ему конфигурацию (твой стартап с аддСкопед) и создавать инстансы через него в явном (serviceProider.GetService - "service locator" pattern) или неявном, как за тебя делает аспнетовский контроллер (он же aggregation root в контесте IoC container-а) или как в магических пропертиинджекшн автофака, или через вивер какой-то (походу ты такой долбоеб, что они тебе понравятся) .
Так вот, не создаешь обьекты внутри сервисных классов (менеджер твой), а ожидаешь их в кострукторе или параметрах методов - красавчик у тебя есть DI.
Дальше ебись как хочешь, но для нелюбителей грызть катус есть IoC container-ы., они тебе помогут, если ты их настроишь и будешь использовать. Большинство из них универсальны, но ты обосрался из-за того, что фсп.нет за тебя много работы сделал, подставля их "магическим" образом в контроллеры и ты как каргокультист стал ожидать такого же поведения от консольки.
Все, теперь иди нахуй плиз. Ты заебал.
Ты тоже.
Такое пробовал?
https://stackoverflow.com/questions/8902674/manually-map-column-names-with-class-properties
>у меня же нет доступа до serviceProvider
Я же тебе скинул ссылку как получить serviceProvider до запуска host.Run(). Первая часть статьи для Core 1, вторая для Core 2 и выше. Или тебе похуй и я должен придти к тебе и написать код? Заливай на гитхаб, напишу.
>получить Identity.UserManager и передать его
Да ты задрал. Тебе не надо ничего передавать. тебе надо зарегистрировать все классы и интерфейсы, которые ты хочешь использовать. IoC сам подставит в конструкторы нужные классы.
Селффикс:
>(он же aggregation root в контесте IoC container-а)
иеется ввиду стартап. Что-то не туда написал.
Давай игнорировать этого пажилого инвалида, братик. Свою порцию внимания он получил.
Видел, да. Но это с каждым полем придется сну-сну, я думал может есть какие настройки для нэйминг конвеншн.
Не надо, я же не вниманиеБлядь, я искренние хочу разобраться и вырваться уже с этих вебформсов, а тут сразу такая засада
Бля, ну там все равно в ColumnAttributeTypeMapper рефлексия дрочится. У тебя там и имя типа и поля будет - вот и сложи 1+1.
>aggregation root
Вроде обычно composition root называют. Хотя тот чел все равно гуглить и читать не станет.
>Давай игнорировать этого пажилого инвалида
Как говорится, старую собаку новым трюкам не научишь.
Да, композишн рут, у меня самого башка сейчас как желе.
Сидеть до 2к2дека1 на вебформсах это боль.
>>12122
+
так вот же они https://github.com/henkmollema/Dapper-FluentMap#convention-based-mapping
Либа под митом, вроде бы живая - юзай. Или вырви реализацию
Я сам с дапером давно не работал, гуглю тупо
Спс, гляну.
А ты в базах шаришь? У меня весь гемор из-за того, что я не могу из хранимки вернуть сджойненые таблицы, в которых есть одинаковые имена колонок во тут спрашивал >>2111625 →
Извини Братек, но я не понимаю, я был бы очень благодарен если бы ты написал как надо и тыкнул пальчиком куда смотреть вот репозиторий
https://github.com/stasmalinovskij/DITest
там в общем ничего особенного просто темплейт с Индентити и тем самым менеджером
>увеличивающие объем кода
Тут-то ты и обосрался.
Без DI у тебя будет миллион факторий, триллион билдеров и дохуилиярд статики с классическими синглтонами.
Серьезно, няша. DI позволяет смотреть на класс как изолированный компонент и даниматься именно им, не думая о том что вокруг происходит. Твой класс должен что-то делать и делать хорошо. Без DI у тебя внезапно начинаются прокидываться служебные штуки, чтобы их не прокидывать ты хуячишь статику, и так все глубже и глубже в пучину говнокода, а в конечном истоге - неподдерживаемый кусок говна, в котором чтобы маленькое изменение сделать - месяц работы 10 программистов нужно выделять.
Няша. Я как-бы не первый год в разработке и видел времена, когда костылили как могли.
Я уже написал, в чем суть. С DI ты воспринимаешь класс как компонент. Тебя мало ебет что там вокруг происходит, у него есть одна ответственность, обычно один-два метода и погнали. Без DI - среднестатистический код выглядит как полотнище на 2-3к строк, с вложенными классами, дерганием отовсюду статики, служебной хуйней по прокидыванию зависимостей. А если нет - то это и есть DI просто самописный и который говно.
Попробуй прокидывать сразу значение вместо зависимости.
Объясните пожалуйста как работает вот такой синтаксис.
Мне не понятно что вообще тут делает =>
На первой пикче в метод Map передали два параметра: строка и лямбда.
На второй пикче в метод Run передали один параметр: асинхронная лямбда.
Лямбда - это функция в виде переменной.
А. спасибо, анонче
Только сейчас увидел в конце скобки }); Сначала относился к этому как к какому то телу функции Map
Спасибо ещё раз, отличное объяснение что такое лямбды кстатей
ООП головного мозга. Никогда не понимал почему не юзать статику, когда методам никакого ООП не нужно. И всегда впадаю в ступор, когда вижу код типа:
new ClassA().Get(id)
когда простая статика выглядит более лаконично и чище.
Главное чтобы все было разделено модульно и не смешивалось в кучу.
>Я как-бы не первый год в разработке
Ты давно в разработке, да, это видно, наверно и F# с ФП никогда не трогал - слишком стар уже? Ничего, скоро на пенсию.
тема: Linq groupBy
inb4: > аряяяя я пишу на шарпе из под линукса ну мааамм
>Никогда не понимал почему не юзать статику
Как ты статику мокать собрался? Или ты такой умный и нахуй тесты? Или чтобы проверить что запрос возвращает то что нужно - будешь все базу разворачивать и пусть тесты по полдня гоняются?
И вообще, эти офигительные истории про модульную статику всегда, блядь, приводят к граблям, которые оч больно в будущем ебнуть могут. Да блядь, хрестоматийный пример из моей ранней работы. Проект, люди до - хуйнули свое логгирование в SQLite, написали свой асинхронный логгер, с очередями, все по уму на самом деле. Работало, дергали лог в виде Log.Critical("Message"). В итоге - 5 лет разработки, пора переносить в облако, это говно - дергается отовсюду, лог на серваке сожрал 10 гигов стораджа(ой, не предусмотрели возможность задать уровни, чтобы можно было не логгировать trace и debug, ай-ай-ай, до облака - отдельное приложение следило за файлом лога и когда раздувалось - удаляли), охуенно, клиент кричит, логгирование все еще нужно и просто полезть и закомментить лог - нельзя, все нормальные люди - вынесли логер в интерфейс и можно было прокинуть логгирование какое хош, но нет, тут была статика, везде она дергалась, на перепиливание кода ушел почти месяц, клиент сыпал хуями, благо альтернатив у него не было. Обернули бы эту статику хотя бы в интерфейс - одной строчкой бы проблема решалась при конфигурировании хоста, но зачем, правда же, статика эт ж охуенно, какие проблемы оно в будующем вызвать-то может.
>когда простая статика выглядит более лаконично и чище.
Уже написал про удобство поддержки. То что оно выглядит лаконично, ок, хорошо. Вот тебе нужно чтобы перед записью в базу, когда луна восходящая, а меркурий в водолее - ты слал бы сущность для подтверждения микросервису который должен ответить - можно или нельзя сохранять. Требование появилось за два дня перед дедлайном и вы не предусмотрели. Со статикой - ты будешь вынужден ебнуть вилку, а мог бы как человек - сделать классическую стратегию и все бы решалось щелчком пальцев, простым добавлением нового условия. Но ведь лучше ебнуть ветку или лямбду передать, чтобы потом хуй кто разобрался, кроме шиза, который это писал и на проекте с самого старта.
И про ФП. Да, пробовал скалу, пробовал хацкель, пробовал F#. Весело, как опыт. Но что-то большое чисто на ФП в жизни писать не стану. Достаточно просто взглянуть на репки "реальных" проектов, когда пытаются на тырпрайз натянуть ФП, а потом гордо тыкают в грудь, что какие мы молодцы, никто кроме нас это говно поддержать не может, а клиент - жрет кактус и вынужден вам платить, потому что тупенький был когда ему продавали и повелся на истории про то что меньше строк кода -> быстрее разработка.
>Никогда не понимал почему не юзать статику
Как ты статику мокать собрался? Или ты такой умный и нахуй тесты? Или чтобы проверить что запрос возвращает то что нужно - будешь все базу разворачивать и пусть тесты по полдня гоняются?
И вообще, эти офигительные истории про модульную статику всегда, блядь, приводят к граблям, которые оч больно в будущем ебнуть могут. Да блядь, хрестоматийный пример из моей ранней работы. Проект, люди до - хуйнули свое логгирование в SQLite, написали свой асинхронный логгер, с очередями, все по уму на самом деле. Работало, дергали лог в виде Log.Critical("Message"). В итоге - 5 лет разработки, пора переносить в облако, это говно - дергается отовсюду, лог на серваке сожрал 10 гигов стораджа(ой, не предусмотрели возможность задать уровни, чтобы можно было не логгировать trace и debug, ай-ай-ай, до облака - отдельное приложение следило за файлом лога и когда раздувалось - удаляли), охуенно, клиент кричит, логгирование все еще нужно и просто полезть и закомментить лог - нельзя, все нормальные люди - вынесли логер в интерфейс и можно было прокинуть логгирование какое хош, но нет, тут была статика, везде она дергалась, на перепиливание кода ушел почти месяц, клиент сыпал хуями, благо альтернатив у него не было. Обернули бы эту статику хотя бы в интерфейс - одной строчкой бы проблема решалась при конфигурировании хоста, но зачем, правда же, статика эт ж охуенно, какие проблемы оно в будующем вызвать-то может.
>когда простая статика выглядит более лаконично и чище.
Уже написал про удобство поддержки. То что оно выглядит лаконично, ок, хорошо. Вот тебе нужно чтобы перед записью в базу, когда луна восходящая, а меркурий в водолее - ты слал бы сущность для подтверждения микросервису который должен ответить - можно или нельзя сохранять. Требование появилось за два дня перед дедлайном и вы не предусмотрели. Со статикой - ты будешь вынужден ебнуть вилку, а мог бы как человек - сделать классическую стратегию и все бы решалось щелчком пальцев, простым добавлением нового условия. Но ведь лучше ебнуть ветку или лямбду передать, чтобы потом хуй кто разобрался, кроме шиза, который это писал и на проекте с самого старта.
И про ФП. Да, пробовал скалу, пробовал хацкель, пробовал F#. Весело, как опыт. Но что-то большое чисто на ФП в жизни писать не стану. Достаточно просто взглянуть на репки "реальных" проектов, когда пытаются на тырпрайз натянуть ФП, а потом гордо тыкают в грудь, что какие мы молодцы, никто кроме нас это говно поддержать не может, а клиент - жрет кактус и вынужден вам платить, потому что тупенький был когда ему продавали и повелся на истории про то что меньше строк кода -> быстрее разработка.
Ну, по уму в контексте - лог вообще не тормозит работу самого приложения. В те времена тот же NLog при работе с базой - пиздец как тормозил.
Но да, вот так вот, не догадались, те кто делал, сразу что нужно уметь отключать уровни, не догадались что может быть нужно будет не в базу логгировать а отправлять другому микросервису или сервису, много о чем не догодались и заметить на этапе отладки и тестирования было сложно, потому что: ну работает, вроде за месяц работы не особо-то раздулось и т.д., а нужно еще и основную функциональность пилить.
Потому что тебе попалась хуевая статика - теперь у тебя травма и ты пихаешь ООП во все щели. Я же ничего против классов, интерфейсов и так далее, не имею, просто не нужно делать overengineering там где он не нужен. Для логгинга я бы не стал юзать статику.
>записью в базу, когда луна восходящая, а меркурий в водолее
В функциональщине прокидывают зависимость в самый последний момент, в контроллере, чтобы бизнес-уровень не зависел от внешнего мира. Или не прокидывают зависимость вовсе, просто передав значение функции где-то по дороге. Все правила бизнес правила инкапсулируются, чтобы не было дублирования и чтобы не захламлять основной код.
>простым добавлением нового условия
Это не простое добавление условия:
1. Твой код превращается в лапшу с каждым ифом, такое обычно разбивают на машину состояний.
2. Приходится покрывать код логами на всех слоях. Мало того, что код выполняет несколько ответственностей, следит за коннекшеном к базе данных и исполняет бизнес процессы, так и модульные тесты это пиздец усложняет, еще и интеграционные тесты могут попросить на это написать. Создать мок, потом нагородить инфраструктуру моков, только чтобы у зависимости вызвать метод.
3. Так с таким подходом еще непонятно какие исключения бросаются. Из-за того, что доступ к базе данных размазан по всему бизнес слою, надо постоянно помнить, какие исключение умеет кидать база данных или тот же логгер.
4. В разы легче покрыть тестами простую функцию без сайд эффектов, доступа к базе данных, логгирования и непредсказуемых исключений. В разы проще написать тестирование на основе свойств, чем классическое менее эффективное тестирование.
Лог тормозит работу, особенно если надо что-то тяжелое в дебаге писать, особенно если это структурные логи с сериализацией объектов. Я уже писал об этом, в .NET 6 хотят сделать ленивый провайдер генерации строк, чтобы решить эту проблему.
>логи с сериализацией объектов
>код настолько хуево написано что без логгирования каждого чиха и объкта не разобрать что происходит
>без логгирования каждого чиха
С чего ты решил, что логгируется каждый чих?
Ситуация: пишется аналитика, в дебаге надо измерить производительность всех запросов, тест не один - нужен контекст теста для анализа производительности, на проде этот лог нахрен не нужен.
Другая ситуация: нужен аудит действий пользователя, чтобы понять, что делал тенант. Нужно знать действие и результат действия. Кишки покрывают тесты.
Все норм. Надо было в конце ToList() указать.
Но у меня есть вопрос
Мне надо сделать пять одинаковых, простых микросервисов, я не хочу ебатыся и делать их отдельными классами, а только одним и чтобы этот класс работал с разными ссылками типа http://abc/001 http://abc/002 http://abc/003, писал через общий репо в разные таблицы в БД
Такое вообще возможно? И как это сделать?
Че ты за хуйню несешь.
Микросервис, в классическом понимании. Это отдельное приложения, который, обычно, работает со своей базой и делает какую-то одну простую задачу и в идеале ничего о других микросервисах не знает, общаясь. если нужно через какой-нибудь евент-бас или с помощью апи. Все.
Если тебе нужно запустить пять инстансов одного и того же микросервиса - ты так и делаешь. При чем тут классы - я вообще не понял. В рамках микросервиса у тебя вообще может не быть каких-то классов, кроме Program, и то если мы про шарп говорим.
Про разные ссылки - это вопрос развертывания, ты вообще можешь развернуть за проксей и балансировщиком и у тебя по одном и тому же урл будут 100 инстансов роутиться и запускаться новые инстансы в зависимости от нагрузки.
Я к чему. К тому что сформируй вопрос нормально, что тебе вообще надо.
Я полный новичок, я знаю, что над классом используется вот такая запись как на картинке и по ней идёт обращение, но как сделать их несколько для одного класса или как сделать некий список из этих ссылок, я не знаю
>>12838
Очень сложно, потому что у тебя уровень понимания выше.
Попробую раздробить
Итак, часть первая
Я хочу сделать один контроллер, типа шаблона что ли, который будет использоваться по пяти разным ссылкам, как если бы я написал пять отдельных контроллеров с пятью разными ссылками.
Ближайший аналог это шаблон класса, создаётся массив из пяти таких классов, но каждый из классов используется для своей задачи
Как смог объяснил
>как сделать их несколько для одного класса
Зачем? У контроллера атрибут задает только часть пути. Ничего не мешает или создать другой контроллер, или развернуть несколько раз приложение на разных ссылках (не трогая C# код вообще). Коннекшен к базе данных можно в конфигурационный файл запихнуть или еще куда.
О, вот это уже похоже на то, что мне нужно.
Суть дерьма, что я делаю, есть пять разных ссылок, есть пять абсолютно одинаковых сонтроллера, и пять разных таблиц, куда они пишут данные. Я хочу сократить пять блядских сонтроллера до одного и твой ответ то, что нужно.
Но тогда вопросы!
Где мне ссылки прописывать? Ибо обычно это дерьмо в файле на картинке
И где, как мне прописывать подключение к базе? Обычно это просто строка и некий путь к таблице.
А, и как мне пять версий сервиса запускать с разными ссылками?
>Где мне ссылки прописывать?
>как мне пять версий сервиса запускать с разными ссылками?
iis, nginx или apache, есть еще другие опции, зависит от того, куда деплоить и есть ли лоад балансер. На пикче сеттинги для ide, а не для деплоя.
Меня смущает слово деплоить, к сожалению, я нихера не понимаю, что это такое, точнее забыл.
> и есть ли лоад балансер
Та же история, нихера не понимаю, но очевидно, что нет.
Как работает программа, она собирает данные с текущего ПК по адресу localhost, ну и порт там, а дальше уже сам собственно сонтроллер, далее, собрав это демо, оно пишет полученное значение и время получения этого значения в таблицу БД, похрен постгре или мсскл.
Но уже становится понятнее и понятнее.
А можно ли сделать два уровня, типа дерева, на C# - есть прога со ссылками и куда писать и она же запускает пять раз этот блядский сервис, передавая ему данные, ну, как например через соснольку через пробел досовское приложение на С или С++? Ну а далее оно там само ебошит.
>Меня смущает слово деплоить, к сожалению, я нихера не понимаю, что это такое, точнее забыл.
В Visual Studio это называется publish. Чтобы сделать publish, тебе надо создать publish profile с нужными параметрами или написать свой кастомный скрипт.
Объясню на примере с IIS:
1. Для запуска сайта исходники сайта не нужны. Нужно то, что получается после компиляции + статические файлы. Publish - позволяет отделить исходники от файлов сайта. Поэтому, первым делом делаем publish в нужное место, в папку скажем. Так же можно создать 5 разных конфигурационных файлов и по суффиксу брать только один нужный во время publish.
2. Делаем 5 раз publish в 5 разных папок.
3. Заходим в IIS и создаем сайт с любым названием. В биндингах прописываем начало ссылка.
4. Создаем 5 приложений у сайта и указываем 5 заранее подготовленных папок. В биндингах для каждого приложения 5 раз прописываем часть пути, которая будет добавляться к ссылке всего сайта.
Для обновления приложения достаточно:
1. Остановить весь сайт
2. Удалить содержимое папок для 5 приложений
3. Сделать снова 5 раз publish
4. Запустить сайт
>Суть дерьма, что я делаю, есть пять разных ссылок, есть пять абсолютно одинаковых сонтроллера
Почему ты просто не сделаешь дженерик-контроллер? Методы в базовом классе - виртуальные, чтобы если нужно было - мог переопределить.
>Та же история, нихера не понимаю, но очевидно, что нет.
Касательно лоад балансера. Эта задача может быть еще решена через лоад балансер. Все пользователи идут на ссылку лоад балансера, а лоад балансер разбирает ссылку и перенаправляет траффик на нужный сервер. Так как нужно анализировать ссылку, то это лоад балансер 7 уровня - HTTP.
Подумаю, в моём случае хоть HTTP и используется, но сайта нет, просто выставленно в настройках, что он открывает страницу по такому то адресу и ничего не выдаёт, только если например postman обращаться по конкретному методу. То есть сонтроллеры максимально простые, просто очень простые и работаю фактически в фоне записывая данные текущего ПК в таблицу в БД.
>>12916
Потому что не понимаю как это использовать. Конкретно не могу состыковать понятие ссылка, что болтается над реализацией контроллера с шаблонным контроллером, который по идее должен быть способен ответить на пять разных путей.
Как использовать обычные шаблоны в языках мне понятно, но в сервисах я нигде не вижу явного объявления вызова контроллера, поэтому непонятно.
>>12928
А вот это уже больше понятно. Но, надо использовать готовое решение или свой велосипед писать для этого? Типа string разбирать на куски и искать нужное.
>А можно ли сделать два уровня, типа дерева, на C#
Можно, поздравляю, ты изобрел свой костыльный лоад балансер.
А запуск на разных ядрах-потоках это async или сама ОС позаботится для разных запущенных сервисов?
Так я ж не знаю как ты собрался этот сервис запускать. Звучит, как будто ты хочешь прогой запустить другую прогу. Тогда это вообще два разных процесса - очевидно два разных потока.
> Звучит, как будто ты хочешь прогой запустить другую прогу
Да, с передачей ссылки и пути к таблице с сохранением в БД
Если такое вообще возможно и главное, верно ли так делать в 2021.
>верно ли так делать в 2021
Зависит от требований. Если тебе все равно как, сделай несколько вариантов решения и сравни плюсы и минусы.
Понял, благодарю за разъяснения.
>в моём случае хоть HTTP и используется, но сайта нет
У тебя на пикче Api контроллеры - это тоже сайт, хоть у него и нет html страниц.
>Но, надо использовать готовое решение или свой велосипед писать для этого?
Можно свое написать, можно использовать готовое. Зависит от того, куда это деплоить будут и сколько бабок готовы башлять. Например у амазона есть уже готовый Application Load Balancer, где можно через правила сделать то, что ты хочешь, но он стоит бабок и не малых.
На данный момент это скорее пример для себя чтобы научится
Получится один супер метод у контроллера с гигантским свичом внутри, где на основе входящих частей ссылки будет выбираться нужное поведение.
Понятно, значит один сервис, запускаемый несколько раз лучший для меня вариант, что неудивительно, ведь он соответствует принципу декомпозиции.
context.Foos.OrderBy(...).Take(3).Select(f => new {...})
порядок анонимных типов будет такой же как и у отсортированных Foos?
Вот это LINQ?
var selectedUsers = from user in users
where user.Age > 25
select user;
А вот это метод расширения?
var selectedUsers = users.Where(u=> u.Age > 25);
В чем профит LINQ ?
Как помне он пиздец не читаемо выглядит.
Я всегда пишу методом расширения.
Тащемта я думал что users.Where(u=> u.Age > 25) это и есть linq лол.
ну бля этож пиздец удобно.
Это копия, сохраненная 1 августа 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.