Серьёзно? Все сезоны сериала построены по одному шаблону: команда что-то делает, потом случается «большой облом» и в конце сезона они как-то почти выкручиваются, но оставляют задел и нерешённые задачи на следующий сезон. Что вы такого увидели в заголовке, чего вы не ожидали?
Несколько недель использую Rider для работы. Кончено, приходится постоянно переключаться в VS, но не жалуюсь, понимаю, что это EAP. Однако, очень страдаю из-за обилия мадженты в коде. Очень хочется более спокойную тему, как в VS.
Я скорее апеллировал к утверждению о том, что нужно быть участником и призёром программистских олимпиад, этим я не занимался ни до, ни во время обучения. Так-то раньше практически все вузы имели подобные программы, по которым можно было поступить до общих экзаменов.
Я в 2006 году поступал, там был просто отдельный отбор в середине учебного года. Нужно было решить какие-то задачки, после математического кружка это было несложно.
Если не ошибаюсь, нельзя было выбрать кафедру во время общих вступительных экзаменов летом, но в сентябре, учась в 11 классе, можно было записаться на «особый» отбор, пройти два уровня экзаменов и уже в феврале считаться зачисленным на кафедру.
Я учился на ИТП КТ, и пришёл именно «с улицы». Программированием занимался для себя, в олимпиадах не учавствовал, да этого и не требовалось для поступления.
Так и решили: нет нового синтаксиса — нет проблем :)
Давайте ещё раз попробую.
Раньше была контрукция case something: return;. Эта конструкция возвращала из метода, в котором объявлен switch, а не из ветви case.
Так же раньше была конструкция:
void Foo()
{
Func<int, int> name = x => {return x;}; // возвращаем не из Foo, а из x
x(); // после return остаёмся в Foo
return; // а теперь возвращаем из Foo
}
она выглядит так, будто мы возвращаем из блока case (который тут неявный), а не из Foo.
Выходит, схожий синтаксис, а поведение отличается. В одном случае выражение не управляет control flow родителя, а во втором случае управляет. Consistency языка нарушается. Вот и решили отказаться в пользу уже существующего синтаксиса.
Я не говорю, что это самая лучшая аргументация, и просто объясняю, чем руководствовались в данном случае.
Верно, тонкостей много. Возьмём тот же пример с rust-подобным синтаксисом. Как я понял, Вы говорите про что-то такое:
switch(c)
{
x => Console.WriteLine(x);
}
Такой вариант обсуждался и его не приняли из-за того, что сейчас из case можно вернуть значение:
string Foo(bool x) {
switch (x) {
case true : return "hello";
case false: return "hi";
}
}
в данном случае return возвращает значение из метода Foo, в котором объявлена конструкция switch.
С другой стороны выражение x => return 10; похоже на объявление лямбда выражения, где return возвращает из этого выражения, а не из метода, в котором объявлено это выражение.
Я понимаю, это достаточно скучный тред, я в нём повторяю одно и тоже, однако меня не слышат. Команда C# не ломает компиляцию существующего кода, в том числе этим обусловлен такой корявый синтаксис в некоторых местах.
Вариантов развивать язык — куча, но конкретная команда выбрала именно такую стратегию для C#. Вот и всё. Если вы готовы выключать функции флажками, добавлять префиксы к именам, заниматься рефакторингами после смены компилятора — хорошо, с вами никто не спорит, но C# дизайнится с оглядкой на другие вещи. Иными словами: я начал тред объяснив почему сделано именно так, а мне все бросились объяснять, что они сделали бы иначе.
P.S. Пример с builder достаточно простой, я не знаю, зачем вы мне объясняете, что его не будут вводить.
Ничего преступного там и нет, обычный код. Я его привёл в пример, как два достаточно крупных проекта, написанных на C#, где не используются префиксы в именах локальных переменных. Конкретно эти два проекта сломаются, если ввести ключевое слово builder.
Октопус бесплатен для маленьких команд (а большие зарабатывают достаточно). И да, вам нужно хранилище артефактов, но если у вас уже есть билд-сервер, то добавить ему степ Octopack и публикацию артефакта не очень трудно. Бесплатный ProGet или любой другой in-house сервис подойдёт.
Кроме того вы получаете нормальные дашборды, нотификации, хранение скриптов, простые роллбэки и шифрование конфигураций. Поверьте, те инвестиции, которые требуются на настройку и развёртку этого решения, окупаются очень быстро. Деплой перестаёт быть проблемой.
Посмотрите на их дэмо сервис, поиграйте. Оно того стоит.
Есть же Octopus Deploy, который скачает артефакт билда, вытащит одну машину из лоад-балансера, удалит текущую версию сайта, распакует новую версию, заменит плейс-холдеры в конфигурационных файлах, запустит сайт и если сайт ответит на простой heals check, то машина вернётся в лоад-балансер.
Таким образом вы добиваетесь стабильно повторяемых релизов, ни каких шаманств с симлинками, нет нужды хранить несколько версий сайта на сервере.
Кстати, этот шаблон можно обобщить для большинства сериалов, к сожалению.
Если не ошибаюсь, нельзя было выбрать кафедру во время общих вступительных экзаменов летом, но в сентябре, учась в 11 классе, можно было записаться на «особый» отбор, пройти два уровня экзаменов и уже в феврале считаться зачисленным на кафедру.
Увы, бесконечно не получится.
Так и решили: нет нового синтаксиса — нет проблем :)
Давайте ещё раз попробую.
Раньше была контрукция
case something: return;
. Эта конструкция возвращала из метода, в котором объявленswitch
, а не из ветвиcase
.Так же раньше была конструкция:
теперь если ввести конструкцию
она выглядит так, будто мы возвращаем из блока
case
(который тут неявный), а не изFoo
.Выходит, схожий синтаксис, а поведение отличается. В одном случае выражение не управляет control flow родителя, а во втором случае управляет. Consistency языка нарушается. Вот и решили отказаться в пользу уже существующего синтаксиса.
Я не говорю, что это самая лучшая аргументация, и просто объясняю, чем руководствовались в данном случае.
Верно, тонкостей много. Возьмём тот же пример с rust-подобным синтаксисом. Как я понял, Вы говорите про что-то такое:
Такой вариант обсуждался и его не приняли из-за того, что сейчас из
case
можно вернуть значение:в данном случае
return
возвращает значение из методаFoo
, в котором объявлена конструкцияswitch
.С другой стороны выражение
x => return 10;
похоже на объявление лямбда выражения, гдеreturn
возвращает из этого выражения, а не из метода, в котором объявлено это выражение.Если взглянуть на rust-подобную конструкцию:
семантически похоже на то, что мы возвращаем не из
Foo
, а из ветвиcase
.Я понимаю, это достаточно скучный тред, я в нём повторяю одно и тоже, однако меня не слышат. Команда C# не ломает компиляцию существующего кода, в том числе этим обусловлен такой корявый синтаксис в некоторых местах.
Вариантов развивать язык — куча, но конкретная команда выбрала именно такую стратегию для C#. Вот и всё. Если вы готовы выключать функции флажками, добавлять префиксы к именам, заниматься рефакторингами после смены компилятора — хорошо, с вами никто не спорит, но C# дизайнится с оглядкой на другие вещи. Иными словами: я начал тред объяснив почему сделано именно так, а мне все бросились объяснять, что они сделали бы иначе.
P.S. Пример с
builder
достаточно простой, я не знаю, зачем вы мне объясняете, что его не будут вводить.Ничего преступного там и нет, обычный код. Я его привёл в пример, как два достаточно крупных проекта, написанных на C#, где не используются префиксы в именах локальных переменных. Конкретно эти два проекта сломаются, если ввести ключевое слово
builder
.Октопус бесплатен для маленьких команд (а большие зарабатывают достаточно). И да, вам нужно хранилище артефактов, но если у вас уже есть билд-сервер, то добавить ему степ Octopack и публикацию артефакта не очень трудно. Бесплатный ProGet или любой другой in-house сервис подойдёт.
Кроме того вы получаете нормальные дашборды, нотификации, хранение скриптов, простые роллбэки и шифрование конфигураций. Поверьте, те инвестиции, которые требуются на настройку и развёртку этого решения, окупаются очень быстро. Деплой перестаёт быть проблемой.
Посмотрите на их дэмо сервис, поиграйте. Оно того стоит.
Очень хрупкое решение, если честно.
Есть же Octopus Deploy, который скачает артефакт билда, вытащит одну машину из лоад-балансера, удалит текущую версию сайта, распакует новую версию, заменит плейс-холдеры в конфигурационных файлах, запустит сайт и если сайт ответит на простой heals check, то машина вернётся в лоад-балансер.
Таким образом вы добиваетесь стабильно повторяемых релизов, ни каких шаманств с симлинками, нет нужды хранить несколько версий сайта на сервере.
Visual Studio и Xamarin — бесплатные.