Pull to refresh

Comments 29

Тоже возни такой вопрос.
Неужели такой код:
  var s = string.Join(" ", "Числа", 1, 2, 3) + 
   " (" + string.Join(", ", 1, 2, 3) + ")";
  Trace.WriteLine(s);

хуже чем:
  var sm = SM.New+"Числа"-1-2-3;
  var rr = new int[] { 1, 2, 3 }; 
  sm = sm+" ("+rr.Sep(", ")+')';
  Trace.WriteLine(sm);
В строке
var sm = SM.New+"Числа"-1-2-3;

не используются скобки и запятые, экономятся нажатия пальцев!
Зато уменьшается читабельность. Сходу и не поймешь, что тут и операторы перегружены, и как они работают.
кстати String.Join находится в mscorelib, и вы думаете изначально нативный оптимизированный код медленнее вашего велосипеда?
Вы это серьезно? ради интереса производительность замерьте, вашего и стандартного.

Надо писать String.Join. В C# 6 сделали возможность писать using System.String, спасибо, но поздно.

Вот только не using System.String, а using static System.String. У автора в статье такая же ошибка: using static System.Math.

Чем поздно, вы тоже поклонник велосипедов и костылей как автор?
Табличку «Сарказм» забыли, ибо тут топикстартер с такой серьезностью говорит за экономию нажатий пальцев, даже путаешь, где серьезно, а где нет
Спасибо, но поздно.

Не "поздно", а самое время выкинуть велосипеды, упрощая код.


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

TPL, Rx.net?


public static class IEnumerableExtensions {
    public static IEnumerable Sep(this IEnumerable objects, object separator) {
      bool first = true;
      foreach (var obj in objects) {
        if (first) first = false;
        else yield return separator;
        yield return obj;
      }
      yield break;
    }
  }

  var rr = new int[] { 1, 2, 3 }; 
  rr.Sep(", ")

Здравствуй, боксинг.

Про string.Join уже написали.
Велосипед с TimerTask заменяется на
async Task Start() {
      await Task.Delay(100500);
      Title = "Starting 1";
      await Task.Delay(1000);
      Starting1();
      await Task.Delay(1000);
      ///...
}

Да еще и с поддержкой отмены через CancellationToken. И даже можно сделать опрашивающий прогресс бар.
async Task Start() {
      while(!isDone)
     {
            UpdateProgressBar();
            await Task.Delay(1000)
     }
}

IntRangeNotifyCollection — прямо помощник на каждый день.
Мне вообще непонятно вот это «Спасибо, но поздно»… Что значит поздно? Давайте и async \ await не использовать — поздно же.
У меня уже есть решение, которым я полностью удовлетворен. Потребуется веский повод, чтобы перейти на появившийся в языке функционал.
Избавление от велосипедов, которые полностью покрываются нативными средствами языка (платфомы) это очень веский повод. Мы, конечно, говорим о новых проектах, а не о переписывании существующих. Там надо отдельно анализировать. Но начинать новые продукты с велосипедом, который реализован нативно — имхо неразумно.

Если мне приходится обращаться к старым проектам и это разумно — первое что я делаю — быстренько пробегаюсь и заменяю вещи по подсказкам решарпера (типа «В C# 6 появилась возможность вписывать аргументы внутрь строки»). Это недолго даже на больших проектах. Или .? Или nameof,… да многое. Код становится читабельнее, что есть просто великолепно.

Старый код? Ок. Нельзя проапгрейдить? Ок. Но «спасибо поздно» — это… неразумно, имхо.
А наличие велосипеда, веская причина им пользоваться? Вам знакомо слово рефакторинг?
Спасибо, но
всё это уже поддерживается средствами языка, работает быстрее и часто выглядит более читаемо…

Настораживает необходимость частого использования метода Limit в приложении.
Представляется нечто такое.


var fixedValue = badValue.Limit(MinVal, MaxVal);

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

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

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

Однако, опыт разработки своих велосипедов помогает и хорошему — оттачивает навык разработки по SOLID, и позволяет научиться разрабатывать не приложения, а библиотеки/фреймворки, которыми приложения пользуются.
Другое дело, в большинстве случаев прикладные программисты разрабатывают приложения, фичи приложений, но не библиотеки, а разработка приложения в виде набора независимых компонентов может быть сочтена руководством оверхедом.
И еще один момент: как при работе в команде вы будете убеждать участников пользоваться своими велосипедами?
А что, если у других тоже есть свои велоcипеды?

Кстати, в том числе поэтому я и полагаю, что полноценная развитая платформа разработки обязана иметь богатую стандартную библиотеку практически на все случаи жизни, и язык должен иметь достаточно сахара, чтобы языковые конструкции можно было записывать кратко.
Приведенные велосипеды во многом еще и являются образчиками «как не надо делать».

Например:
public static SM New { get { return new SM(); } }

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

В вашем случае нужно не свойство SM New, а метод SM New(), или — зачем метод? — чем не подходит создание объекта через конструктор — new SM()?

Рекомендую почитать Рихтера и ознакомиться с различными best practices для C#.
А то вы не только создаете велосипеды, но и еще и пытаетесь натянуть на C# синтаксис и подходы/практики языков, с которыми раньше работали.

Вопрос на засыпку:
как нужно доработать StringMaker, чтобы он мог форматировать строки не только в текущей культуре? с учетом того, что не все объекты, которые вы добавляете в SM, могут поддерживать форматирование с учетом культуры.
Метод это же писать аж целых две скобки, а через конструктор, это еще и new писать.
Именно так. На C++ это был макрос, просто 'SM'.
Вы вообще не понимаете, что это плохо? производительность, плохой стиль, нарушение правил перегрузки операторов, просто ради меньше писать? Или вы табличку сарказм забыли. Вы по минусам это не поняли? Переименуйте статью, как не надо писать на С#. будет ближе к истине.

он и так написал new. Только два раза — сначала в определении метода. Скобку надо писать одну — Вторую IDE дописывает :)

А почему у вас класс именуется как интерфейс? Не по канонам.
Sign up to leave a comment.

Articles