• Метаморфическое тестирование: почему об этой перспективной методике почти никто не знает
    –1
    Есть замечательный ScalaCheck (https://habr.com/ru/post/319456/), например.
  • 5 вопросов о расширении Вселенной, которые вы стеснялись задать
    0
    А не может ли красное смещение быть связанным с самим пространством? Например, кванты теряют энергию не из-за расширения пространства, а просто из-за длины пробега?
  • Функционал F#, который потихоньку появляется и в C#
    +2
    Здесь лучше использовать паттерн Opition (или Maybe), благо библиотек, его реализующих, тьма — LanguageExt, например
  • Спросите Итана: как гравитационные волны убегают из чёрной дыры?
    0
    На мой дилетантский взгляд, всегда интересовало, если гравитация таки квантуется, будут ли гравитоны увлекаться черной дырой, как это увлекаются фотоны?
  • Двойная бюстгалтерия* глазами программиста
    0
    1. support.zenmoney.ru/topics/9-semejnyij-byudzhet-dlya-vsej-semi
    2. Там же, плюс «Долги», плюс «Проекты»
    4. support.zenmoney.ru/topics/5-nastrojka-kreditnyih-kart-i-kreditov

    btw, не имею к ним отношения, просто нравится продукт :)
  • Двойная бюстгалтерия* глазами программиста
    0
    Дзен мани? zenmoney.ru
  • Лог файлы Linux по порядку
    0
    Приложение собственное — web server на dotnet core.
  • Лог файлы Linux по порядку
    +1
    Подскажите, пожалуйста, куда лучше писать логи от своих приложений?
  • Сам себе Microsoft
    +1
    По идее, Expression.* достаточно плотно привязаны к C#\VB.NET. Если автор ставит себе задачу создать собсвтенный язык программирования, то используя Expression он получит скорее транспайлер.
  • Guard классы — использовать или нет?
    +6
    C# 7 позволяет это делать в одну строчку, btw.
    this.eventProvider = eventProvider ?? throw new ArgumentNullException(nameof(eventProvider));  
    
  • События и потоки. Часть 1
    +2
    Не лучшая идея запускать по потоку на каждый обработчики эвентов. ThreadPool.QueueWorkItem предпочтительней. И не забываем про SynchronizationContext, когда работаем с голыми потоками или тред плулом.
  • Лямбда-выражения Java 8 — это замыкания?
    +4
    Как-то из внешенго мира вопрос в заголовке выглядит как теплое с мягким. Лямбда-функция — это неименованная функция, которую можно объявить в теле метода. Замыкания — возможность использовать перменные, внешние для объявленной функции. Соотвественно, лямбда-функции могут использовать механизм замыканий, а могут и нет — и поддержка замыканий для лямбда функций может быть в языке, а может и нет. Конечно, все эти три вещи идут достаточно близко — лямбда-функции, функции как объект первого порядка (грубо говоря, переменные типа «функции») и замыкания. Язык может не поддерживать лямбда-функции — именно как неименованные функции, но уметь замыкания и наоборот.
  • LINQ конвертер между римскими и арабскими числами
    0
    Я совершенно не против замыканий. Я против использования нечистых функций в linq в частности и в функциональных подходах (linq, как ни крути, это кусочек функционального мира в императивном C#) в общем. Все ваши примеры можно переписать с использованием чистых функций, и, отвечая на ваш вопрос ниже, они вполне подходят для обучения студентов. Горы циклов, это, конечно, не очень, но такое использование linq, на мой взгляд, усложняет его понимание и уводит несколько в сторону от его базовых понятий — комбинации функций, ленивые вычисления и так далее.
  • LINQ конвертер между римскими и арабскими числами
    0
    Я, наверное, неправильно выразился — на личности переходить не хотелось, коненчо. Вопросы сверху — это те вопросы, которые я бы задал на собеседовании в ответ на такое задание.

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

    Например, мы на собеседовании даем вот такой вот код «на-объяснить»:

    var groupToDictionary = function(arr, keyFunction) {
        var objToReturn = {};
    
        arr.forEach(function(item) {
            var key = keyFunction(item);
    
            if (!objToReturn.hasOwnProperty(key)){
                objToReturn[key] = [];
                objToReturn[key].getKey = function() { return key; };
            }
    
            objToReturn[key].push(item);
        });
    
        return objToReturn;
    };
    


    Банальная функция, на которой, к сожалению, многие отваливаются. Но функция реальная, без подвохов.
  • LINQ конвертер между римскими и арабскими числами
    +1
    Второго. Если б я увидел такой код на собеседовании — я бы усомнился в адекватности собеседующих и задумался о вакансии в принципе. Мне придется разбираться с таким кодом на работе? Вы реально так пишите? Какие мои навыки вы проверяете?
  • LINQ конвертер между римскими и арабскими числами
    +1
    Ну уж нет, именно в ранг мантры. Такой код сложно читать, практически невозможно рефакторить. То же самое касается goto. Такой код в продакшене — повод поговорить про профнепригодность.

    Аналог let — это Select с анонимным типом внутри.

    А вы действительно учите этому студентов?
  • LINQ конвертер между римскими и арабскими числами
    +6
    И еще пару слов про код — очень плохая практика использовать в методах, которые вызываются в linq сайд эффекты — присваивание переменных и подобное:
    Dictionary<char, int> ra = w.ToDictionary(ch => ch, ch => (o = ("" + o)[0] == '1' ? o * 2 : o * 5) / 2);
    

    Если вам нужны локальные переменные — используйте let. Плюс странная констркуция ("" + o)[0] — это первый символ числа? Тогда пишите явно o.ToString()[0]. Но все равно присовение внутри linq функций — это плохо. Тоже самое и здесь
    num.Select((c, i) => ++i < num.Length && ra[c] < ra[num[i]] ? -ra[c] : ra[c])
    

    ++i лучше заменить на i+1.
    И во втором ToRoman.

    Также нежелательно смешивать linq синтаксис и вызовы extension методов. Понятно, что во втором ToRoman нужен последний First(), но тогда либо весь предыдущий запрос писать в linq синтаксисе, либо весь в цепочку вызовов.
  • LINQ конвертер между римскими и арабскими числами
    +6
    К сожалению, Dictionary<,> в общем случае не сохраняет порядок добавления ключей. Если я не ошибаюсь, порядок теряется при перебалансировке. В вашем случае лучше подойдет просто список пар (ну или Tuple-ов).
  • Монада Maybe на стероидах
    0
    Нет, конечно. :)
  • Монада Maybe на стероидах
    0
    Как меня поправили — call-by-ref и Lazy не эквивалентны maybe, они просто являются монадами.
  • Монада Maybe на стероидах
    +3
    Да, мы используем nuget.org/packages/Tp.Core.Functional повсеместно в наших продакшн проектах. Как перешли? Да, в принципе, никто и не был против. У нас в компании привествуется software craftsmanship движение, а maybe просто добавляют коду явность — я явно указываю, что ожидаю праметр с возможно отсутствующим значением или наоборот — мой метод может вернут пустое значение. И компилятор мне подскажет, где я пренебрегаю этим, выдав ошибку типов. Ошибка в компайл-тайм дешевле ошибки, пойманной в тестах в десятки раз и ошибки из продакшена в сотни — простая арифметика.
  • Монада Maybe на стероидах
    +8
    Ничем. Это же «Ненормальное программирование», просто забавное наблюдение, что ленивое вычисление (или, скорее, call-by-ref) — это тоже монада, эквивалетная maybe.
  • Интересные заметки по C# и CLR
    +5
    8 пункт — неправда. Запрос выполняется, если он возвращает скаляр(Count, Sum, First...). Даже если на нем вызвать foreach (то есть, выполнить GetEnumerator()) он будет выполнен так лениво, как только можно. То есть, такое выражение не выполнится сразу:
    	var s =  from f in Foo()
              	group f by f%2;
    


  • Гугл предлагает усилить JSON с помощью Jsonnet
    +1
    Схему передавать и не надо — это просто стандратный способ проверить целостность данных, то есть вместо громоздкого текстового описания моего API и тучи реализаций на разных языках, я могу просто предоставить одну схему. Отсутствие схемы — это не минус самого формата, это минус его инфраструктуры, и хорошо, что json schema уже, как минимум, internet draft.

    Для дат есть замечательный ISO 8601, самый распротраненный формат данных после строк и чисел. Иметь его в стандрате передачи данных было бы очень приятно.
  • Гугл предлагает усилить JSON с помощью Jsonnet
    +4
    В json не хватает четырех вещей — схемы, дат, комментариев и NaN. А так — идеальный формат.
  • Сериалы как инструмент при воспитании детей
    +3
    Совершенно непонятен возраст. Friends, Теория большого взрыва, Светлячок — TV-14 и даже TV-PG для некоторых эпизодов. Хауз и Шерлок TV-PG.
  • Оптимизация методов ToArray и ToList путём предоставления количества элементов
    –2
    ToList, как отмечается в статье, все-таки NLogN из-за копирования.
  • Почему палитра современных фильмов оранжево-синяя
    +5
    Глупое предположение, всегда думал, что таоке происходит из-за зеленого хромакея, который потом старательно вычищают.
  • High CPU или как Garbage Collector может убить производительность
    0
    Если сборщик запускается в момент обработки дерева, все текущие объекты попадут в Gen1. Судя по графику, так и происходило — CMS поднимал весь сайт в память, в процессе памяти не хватало, запускался сборщик, и так несколько раз.
  • Function Pointer — забытая реализация шаблона Singleton
    0
    Ээ нет. Вы не сможете создать еще один экземпляр класса, реализующего паттерн синглтон. Просто потому что конструктор у него приватный. Плюс с другой стороны, клиенту синглтона абсолютно пофиг, синглтон он или нет — это просто объект нужного ему класса.
  • Function Pointer — забытая реализация шаблона Singleton
    +1
    Это паттерн state, вообще говоря.
  • Function Pointer — забытая реализация шаблона Singleton
    +1
    Синглтон сам по себе ни в чем не виноват. Все зло, которое приписывают синглтону, происходит от наличия глобальной переменной (или метода-геттера). Синглтон нужен только для определения единственности объекта, доступ к нему — на совести программиста. Никто не мешает создать синглтон и пропихивать его как зависимость, например, в конструкторы.
  • О начинающих разработчиках и принципах работы с ними
    +1
    Если джуниор приходит на существующий проект, то задавать вопросы — его прямая работа. Нельзя нагуглить решения, которые используются внутри команды, нельзя слепо копировать нагугленные решения — потому что у джуниора нет «чутья», которое должно приобретаться с опытом.
  • Интересные моменты в C# (foreach)
    +1
    IEnumerator стал Disposable после добавления yield return. Например:
     using (var disposable = new SomeDisposable())
     {
      yield return 1;
      yield return 2;
    
    // some code
    
     }
    }
    


    Когда мы закончим итерироваться по этому генертору (причем, мы же можем закончить даже не доходя до конца), нужно закрыть someDisposable. Поэтому компилятор вычисляет такие структуры и кладет их Dispose в Dispose() метод сгенеренного IEnumerator.
  • Трехсторонняя монетка
    0
    Ты рассматриваешь серию бросков (монетка с памятью) — поэтому веротяность получается равномерной. Задача состоит в единичном опыте.
  • Process Explorer vs Process Hacker
    0
    --удалено--
  • AAML: Простейший язык разметки для Android
    0
    Мне очень нравится подход, который дает scaloid: github.com/pocorall/scaloid#ui-layout-without-xml
  • Переход с Java на Scala (Clojure, Haskell, Erlang ..) как повышение абстракции программирования
    0
    Не совсем так. Скала, насколько я помню, свои range хранит как объект и при par вполне может очень эффективно этот объект разбить, не итерируясь по всему range. Донетовский Range, считай, простой набор yield return.
  • Переход с Java на Scala (Clojure, Haskell, Erlang ..) как повышение абстракции программирования
    0
    Для варианта 3 есть замечательные Unicode Character Properties регексы. "\p{Lu}*" для uppercase letter, например.
  • Создаем NUnit тесты в BDD стиле
    0
    Там, кстати, есть и сборки, которые позволяют это все пристегнуть — github.com/TargetProcess/Target-Process-Plugins/blob/master/Libs/NBehave/Tp.Testing.Common.NBehave.dll :)