Pull to refresh
4
0.6
Send message
В нашей компании тоже минувшим летом организовали обучение по трем направлениям — фронтенд (ангуляр), бэкенд (.net, ms sql, etc.) и devops. Вызвался вести семинары (бэк) вместе с еще одним коллегой, и ничуть не пожалел.
На первом занятии собралось 15 человек, правда половина из них почти сразу отвалилось. Но по окончании двух месяцев занятий (по плану собирались раз в неделю, но почти каждую неделю проводили по два занятия) осталось пятеро человек, которые демонстрировали то что успели сделать, и в итоге четырем направили оффер. Двое уже работают с нами в команде.
Понравилось, когда обучаешь людей новым интересным для них вещам, видишь позитивный отклик.
Справедливости ради, среди таких личностей я бы и не ожидал увидеть много интеллектуалов, особенно подкованных в части IT-технологий
Думаю, минусы оттого, что Ваш комментарий не содержит ничего по теме статьи, лишь жалобу про ограниченный профиль. Оппонируйте, или выскажите свою мысль, которая будет развивать представленные в статье тезисы.
Мы на своём проекте договорились следовать конвенции FindUser(int id) — поиск по идентификатору, если не найден — вернуть null; GetUser(int id) — получить юзера по известному идентификатору. И во втором случае уже при неудачной попытке будет выброшено исключение.
Вспоминаю историю, как в какой-то стране (вроде Великобритании) на съездах устанавливали отбойники, которые из-за трамплинообразной формы провоцировали опрокидывание автомобиля в случае наезда на них на скорости.
Из-за того, что статистику анализировали на основе координат ДТП, долгое время проблема оставалась невыявленной, а власти не спешили признавать проблему — ведь «горячих точек» на карте не было, аварии были распределены по множеству съездов и перекрестков.
Часто использую VS Code как «продвинутый блокнот», и частым сценарием является вставка и форматирование json-ответов, для удобного просмотра их содержимого: вставить в новый документ, переключить язык документа на json (Ctrl-Shift-P -> Change lang mode), форматирование json (Alt-Shift-F).

Недавно нашёл способ пропустить второй шаг, установив дефолтный языковой режим для нового документа настройкой

"files.defaultLanguage": "json"

stackoverflow.com/questions/35904221/change-vscode-default-language-for-new-files
Полагаю, нужно разграничивать цели, для которых можно использовать такой подход.

Например, для кода с бизнес-логикой extension-методы очень редко используются — их трудно мокать, как уже упомянули выше. Да и в целом такой код иногда нуждается в полиморфизме, то есть переопределении логики для классов-наследников.

Для инфраструктурного кода методы расширения — это очень мощный инструмент, который позволяет писать более декларативный код без необходимости изменения классов, с которыми он работает (а иногда к ним может вообще не быть доступа, например для классов из сторонних библиотек). Поскольку такой код обычно не содержит бизнес-логики, то вопрос с юнит-тестами не стоит так остро.

Впрочем, и для методов расширения можно реализовать механизмы, которые позволят переопределить логику работы в юнит-тестах, если внутри них обращаться к синглтону, который и содержит логику их работы, и может быть подменён при запуске тестов.
В файле Startup.cs заменим:

В предыдущих примерах при отсутствии файла appsettings.json приложение выбросит исключение

Если для создания хоста приложения (в файле Program.cs) используется метод CreateDefaultBuilder, то файл «appsettings.json» уже добавлен с опциями «optional: true» и «reloadOnChange: true»:

Исходный код метода CreateDefaultBuilder
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
  var builder = new WebHostBuilder();

  if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
  {
    builder.UseContentRoot(Directory.GetCurrentDirectory());
  }
  if (args != null)
  {
    builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
  }

  builder.ConfigureAppConfiguration((hostingContext, config) =>
  {
    var env = hostingContext.HostingEnvironment;

    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

    if (env.IsDevelopment())
    {
      var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
      if (appAssembly != null)
      {
        config.AddUserSecrets(appAssembly, optional: true);
      }
    }

    config.AddEnvironmentVariables();

    if (args != null)
    {
      config.AddCommandLine(args);
    }
  })
  .ConfigureLogging((hostingContext, loggingBuilder) =>
  {
    loggingBuilder.Configure(options =>
    {
      options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
                        | ActivityTrackingOptions.TraceId
                        | ActivityTrackingOptions.ParentId;
    });
    loggingBuilder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    loggingBuilder.AddConsole();
    loggingBuilder.AddDebug();
    loggingBuilder.AddEventSourceLogger();
  }).
  UseDefaultServiceProvider((context, options) =>
  {
    options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
  });

  ConfigureWebDefaults(builder);

  return builder;
}



github.com/dotnet/aspnetcore/blob/7e9e03b70124784b1de5564c573bd65cdaccbfcc/src/DefaultBuilder/src/WebHost.cs#L173
значит один год уже прошёл

В том-то и дело, что не прошел — нумеруя год единицей, мы говорим что он первый. В прямом смысле — самый первый год (относящийся к нашей эре).
Насколько я помню из нумизматики, тогда (в начале XVIII века) года вовсе буквами обозначали. Например
АѰЕ
обозначало 1705.
Если кому интересно, можно погуглить «год буквами на монетах»
Так нет такого «нулевого года», именно об этом речь. Когда человек рождается, он проживает первый год.
Сейчас на дворе две тысячи двадцатый год, то есть прошло от начала эры только 2019 полных лет.
Судя по всему, считали эры от начала царствования императоров, а от Р.Х. начали считать только 5 веков спустя:
ru.wikipedia.org/wiki/От_Рождества_Христова
Просто по иронии, когда Вы указали на ошибку, в Вашем примере, тоже закралась опечатка, вместо
list.Add(1);

должно быть
tmp.Add(1);

Иначе просто не скомпилируется.
А мне было интересно почитать, размышления на тему того, как человек оказывается в чужой среде.
Согласен: если речь идёт о функции, которая принимает object и сверяет его тип на соответствие конкретным типам, такой код явно пахнет.

Но в случае, например, Union-типов, когда на входе у нас, например, `Customer | Error`, можно обработать ошибочный сценарий в функциональном стиле при помощи паттерн-матчинга. Эх, вот бы наконец завезли в C# Union-типы…
А в восьмой версии языка добавили и switch expressions:

static string Display(object o)
{
    return o switch
    {
        Point p when p.X == 0 && p.Y == 0 => "origin",
        Point p                           => $"({p.X}, {p.Y})",
        _                                 => "unknown"
    };
}


Источник
public static double ComputeAreaModernSwitch(object shape)
{
    switch (shape)
    {
        case Square s:
            return s.Side * s.Side;
        case Circle c:
            return c.Radius * c.Radius * Math.PI;
        case Rectangle r:
            return r.Height * r.Length;
        default:
            throw new ArgumentException(
                message: "shape is not a recognized shape",
                paramName: nameof(shape));
    }
}


Пример отсюда
Знакомая предложила эту же статью на Яндекс дзен опубликовать. Правда площадка для меня неизвестная, но видимо буду изучать =)
Вряд ли там наберется материала на 8 постов, тем более некоторые функции там достаточно тривиальны. Поэтому решил оформить одним постом, и вот три часа назад опубликовал: в комментариях пост был принят достаточно тепло, а на гитхабе прибавилось несколько звёздочек и целых 6 человек сегодня клонировали репозиторий)) Спасибо Вам за мотивацию! =)
вкладка полезна людям, которые пользуются макросами в экселе

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

Частая боль при работе с числами, отформатированными как текст
При обработке выгрузки из сторонней системы в эксель числа отформатированы как текст, и их нельзя ни просуммировать, ни среднее арифметическое посчитать. Приходится изобретать хаки (например, при помощи функции «текст по столбцам»). В моей надстройке есть функция, которая позволяет преобразовать текст в числа, гибко учитывая различные десятичные разделители: например, «12.34», «56,78»). Конечно, такая гибкость может и подвести — например, для «1.234» неочевидно, является ли точка разделителем дробной части или тысяч.


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

Список остальных функций
  • подсветка дублей (разными цветами группы одинаковых значений)
  • переключение регистра («пример» -> «Пример» -> «ПРИМЕР»)
  • очистка текста от «лишних» пробелов по краям ячейки и повторных пробелов в середине
  • интерактивный поиск всех формул с ошибками ("#Н/Д" и другие) на листе
  • «размерживание» объединенных ячеек с их заполнением
  • снятие пароля с защищённой книги и листов
  • экспорт таблицы в markdown
  • проверка значений в выделенном диапазоне ячеек (числа, даты, валидный текст для XML и т.д.)

Также есть функции по работе с XML, не относящиеся напрямую к Excel, но в которых иногда возникает потребность, а инструмента, который бы свободно распространялся и вызывал доверие, у меня сходу найти не получилось:
  • сформировать пример XML файла на основе XSD-схемы
  • проверить XML по XSD-схеме


На пикабу я не решился писать «рекламный» пост именно о своей надстройке, и описал общие приемы и советы по отладке VBA и созданию xlam-надстройки, лишь в конце упоминая свой проект. Вот сейчас задумался, может быть всё-таки стоит представить свой проект отдельным постом — конечно, читателей Хабра таким не впечатлить, но на Пикабу может зайти. =)

P. S. подписался на Вас, буду читать новости о «малиновых» компьютерах)

Information

Rating
1,525-th
Registered
Activity