ch
Feedback
Библиотека шарписта | C#, F#, .NET, ASP.NET

Библиотека шарписта | C#, F#, .NET, ASP.NET

前往频道在 Telegram

Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

显示更多

📈 Telegram 频道 Библиотека шарписта | C#, F#, .NET, ASP.NET 的分析概览

频道 Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 21 699 名订阅者,在 技术与应用 类别中位列第 5 999,并在 俄罗斯 地区排名第 30 489

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 21 699 名订阅者。

根据 25 八月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -51,过去 24 小时变化为 -8,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 15.91%。内容发布后 24 小时内通常能获得 7.77% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 3 451 次浏览,首日通常累积 1 686 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 25
  • 主题关注点: 内容集中在 .net, шарписта, навигация, await, string 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead

凭借高频更新(最新数据采集于 26 八月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

21 699
订阅者
-824 小时
-267
-5130
吸引订阅者
八月 '26
八月 '26
+78
在1个频道中
七月 '26
+110
在1个频道中
Get PRO
六月 '26
+122
在1个频道中
Get PRO
五月 '26
+181
在1个频道中
Get PRO
四月 '26
+150
在0个频道中
Get PRO
三月 '26
+120
在0个频道中
Get PRO
二月 '26
+169
在1个频道中
Get PRO
一月 '26
+184
在2个频道中
Get PRO
十二月 '25
+126
在1个频道中
Get PRO
十一月 '25
+166
在1个频道中
Get PRO
十月 '25
+163
在1个频道中
Get PRO
九月 '25
+140
在1个频道中
Get PRO
八月 '25
+137
在4个频道中
Get PRO
七月 '25
+144
在1个频道中
Get PRO
六月 '25
+179
在0个频道中
Get PRO
五月 '25
+171
在3个频道中
Get PRO
四月 '25
+244
在15个频道中
Get PRO
三月 '25
+360
在52个频道中
Get PRO
二月 '25
+325
在48个频道中
Get PRO
一月 '25
+264
在35个频道中
Get PRO
十二月 '24
+348
在35个频道中
Get PRO
十一月 '24
+325
在37个频道中
Get PRO
十月 '24
+338
在35个频道中
Get PRO
九月 '24
+324
在36个频道中
Get PRO
八月 '24
+317
在35个频道中
Get PRO
七月 '24
+335
在36个频道中
Get PRO
六月 '24
+298
在31个频道中
Get PRO
五月 '24
+466
在36个频道中
Get PRO
四月 '24
+519
在38个频道中
Get PRO
三月 '24
+542
在31个频道中
Get PRO
二月 '24
+587
在30个频道中
Get PRO
一月 '24
+674
在25个频道中
Get PRO
十二月 '23
+785
在34个频道中
Get PRO
十一月 '23
+439
在4个频道中
Get PRO
十月 '23
+606
在24个频道中
Get PRO
九月 '23
+812
在0个频道中
Get PRO
八月 '23
+639
在0个频道中
Get PRO
七月 '23
+573
在0个频道中
Get PRO
六月 '23
+410
在0个频道中
Get PRO
五月 '23
+572
在0个频道中
Get PRO
四月 '23
+405
在0个频道中
Get PRO
三月 '23
+892
在0个频道中
Get PRO
二月 '23
+365
在0个频道中
Get PRO
一月 '23
+407
在0个频道中
Get PRO
十二月 '22
+409
在0个频道中
Get PRO
十一月 '22
+571
在0个频道中
Get PRO
十月 '22
+356
在0个频道中
Get PRO
九月 '22
+398
在0个频道中
Get PRO
八月 '22
+503
在0个频道中
Get PRO
七月 '22
+541
在0个频道中
Get PRO
六月 '22
+584
在0个频道中
Get PRO
五月 '22
+290
在0个频道中
Get PRO
四月 '22
+339
在0个频道中
Get PRO
三月 '22
+451
在0个频道中
Get PRO
二月 '22
+233
在0个频道中
Get PRO
一月 '22
+308
在0个频道中
Get PRO
十二月 '21
+356
在0个频道中
Get PRO
十一月 '21
+359
在0个频道中
Get PRO
十月 '21
+405
在0个频道中
Get PRO
九月 '21
+398
在0个频道中
Get PRO
八月 '21
+400
在0个频道中
Get PRO
七月 '21
+397
在0个频道中
Get PRO
六月 '21
+311
在0个频道中
Get PRO
五月 '21
+479
在0个频道中
Get PRO
四月 '21
+480
在0个频道中
Get PRO
三月 '21
+487
在0个频道中
Get PRO
二月 '21
+521
在0个频道中
Get PRO
一月 '21
+374
在0个频道中
Get PRO
十二月 '20
+11 455
在0个频道中
日期
订阅者增长
提及
频道
26 八月+6
25 八月0
24 八月+3
23 八月+5
22 八月+3
21 八月+6
20 八月+1
19 八月+1
18 八月+1
17 八月+2
16 八月+5
15 八月+4
14 八月+5
13 八月0
12 八月+3
11 八月0
10 八月+11
09 八月0
08 八月+3
07 八月+3
06 八月+5
05 八月+4
04 八月+1
03 八月+2
02 八月+2
01 八月+2
频道帖子
👨‍💻 Ложная иммутабельность Часто новички в функциональном программировании думают, что сделали иммутабельный код. Берут список, вызывают ToList() или Select() и радуются новому списку. Но в C# это ловушка. Проблема в ссылочных типах. var copy = original.ToList() создаёт новый List, но все элементы внутри — те же самые объекты. Меняете свойство через copy, и оригинал тоже меняется. Правило трёх: 🤩 Records с init-only свойствами для value-like поведения 🤩 ImmutableList<T> из System.Collections.Immutable — настоящие неизменяемые коллекции 🤩 Struct только для маленьких типов 📍 Навигация: ВакансииЗадачиСобесы 🐸Библиотека шарписта #sharp_view

2
📎 JsonSerializerOptions в каждом запросе это бомба замедленного действия Вы оптимизировали базу данных. Ничего не изменилось. Оптимизировали сетевые вызовы. Всё ещё медленно. Оказалось, приложение создаёт новый JsonSerializerOptions в каждом запросе. Это уничтожает встроенный кеш метаданных System.Text.Json и превращает JSON сериализацию в дорогую операцию, которая повторяется сотни раз в секунду под нагрузкой. 🤔 Почему это так дорого JsonSerializerOptions это не просто настройки. Это место, где System.Text.Json хранит кэшированные метаданные о том, как сериализовать и десериализовать типы. Каждый новый экземпляр JsonSerializerOptions начинает с пустого кеша. System.Text.Json должна заново анализировать тип, строить информацию о сериализации, кешировать её. Потом запрос закончился и всё выбросилось. Следующий запрос приходит. Новый экземпляр. Пустой кеш снова. Всё сначала. Microsoft так серьёзно относится к этому, что добавили анализатор CA1869, который явно предупреждает: не создавайте JsonSerializerOptions локально в горячих путях. 🤩 Ошибка выглядит безобидно: string ToJson(object value) { var options = new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = false }; return JsonSerializer.Serialize(value, options); } Под нагрузкой это выглядит как: — CPU растёт без видимых причин — Задержка становится нестабильной, p99 скачет — Профилер показывает JSON сериализацию как горячую точку — А вы не понимаете почему, если оптимизировали всё остальное 🤩 Создайте JsonSerializerOptions один раз при старте приложения и переиспользуйте везде: public static class JsonDefaults { public static readonly JsonSerializerOptions Web = new(JsonSerializerDefaults.Web) { WriteIndented = false, Converters = { new JsonStringEnumConverter() } }; } Используем кеш, никаких затрат return JsonSerializer.Serialize(payload, JsonDefaults.Web); Одна переменная, кеш остаётся тёплым, производительность стабильной. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
1 565
3
🤩 F#: упрощённые иерархии интерфейсов с DIM Раньше при работе с C#-интерфейсами, где базовый слот закрыт через дефолтную реализацию интерфейсов, F# всё равно требовал явно реализовать оба интерфейса. Теперь достаточно реализовать только производный интерфейс. 🤩 Допустим, есть такие C#-интерфейсы: public interface IA { int M(); } public interface IB : IA { new int M(); int IA.M() => this.M() + 100; // DIM покрывает слот IA.M } 🤩 Раньше F# требовал реализовать и IA, и IB. Теперь достаточно IB: type C() = interface IB with member _.M() = 42 (C() 😆 IB).M() // 42 (C() 😆 IA).M() // 142 — DIM перенаправляет: this.M() + 100 Улучшение работает не только для простых случаев. Поддерживается ромбовидное наследование, дженерик-интерфейсы, свойства, события, структуры и объектные выражения. Для включения нужен флаг --langversion:preview. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
2 129
4
🤨 ConfigureAwait(false). Почему его любят в библиотеках При await .NET по умолчанию старается продолжить выполнение в захвач
🤨 ConfigureAwait(false). Почему его любят в библиотеках При await .NET по умолчанию старается продолжить выполнение в захваченном контексте. Например, в UI-приложении это позволяет после await снова работать с UI-потоком. Но библиотеке обычно всё равно, в каком контексте продолжать работу. Поэтому там часто пишут: var data = await httpClient .GetStringAsync(url) .ConfigureAwait(false); ConfigureAwait(false) говорит: не нужно возвращать продолжение в исходный контекст. ✅ Это особенно важно для библиотек: они не должны предполагать, что вызывающий код использует конкретный UI или другой SynchronizationContext. Есть и классический сценарий с deadlock: var result = GetDataAsync().Result; Если GetDataAsync() после await пытается вернуться в занятый контекст, продолжение не может выполниться, а .Result не может завершиться. В ASP.NET Core собственного SynchronizationContext для запросов нет, поэтому классическая проблема с .Result и захватом контекста там не возникает по этой причине. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
2 319
5
🈶 Паттерны and, or и not. Условия, которые читаются как фраза Проверки диапазонов в C# легко превращаются в цепочки сравнений с && и ||. Паттерны позволяют записать их компактнее. С C# 9 условия можно комбинировать прямо внутри pattern matching: string Grade(int score) => score switch { < 0 or > 100 => "некорректно", >= 90 => "отлично", >= 60 and < 90 => "нормально", _ => "плохо", }; not особенно удобен для проверок: if (value is not null) Process(value); if (obj is not string) return; Паттерны можно комбинировать и с проверкой свойств: bool IsAdultAdmin(User u) => u is { Age: >= 18, Role: "admin" }; Вместо нескольких if получаем одно выражение, где условие читается почти как обычная фраза. 💡 Особенно хорошо такой синтаксис работает там, где нужно описать форму данных или диапазон допустимых значений. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
2 633
6
📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
2 835
7
✅ Visual Studio умеет превращать JSON в C#-классы за пару кликов Не нужен онлайн-конвертер. Копируете JSON и в Visual Studio
✅ Visual Studio умеет превращать JSON в C#-классы за пару кликов Не нужен онлайн-конвертер. Копируете JSON и в Visual Studio выбираете: Edit → Paste Special → Paste JSON As Classes IDE сама сгенерирует классы, включая вложенные объекты и массивы. Особенно удобно, когда нужно быстро разобраться с ответом незнакомого API или сделать DTO для прототипа. 💡 А после генерации уже стоит привести классы в порядок: переименовать типы, добавить required/init, атрибуты сериализации и убрать лишнее. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
3 256
8
💡 Скрытые копии структур. Зачем нужны readonly struct и in Структуры передаются по значению — это знают все. Но копия может
💡 Скрытые копии структур. Зачем нужны readonly struct и in Структуры передаются по значению — это знают все. Но копия может появиться и там, где её совсем не ожидаешь. Представьте структуру с обычным, не readonly, методом. Если она находится в readonly-контексте, например в readonly поле или приходит через in, компилятору приходится защищать значение от изменения. При вызове такого метода он может создать защитную копию структуры. ➡️ Для большой структуры в горячем цикле это уже лишняя работа. Решение — явно обозначить неизменяемость: public readonly struct Point { public int X { get; } public int Y { get; } public int Sum() => X + Y; } Можно пометить readonly и отдельные методы или свойства, если всю структуру сделать неизменяемой нельзя. in при этом позволяет передавать большую структуру по ссылке без обычного копирования, а readonly-члены помогают избежать защитных копий при работе с такой ссылкой. Если структура концептуально неизменяемая, readonly struct — хороший выбор по умолчанию. А для больших структур in может снизить стоимость передачи, но его эффект зависит от конкретного сценария ✅ 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
3 118
9
🔖 equired + init: обязательные свойства без длинного конструктора Раньше обязательные свойства часто приходилось передавать через конструктор или проверять уже во время выполнения. 🔵 В C# 11 появился required: public class User { public required string Email { get; init; } public required string Name { get; init; } public int Age { get; init; } } 🔵 Теперь компилятор не позволит создать объект без обязательных свойств: var user = new User { Name = "Ada" }; // ошибка компиляции 🔵 А такой вариант пройдёт: var user = new User { Email = "ada@x.io", Name = "Ada" }; init дополняет эту конструкцию: свойство можно задать при создании объекта, но нельзя изменить обычным присваиванием после инициализации. Если обязательные свойства заполняются внутри конструктора, можно использовать [SetsRequiredMembers], чтобы сообщить об этом компилятору. required отвечает за обязательность при создании, а init — за запрет последующего присваивания 💡 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
3 006
10
🖍 NuGet сокращает зависимость от долгоживущих API-ключей NuGet продолжает ужесточать безопасность публикации пакетов. Один и
🖍 NuGet сокращает зависимость от долгоживущих API-ключей NuGet продолжает ужесточать безопасность публикации пакетов. Один из главных шагов — переход от постоянных API-ключей к короткоживущим credentials через Trusted Publishing. Вместо хранения секрета в CI/CD workflow получает OIDC-токен, NuGet проверяет его и выдаёт временный API-ключ. Такой ключ действует около часа и затем становится недействительным. Для CI/CD это означает простую вещь: вместо регулярной ручной ротации секретов можно настроить Trusted Publishing и вообще убрать долгоживущий NuGet API key из пайплайна. Для обычных scoped API keys NuGet по-прежнему позволяет задавать срок действия самостоятельно. 💡 Если у вас есть автоматическая публикация пакетов, сейчас хороший момент проверить, не хранится ли долгоживущий NuGet API key прямо в CI/CD. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #async_news
3 062
11
🤨 NativeAOT. Что значит скомпилировать .NET в нативный код заранее NativeAOT снова на слуху, потому что в .NET 11 Preview 7 его сделали режимом по умолчанию в CLI ради быстрого старта. Разберём, что это вообще такое и чем отличается от привычной модели. Обычно .NET работает так. Код на C# компилируется в промежуточный язык IL, а в нативные инструкции его переводит JIT уже во время запуска. Это гибко, но у первого запуска есть цена на разогрев, а вместе с приложением едет рантайм, который всё это исполняет. NativeAOT переворачивает подход. Компиляция в машинный код происходит заранее, на этапе сборки. На выходе вы получаете самодостаточный нативный исполняемый файл, внутри которого нет ни IL, ни JIT. Приложению не нужен установленный рантайм, оно просто запускается. 🔴 Что это даёт. Старт почти мгновенный, ведь разогревать JIT нечего. Память на старте меньше, а размер развёртывания компактнее, потому что лишнее вырезается при сборке. Для консольных утилит, бессерверных функций и контейнеров, где важен быстрый холодный старт, это большой плюс. 🔴 Есть и цена. Раз всё решается на этапе сборки, в рантайме нельзя генерировать код и сильно ограничена рефлексия, ведь компилятор должен заранее видеть, что используется. Часть библиотек, завязанных на динамику, просто не поедет. Плюс сборка идёт под конкретную платформу, и кросс-компиляция не всегда проста. NativeAOT отлично ложится на маленькие быстрые сервисы и утилиты, где ценны холодный старт и компактность. Для больших приложений с тяжёлой рефлексией и динамической загрузкой сначала проверьте совместимость. Включается это в файле проекта. <PropertyGroup> <PublishAot>true</PublishAot> </PropertyGroup> 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
3 904
12
🔖 Помеченные break и continue в C# 15. Выход из вложенных циклов без костылей Знакомая боль. Есть вложенные циклы, и из внутреннего нужно прервать или продолжить внешний. Обычный break выходит только из ближайшего цикла, поэтому приходилось заводить булев флаг и проверять его на каждом уровне, либо прыгать через goto. И то и другое замусоривает логику. В C# 15 у циклов появились метки, а break и continue научились указывать, какой именно цикл они имеют в виду. Метка ставится прямо на нужный цикл. outer: for (int row = 0; row < grid.Height; row++) { for (int col = 0; col < grid.Width; col++) { if (grid[row, col].IsBlocked) continue outer; if (grid[row, col].IsGoal) break outer; } } 🔵 Читается ровно так, как задумано. continue outer переходит к следующей итерации внешнего цикла, а break outer полностью выходит из него, минуя остаток внутреннего. Никаких флагов и подсчёта уровней. Пара нюансов. break можно нацелить и на цикл, и на switch, а continue только на цикл, ведь продолжать switch нечего. И метка привязывается именно к тому циклу, перед которым стоит, поэтому двусмысленности, как с goto, здесь нет. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
3 891
13
😬 Microsoft показала ещё один кусочек будущего .NET Вышел .NET 11 Preview 7. Апдейт затронул почти весь стек: C#, Runtime, S
😬 Microsoft показала ещё один кусочек будущего .NET Вышел .NET 11 Preview 7. Апдейт затронул почти весь стек: C#, Runtime, SDK, ASP.NET Core, EF Core, MAUI, F# и Windows Forms. Главное изменение это перевод NativeAOT в режим по умолчанию в CLI ради заметно более быстрого старта приложений. Из языка подъехали фичи C# 15, среди них паттерны union и помеченные break и continue для управления вложенными циклами. В библиотеки добавили десятичные типы по стандарту IEEE 754 и шифрование паролем для ZIP. Стабильный .NET 11 ожидается в ноябре, а пока Preview 7 можно использовать как полигон: проверить свои проекты на новом SDK и заранее найти проблемы с совместимостью. 👍 — тестирую превью 🔥 — до релиза даже не трогаю 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #async_news
3 670
14
👍 Современные помощники для валидации параметров Помните те времена, когда каждый метод начинался с целой простыни проверок входных параметров? Копипаста if (string.IsNullOrEmpty(...)) была ежедневной рутиной: public void ProcessUser(string name, string email, int age) { if (string.IsNullOrEmpty(name)) throw new ArgumentException("Value cannot be null or empty.", nameof(name)); if (string.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", nameof(email)); if (age < 0) throw new ArgumentOutOfRangeException(nameof(age), "Value must be non-negative."); // Наконец-то бизнес-логика! } Код становился шумным, а реальная логика терялась в океане проверок. Каждый разработчик писал по-своему, сообщения об ошибках отличались, а про опечатки в nameof() вообще молчим. Теперь всё это превращается в лаконичные однострочники: public void ProcessUser(string name, string email, int age) { ArgumentException.ThrowIfNullOrEmpty(name); ArgumentException.ThrowIfNullOrEmpty(email); ArgumentOutOfRangeException.ThrowIfNegative(age); } Стандартная библиотека предлагает методы на все случаи жизни: // Проверки на null ArgumentNullException.ThrowIfNull(user); // Числовые диапазоны ArgumentOutOfRangeException.ThrowIfNegative(temperature); ArgumentOutOfRangeException.ThrowIfZero(divisor); ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count); // Сравнения ArgumentOutOfRangeException.ThrowIfGreaterThan(progress, 100); ArgumentOutOfRangeException.ThrowIfLessThan(quantity, 1); ArgumentOutOfRangeException.ThrowIfEqual(status, Status.Invalid); ArgumentOutOfRangeException.ThrowIfNotEqual(version, expectedVersion); Эти методы — не просто синтаксический сахар. Они воплощают принцип fail-fast: обнаруживай проблемы немедленно, не позволяй невалидным данным распространяться по системе. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
3 714
15
📌 Версии версионирования Какую систему нумерации версий предпочитаете и встречали ли экзотические варианты? Делитесь опытом�+2
📌 Версии версионирования Какую систему нумерации версий предпочитаете и встречали ли экзотические варианты? Делитесь опытом👇 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #схема
3 709
16
👨‍💻 Мгновенная валидация кода В стремительном темпе разработки важно улавливать ошибки сразу же после правки. Представьте, что можно запускать тесты каждый раз, когда вы сохраняете файл — без лишних кликов и ожидания. Команда дня: dotnet watch test --filter "Category=Unit» Эта команда активирует «наблюдение» за исходниками проекта и при каждом изменении автоматически запускает только те тесты, которые помечены категорией Unit. Вы сразу увидите результаты проверки критичных компонентов, не тратя время на полную прогонку всех тестов. Если вы хотите параллельно следить и за интеграционными тестами, достаточно изменить фильтр: dotnet watch test --filter "Category=Integration» Ещё и интегрировать со скриптами и конвейерами проще простого. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #sharp_view
3 988
17
💎 Вспоминаем SOLID SOLID — это 5 принципов объектно-ориентированного проектирования. Давайте повторим эту базу. — Single Res
💎 Вспоминаем SOLID SOLID — это 5 принципов объектно-ориентированного проектирования. Давайте повторим эту базу. — Single Responsibility Principle (Принцип единственной ответственности) Каждый класс должен иметь только одну причину для изменения. Плохо: класс UserManager и сохраняет пользователя в БД, и отправляет email. Хорошо: UserRepository хранит, EmailService отправляет письма. — Open/Closed Principle (Принцип открытости/закрытости) Классы должны быть открыты для расширения, но закрыты для изменения. Новый функционал добавляем через расширение, а не переписывание старого кода. Пример: вместо переписывания метода — создаём новый подкласс или внедряем стратегию. — Liskov Substitution Principle (Принцип подстановки Барбары Лисков) Объекты подклассов должны работать так же, как объекты родителя. Если Square наследуется от Rectangle, он должен вести себя как прямоугольник, а не ломать ожидания. Суть: наследование не должно рушить логику программы. — Interface Segregation Principle (Принцип разделения интерфейсов) Лучше много маленьких интерфейсов, чем один огромный. Плохо: интерфейс IMachine с методами print(), scan(), fax(). Хорошо: IPrinter, IScanner, IFax. Каждый класс реализует только нужное. — Dependency Inversion Principle (Принцип инверсии зависимостей) Зависимости должны быть от абстракций, а не от конкретных классов. Плохо: класс ReportGenerator напрямую вызывает MySQLDatabase. Хорошо: ReportGenerator работает с интерфейсом Database, а уже конкретная БД подставляется снаружи. Без SOLID код быстро превращается в спагетти, где одно изменение ломает всё. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #il_люминатор
3 091
18
🔥 Где должна жить бизнес-логика: в хранимых процедурах или в коде приложения? Спор, который не утихает много лет. Сторонники хранимых процедур говорят: данные уже в базе, меньше сетевых запросов, выше производительность и больше контроля над SQL. Сторонники логики в приложении отвечают: код проще тестировать, ревьюить, версионировать в Git и переносить между разными СУБД. На практике многие выбирают компромисс: сложные операции над большими объёмами данных оставляют в базе, а бизнес-правила и оркестрацию — в приложении. 💬 А как устроено у вас? 👍 — максимум логики в приложении. 🔥 — сложную логику лучше держать в базе. И был ли у вас проект, где сотни хранимых процедур со временем превратились в «чёрный ящик», который никто не хотел менять? 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #entry_point
3 146
19
🤔 У большинства разработчиков уже есть подписки на IDE, GitHub Copilot, Claude, ChatGPT или облачные сервисы. Логично, что о
🤔 У большинства разработчиков уже есть подписки на IDE, GitHub Copilot, Claude, ChatGPT или облачные сервисы. Логично, что обучение тоже постепенно приходит к той же модели: не покупать отдельный курс под каждую новую тему, а иметь доступ ко всей библиотеке и выбирать, что актуально именно сейчас. Такой формат недавно появился и в Proglib Academy. Вместо одного курса — доступ сразу ко всей библиотеке и новым материалам, которые появляются в подписке 😎 🔗 Подробнее 🏃‍♀️ Proglib Academy
2 728
20
Кажется, у онлайн-обучения появился формат, которого давно не хватало 👇
3 140