StepOne | Степан Минин – Telegram
StepOne | Степан Минин
3.42K subscribers
245 photos
35 videos
6 files
310 links
StepOne by Степан Минин @ststphn

Твой первый шаг к успеху в программировании

Закрытый тг канал https://news.1rj.ru/str/tribute/app?startapp=slOA

По вопросам рекламы @Spiral_Yuri

Ютуб https://www.youtube.com/@steponeit
Download Telegram
Какой длины должны быть функции?

Если обратиться к такой классике, как «Чистый Код» Роберта С. Мартина, то можно увидеть следующее:

Первое правило функций — они должны быть маленькими. Второе правило функций заключается в том, что они должны быть еще меньше

То есть, кажется, что это означает примерно следующее:

1️⃣ Функции должны быть короткими — не длиннее 20 строк и в большинстве случаев менее 10 строк.

2️⃣ Функции должны иметь как можно меньше аргументов, желательно ни одного.

Стоит придерживаться стратегии «разделяй и властвуй».
Попробовать разделить метод на несколько логических шагов, определить что от чего зависит.

Затем, разбить это на минимальные модули, которые соединяются в единый механизм, например, с помощью внедрения зависимостей.

Такие действия, безусловно, помогут начертить границы ответственностей, сделают код чище и читабельнее.

Однако, практика показывает, что в любом проекте можно найти большой объём кода под рефакторинг с методами и на 100, 200, 300 строк с десятком параметров.

Как вы думаете, стоит их распиливать и переписывать?
🤔11👍7🔥1
Как генерировать валидные данные?

Активные читатели моего канала могут подумать, что сейчас будет очередной пост про какую-нибудь кастомизацию AutoFixture, ведь все знают, как библиотека генерирует строки и числа.

А вот и нет! В сегодняшнем разговоре о генерации данных ключевое слово валидные.

Ответ на вопрос в заголовке: Bogus.

Да, для C# существует не один генератор данных.
Но разница проявляется как в назначении, так и в устройстве.

AutoFixture - это скорее некоторое подобие DI контейнера с CQRS архитектурой.
Bogus - инструмент, больше похожий на FluentValudation.

Для каждой модельки создаётся специальный генератор.
В нём с помощью fluent interface api всем полям прописываются правила по заполнению значений.

public class OrderFaker : Faker<Order>
{
public OrderFaker()
{
RuleFor(o => o.OrderId, f => f.Guid.NewGuid());
RuleFor(o => o.Item, f => f.Lorem.Sentence());
RuleFor(o => o.Quantity, f => f.Random.Number(1, 10));
}
}

var orderFaker = new OrderFaker();
var order = orderFaker.Generate();

Таким образом, данные получаются осмысленными.
В арсенале богуса есть адреса, имена, различные локали, схемы генерации, расширяемость и многое другое.
🔥27👍53
Хочу поделиться с вами радостной новостью.
Наконец-то получил свой долгожданный платёжный стикер МТС🤩

Вот так аккуратно он выглядит, будучи прикреплённым сбоку от айфоновской камеры. Не знаю будут ли обновлять дизайн в новых партиях в связи с ребрендингом, но у моего ещё есть яйцо😁

Оплачивая через Apple Pay, покупатели выработали определённый пользовательский опыт. Своеобразный жест, характеризующийся тем, как подносится телефон к терминалу, какой частью и так далее. Эту историю получилось перенести практически безболезненно на мой взгляд.

МТС Pay Tag поддерживает привязку нескольких карт от разных банков, что очень удобно. А к релизу добавили несколько новых, например, мой любимый райф😍

Работает исправно, впечатления только позитивные. Одним словом, молодцы! Не то что какой-то там тинькофф или прости Господи сбер. Наклепали маленьких карточек и думают, что прокатит🤡
🔥7🤣3👍21
Топ-3 места, куда бы я пошёл учиться на программиста в 2023 году

Естественно, речь идёт о направлении подготовки «прикладная математика и информатика» (01.03.02), другое рассматривать смысла нет.

🥇Бауманка (кафедра ИУ-9)

Это моя альма-матер. История обучения заслуживает не одного поста. Путь был трудным, но ни о чём не жалею.

Огромное количество практической подготовки - нон-стоп кодинг все 4 года.
Разнообразные компании-партнёры, которые позволяют уже в стенах ВУЗа стать востребованным специалистом.
Почти двухсотлетняя история и уникальные традиции, которые не оставят равнодушным ни одного студента.

🥈Физтех (школа ФПМИ)

Лучшая физико-математическая школа за пределами МКАД.
Один из тех немногих университетов (кроме того, что на 1 месте), который до последнего сопротивлялся введению разрушительного для образования дистанционного формата.
Осилит не каждый, место не для слабонервных.

🥉МГУ (факультет ВМК)

Старейший университет России, определивший облик русского образования.
Преподаватели именно отсюда обогащают другие университеты своими уникальными методиками, знаниями и опытом.
🔥14👍32🥱2
Что общего между математиком и программистом?

В IT сфере популярен тезис о том, что математика программистам не нужна.
Не могу согласиться с этим утверждением, но об этом в другой раз.

Интересно наблюдать, как совершались важнейшие математические открытия.
Взять для примера доказательство великой теоремы Ферма.

Сначала были пифагоровы тройки, затем изобрели теорию колец, рассматривали гауссовы числа.
Только в конце XX века удалось доказать теорему, используя многолетний опыт предыдущих попыток.

С другой стороны, C# разработчик видит три следующих интерфейса:

interface IShowableString
{
string Show(string s);
}

interface IShowableBoolean
{
string Show(bool b);
}

interface IShowableInteger
{
string Show(int i);
}

Готов поспорить, первая мысль, которая придёт ему в голову, это сделать следующее:

interface IShowable<T>
{
string Show(T item);
}

Чувствуете, куда веду?
Нас объединяет искусство обобщать. Ведь взаимодействие с неизвестным происходит по одному алгоритму в обоих случаях:

▪️Встреча частного случая некоторой общей задачи

▪️Поиск частного решения

▪️Вероятная встреча другого частного случая той же задачи

▪️Обобщение

▪️Поиск общего решения
🔥20👍4🥴1😍1
Выступаю на конференции

В сентябре, неожиданно для себя, поеду в Ульяновск, чтобы поучаствовать в международной IT конференции Стачка в качестве спикера.

Так что всех желающих жду на своём докладе, поговорим про полиморфные контракты.

https://nastachku.ru/vnedrenie-polimorfnyh-kontraktov-v-servisy-na-.net-7
🔥12👍4🤬1🥴1
Самый редко используемый цикл в C#

Цикл do while редко используется, но важно помнить о его существовании, чтобы понимать возможные случаи применения.

Его синтаксис таков:

do
{
// тело цикла
} while (condition)


Этот цикл всегда исполняет своё тело как минимум один раз, даже если условие не выполнено.

Из этой особенности, отличающей do while от других видов циклов, вытекают его основные сценарии использования.

А как часто вы используете do while?
👍14🤯4😢2🏆2😁1🤬1🌭1
Вопрос от подписчика: "Стоит ли использовать foreach, если for быстрее?"

Здесь важно понимать, чем отличаются эти циклы.

▪️for - это классический управляющий оператор, который транслируется в +/- одинаковый IR или машинный код практически во всех языках программирования согласно блок-схеме выше.

Принцип его работы одинаков везде:
for (выражение1; выражение2; выражение3)
оператор


▪️foreach - это синтаксический сахар над итераторами, который ещё и работает согласно принципам утиной типизации.
Перебираемому объекту даже не обязательно реализовывать IEnumerable.

Разворачивается такой цикл примерно в следующее:
var enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext())
{
var item = enumerator.Current;
// ...
}

Невооружённым глазом видно, что здесь происходит вызов через VMT, возможен cast, выделение памяти и так далее.
Обслуживание foreach очевидно дороже, потому что это абстракция.

Так что использование везде for вместо foreach - скорее микрооптимизация.
🔥11🥴4👍31🥱1
Возможно вы не знали этот метод LINQ

С 6-ой версии в .NET присутствует метод Chunk, который позволяет дробить коллекцию на одинаковые кусочки, так называемые "чанки".

// получаем итерируемый объект
var enumerable = Enumerable.Range(1, 999);

// дробим на чанки
var chunks = enumerable.Chunk(29);

// итерируем по чанкам
foreach(var chunk in chunks) // для каждого чанка
{
foreach(var item in chunk) // для каждого элемента в чанке
{
Console.WriteLine(item);
}
}

Пользуйтесь на здоровье!
👍47🤯5🕊3🐳32🥱1
DateTime vs DateTimeOffset

В .NET есть два главных способа работы со временем: DateTime и DateTimeOffset.

DateTimeOffset это представление абсолютного времени.
То есть, речь идёт о моменте во времени, который является однозначно единым для всех.
Другим способом представить мировое время является DateTime с полем Kind установленным в значение DateTimeKind.Utc.

DateTime же представляет другое понятие - календарное время.
Календарное время можно представить как точку на чьём-то календаре.
Но мы понимаем, что календарей по всему миру очень много и все они различаются по часовым поясам.

Соответственно, DateTimeOffset предоставляет тот же функционал, что и DateTime, но вместе со знанием часового пояса.
👍12🔥21🤬1
3 причины использовать DateTimeOffset вместо DateTime

Если что-то из этого вам подходит стоит задуматься о смене используемого типа данных 🤔

Необходимо проверить, что из следующего вашему приложению нужно:

1️⃣ Уникально и однозначно определять единый момент во времени.
В системе появится недвусмысленное понятие «сейчас», можно будет логгировать временные метки транзакций, событий, созданий, модификаций и так далее.

2️⃣ Выполнение общих арифметических операций над датой и временем с высокой точностью.
Например, прибавляете к некоторой дате шесть месяцев, и ожидаемый результат должен получиться с поправкой на летнее время.

3️⃣ Хранение нескольких связанных между собой меток времени, как частей одной структуры или одного массива данных.
👍121🤬1🥴1
В каких случаях использовать DateTime?

1️⃣ Работа с датой и временем при отсутствии информации о часовом поясе

2️⃣ Работа только с UTC форматированными датами

3️⃣ При выполнении арифметических операций учитываются только общие результаты
👍9🥱1
Стоит давать айтишникам выходной в понедельник?
Anonymous Poll
44%
А ну бегом работать! 😡
56%
У меня недостаток смузи в организме 😰
🍌7😁1🕊1🥱1🥴1🐳1🏆1
Внезапная задача

Найдите отличия в приведённых фрагментах кода, и в каком из них находится баг?

1️⃣


var children = _childrenRepository.GetByParentIds(parentIds);
return parentIds.ToDictionary(
parentId => parentId,
parentId => children.Where(child => child.ParentId == parentId).ToList());


2️⃣


var children = _childrenRepository.GetByParentIds(parentIds);
var grouped = children.GroupBy(child => child.ParentId);
return grouped
.ToDictionary(
childrenGroup => childrenGroup.Key,
childrenGroup => childrenGroup.ToList());
🤯11🤬2😱1🥱1
StepOne | Степан Минин
Внезапная задача Найдите отличия в приведённых фрагментах кода, и в каком из них находится баг? 1️⃣ var children = _childrenRepository.GetByParentIds(parentIds); return parentIds.ToDictionary( parentId => parentId, parentId => children.Where(child…
Время правильных ответов

Задержался с подведением итогов и написанием правильного ответа.

Сколько живу, столько подтверждаются слова:
«Хочешь что-то спрятать, оставь это у всех на виду».

Действительно, многие подписчики указывали на возможные проблемы с контрактом, равенством, дубликатами, уникальностью и так далее.

Возможно, стоило сразу написать, что все подобные вопросы учтены, и по этим направлениям проблем не предвидится в контексте задачи.

Кто-то боролся за «чистый код», однако лишь под конец дня появился правильный ответ.

А дело в том, что во втором случае теряется информация: в итоговом словаре не будет родительских сущностей с пустой коллекцией дочерних.
7👍2🥴2🥱1
😁33❤‍🔥4🥱2🌭2🏆2🔥1🤩1🥴1
Коллеги, поделитесь в комментариях подходами, которые вы используете для рефакторинга.

Интересно, как вы к нему подступаетесь: сразу удаляете старое и встраиваете новое или реализуете своеобразный v2, на который всё постепенно пересаживаете?
🤔9🥱1🏆1
StepOne | Степан Минин
Коллеги, поделитесь в комментариях подходами, которые вы используете для рефакторинга. Интересно, как вы к нему подступаетесь: сразу удаляете старое и встраиваете новое или реализуете своеобразный v2, на который всё постепенно пересаживаете?
Большое спасибо всем неравнодушным к моей просьбе!

Очень много полезных советов, с инструкцией к применению.

Это точно поможет решить мои проблемы, через некоторое время постараюсь это всё суммировать, чтобы выложить в канал.
9👍1🥱1
Про ФКН ВШЭ 🎓

Раньше в России можно было стать кандидатом или доктором технических или физико-математических наук.

Присуждение степеней в области компьютерных наук стало возможным благодаря тому, что в 2018 году НИУ ВШЭ получила право присваивать собственные ученые степени.

Как, по-вашему, звучит: "кандидат компьютерных наук"? 🤔
👍9🤔6
В последнее время часто приходится работать с enum.

Многим известно, что enum это тип значения, определённый набором именованных констант, в каких случаях его удобно использовать и так далее.

Но сегодня хочется рассказать о хорошей, как мне кажется, практике проектирования перечисления.

Создавая новое перечисление, старайтесь предоставлять значение по умолчанию.

Иначе default(TEnum) может вернуть первое значение из перечисления, что может приводить к логическим несостыковкам и смысловым ошибкам.

Конечно, так надо делать только в соответствии с описываемой предметной областью.
Такое значение может называться None, Default или Unknown.

Такая структура enum позволит описать, как работать с вашим пользовательским типом данных.
👍17🔥1