Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 05:08
Оценка: :)
В языке много бессмысленных ритуалов, например после каждой строчки нужно ставить ;. Обязательно. Вопрос зачем?
Еще один ритуал. При вызове функции обязательно нужно ставить (). Даже если функция не является мутатором. То есть выражение вида:

var allIds = result.SelectMany(x => x).Distinct().ToList();

Можно было бы переписать:
var allIds = result.SelectMany.Distinct.ToList


А если убрать обязательность var, то совсем здорово:
allIds = result.SelectMany.Distinct.ToList


Легко читается, да и пишется тоже. Есть еще один ритуал, которые все много раз делали:
public class Some
{
   private int val1;
   private int val2;
   public Some(int val1, int val2)
   {
    this.val1 = val1;
    this.val2 = val2;
   }
}

Могло бы выглядеть как:
public class Some
{
   public Some(int val1, int val2)
   {
   }
}

То есть наличие в конструкторе означает наличие у типа этих полей.
Что думаете? Есть ли основания у подобных претензий?
Отредактировано 17.07.2016 20:38 VladD2 . Предыдущая версия .
Re: Несколько соображений по дизайну C#
От: Sinix  
Дата: 11.07.16 05:57
Оценка: 5 (2) +9 :))) :))) :))
Здравствуйте, Gattaka, Вы писали:

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

Ну а как multiline statement оформлять будем?

G>Еще один ритуал. При вызове функции обязательно нужно ставить (). Даже если функция не является мутатором. То есть выражение вида:

Свойства, вложенные вызовы — как их оформлять?

G>А если убрать обязательность var, то совсем здорово:

Ну и опечатка определяет новую переменную, прэлестно.

G>То есть наличие в конструкторе означает наличие у типа этих полей.

Primary .ctors, обещают в 8м шарпе.

G>Что думаете? Есть ли основания у подобных претензий?

Неа. Родная делянка c-style языков — инфраструктурный код. Который не тяп ляп и забыл, а который пишется один раз и поддерживается десятилетиями. Т.е. цена поиска / исправления ошибки на пару-тройку порядков больше, чем немножко сэкономленных нажатий на клавиатуру.

Родная делянка шарпа — кговавый энтерпрайз, где всё точно так же, только тратить время разработчика на борьбу с языком вместо полезного выхлопа — вообще не вариант. Надеюсь не надо объяснять, почему

Для "я умный и не делаю ошибок" и прочей хипстоты есть няшный php и js, которые сами по себе прокляты достаточно, чтоб пара-тройка ошибок на файл что-либо меняла
Re[2]: Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 06:06
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Gattaka, Вы писали:


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

S>Ну а как multiline statement оформлять будем?
Вот тогда и поставите, но зачем после каждой строчки?

G>>Еще один ритуал. При вызове функции обязательно нужно ставить (). Даже если функция не является мутатором. То есть выражение вида:

S>Свойства, вложенные вызовы — как их оформлять?
Вот тогда и поставите, но зачем каждый раз? Это что нормально, что свойство и функция у вас имеют одно имя? ИМХО нет. В чем отличие свойства от функции не мутатора? Прямо кардинальное?

G>>А если убрать обязательность var, то совсем здорово:

S>Ну и опечатка определяет новую переменную, прэлестно.
Современные IDE позволяют вам ловить такие ситуации.

G>>То есть наличие в конструкторе означает наличие у типа этих полей.

S>Primary .ctors, обещают в 8м шарпе.
Неплохо, неплохо... к 8-й версии созрели.
Re[3]: Несколько соображений по дизайну C#
От: Qbit86 Кипр
Дата: 11.07.16 06:45
Оценка:
Здравствуйте, Gattaka, Вы писали:

S>>Ну а как multiline statement оформлять будем?

G>Вот тогда и поставите, но зачем после каждой строчки?

Попробуй Visual Basic, там вроде такое есть.

G>Вот тогда и поставите, но зачем каждый раз?


Отсутствие скобочек трактутся типа как η-конверсия:
List<T> ys = xs.ToList();
Func<List<T>> f = xs.ToList;


S>>Ну и опечатка определяет новую переменную, прэлестно.

G>Современные IDE позволяют вам ловить такие ситуации.

В такой ошибочной ситуации нет чего-то противозаконного, что тут можно было бы ловить. IDE не читает мысли, хотел ли ты переприсвоить старую переменную, или ввести новую.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Несколько соображений по дизайну C#
От: Sinix  
Дата: 11.07.16 06:48
Оценка: 1 (1) +2
Здравствуйте, Gattaka, Вы писали:

G>Вот тогда и поставите, но зачем после каждой строчки?


Кэп: потому что правило "statements should end with a ;" гораздо проще и практичнее, чем вот это убожество

Just don't break the line between the "return" keyword and what you're returning, or <...> will end the line before you intend to.

(угадай язык по граблям, ага).

G>Вот тогда и поставите, но зачем каждый раз? Это что нормально, что свойство и функция у вас имеют одно имя? ИМХО нет. В чем отличие свойства от функции не мутатора? Прямо кардинальное?


Кэп #2: любая возможность делать выбор означает
1. Необходимость делать выбор
2. Возможность ошибиться при выборе.
3. Принципиальную невозможность отследить подобные ошибки, т.к. ошибки являются валидным кодом с точки зрения компилятора.

С практической точки зрения польза от подобных приседаний ровно одна: почесать ЧСВ. "Я продуктивный, я экономлю ресурс клавиатуры", ага

G>Современные IDE позволяют вам ловить такие ситуации.

Ну, т.е. объявление переменной уже требует IDE для отлова элементарных ошибок.
Как по мне, автор подобного языка не заслуживает сепукку, только пожзизненная поддержка своего же творения, не меньше.

S>>Primary .ctors, обещают в 8м шарпе.

G>Неплохо, неплохо... к 8-й версии созрели.
Ну да, хватит время на мелочёвку — сделают. Не хватит — в 9й переедет.
Re[4]: Python
От: Qbit86 Кипр
Дата: 11.07.16 06:51
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну, т.е. объявление переменной уже требует IDE для отлова элементарных ошибок.

S>Как по мне, автор подобного языка не заслуживает сепукку, только пожзизненная поддержка своего же творения, не меньше.

Ты про Питон, штоле?
Глаза у меня добрые, но рубашка — смирительная!
Re: Несколько соображений по дизайну C#
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 11.07.16 06:55
Оценка: 1 (1)
Здравствуйте, Gattaka, Вы писали:

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

Добро пожаловать в котлин
Re[4]: Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 06:58
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Кэп: потому что правило "statements should end with a ;" гораздо проще и практичнее, чем вот это убожество

S>

S>Just don't break the line between the "return" keyword and what you're returning, or <...> will end the line before you intend to.

S>(угадай язык по граблям, ага).
А теперь посмотрите на популярность языков в github. У самого навороченного пакета на C# там порядка 6 тыс звезд. У JavaScript и тому подобных порядка 30 тыс. — норма. Где-то такой порядок... И все это потому, что такой подход банально удобнее. Я ведь предлагаю вам в случае переноса — ставить ;. Тогда проблем нет.

G>>Вот тогда и поставите, но зачем каждый раз? Это что нормально, что свойство и функция у вас имеют одно имя? ИМХО нет. В чем отличие свойства от функции не мутатора? Прямо кардинальное?


S>Кэп #2: любая возможность делать выбор означает

S>1. Необходимость делать выбор
S>2. Возможность ошибиться при выборе.
S>3. Принципиальную невозможность отследить подобные ошибки, т.к. ошибки являются валидным кодом с точки зрения компилятора.

S>С практической точки зрения польза от подобных приседаний ровно одна: почесать ЧСВ. "Я продуктивный, я экономлю ресурс клавиатуры", ага

Не только экономия на наборе кода. Но и читаемость, отсутвие в коде все лишнего bull shita. Код содержит только то, что хотел написать программист, никаких тебе технических конструкций.

G>>Современные IDE позволяют вам ловить такие ситуации.

S>Ну, т.е. объявление переменной уже требует IDE для отлова элементарных ошибок.
S>Как по мне, автор подобного языка не заслуживает сепукку, только пожзизненная поддержка своего же творения, не меньше.
А вы часто пишите на C# без IDE? Ну если нет IDE, давайте тогда вернем венгерскую нотацию...

S>Ну да, хватит время на мелочёвку — сделают. Не хватит — в 9й переедет.

Ну да, а пока будете горбиатится и делать мартышкин труд по копированию кода...
Re: Было в Симпсонах
От: Qbit86 Кипр
Дата: 11.07.16 06:58
Оценка: 3 (1)
Здравствуйте, Gattaka, Вы писали:

G>Что думаете? Есть ли основания у подобных претензий?


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


Visual Basic

G>Еще один ритуал. При вызове функции обязательно нужно ставить (). Даже если функция не является мутатором.


Pascal

G>А если убрать обязательность var, то совсем здорово:


Python

G>То есть наличие в конструкторе означает наличие у типа этих полей.


F#
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: Python
От: Sinix  
Дата: 11.07.16 06:58
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Ты про Питон, штоле?

На эти грабли много кто наступал, и не первый десяток лет как бы
Re[4]: Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 07:01
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Попробуй Visual Basic, там вроде такое есть.

Там куча своих недостатков.

G>>Вот тогда и поставите, но зачем каждый раз?


Q>Отсутствие скобочек трактутся типа как η-конверсия:

Q>
Q>List<T> ys = xs.ToList();
Q>Func<List<T>> f = xs.ToList;
Q>

И это здорово, почему бы не пойти дальше. Сделать шаг вперед и в строчке выше не писать xs.ToList?

S>>>Ну и опечатка определяет новую переменную, прэлестно.

G>>Современные IDE позволяют вам ловить такие ситуации.

Q>В такой ошибочной ситуации нет чего-то противозаконного, что тут можно было бы ловить. IDE не читает мысли, хотел ли ты переприсвоить старую переменную, или ввести новую.

Да вы элементарно выставляете курсор на переменную и ее использование подсвечивается. Либо найти использования.
Re[2]: Было в Симпсонах
От: Gattaka Россия  
Дата: 11.07.16 07:01
Оценка:
А на самом деле читаю книгу по Scala
Re[2]: Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 07:03
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Здравствуйте, Gattaka, Вы писали:


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

W>Добро пожаловать в котлин
Да, ребята, вы молодцы!
Re: Несколько соображений по дизайну C#
От: Sinatr Германия  
Дата: 11.07.16 07:18
Оценка: +4
Здравствуйте, Gattaka, Вы писали:

"Ритуалы" — это правила, большинство из них перешли из С. Когда вы предлагаете с колокольни что-то поменять вы скорее всего и не подозреваете о многочисленных неоднозначностях, которые ваши "упрощения" внесут в язык. C# наследник C, потому много синтаксиса скопировано и это удобно: программистам, разработчикам компилятора и VS (Intellisense).

G>var allIds = result.SelectMany.Distinct.ToList


Мне хочется видеть методы (vs fields/properties). Какого типа allIds тут — string или Action?

G>allIds = result.SelectMany.Distinct.ToList


Что если уже есть член (member) allIds типа Action? Выдать предупреждение (имя уже используется) или все-таки присвоить?

G>Могло бы выглядеть как:

G>public class Some
G>{
G> public Some(int val1, int val2)
G> {
G> }
G>}
G>[/cs]

Это создаст поля, а что делать со свойствами? Экономя на явном объявлении вы вносите ограничения (val1 — private? static? volatile? etc.). Для специфических случаев впрочем удобно, но должен быть спрос на такое, чтобы большие дяди внесли это в спецификацию. Как по мне абсолютно бесполезная штука (сложнее читать код, да и property я используя 50/50).

G>Что думаете? Есть ли основания у подобных претензий?


Попробуйте предложить одно за раз изменение разработчикам языка. Если фишка интересная — вас поддержат. Но скорее всего подобное уже приходило кому-то в голову и скорее всего было раскритиковано/отложено. Async/await, lock, using — полезные фишки, экономящие тонны кода и защищающие от ошибок. То, что вы пока предлагаете — экономия на паре символов, начните называть члены класса в стиле a(), b() и вы сэкономите несоизмеримо больше, чем давая членам правильные имена, впрочем очевидно чем вы пожертвуете в этом случае.
---
ПроГLамеры объединяйтесь..
Re[5]: Primary constructors
От: Qbit86 Кипр
Дата: 11.07.16 07:22
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>Да вы элементарно выставляете курсор на переменную и ее использование подсвечивается. Либо найти использования.


Это если знать, что искать. Даже в Scala есть def, val, var, и это правильно. В Python и JavaScript можно не, и с этим мучаются; это критикуемая часть языка.

G>Есть еще один ритуал, которые все много раз делали:

public Some(int val1, int val2)
{
    this.val1 = val1;
    this.val2 = val2;
}


По-моему, ни разу. Всегда были проверки каких-то requirements с выбрасыванием Argument(Null)Exception.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: Несколько соображений по дизайну C#
От: Sinix  
Дата: 11.07.16 07:32
Оценка: 3 (1) +1 :)
Здравствуйте, Gattaka, Вы писали:

G>А теперь посмотрите на популярность языков в github. У самого навороченного пакета на C# там порядка 6 тыс звезд. У JavaScript и тому подобных порядка 30 тыс. — норма. Где-то такой порядок...


Всё проще, количество лайков отражает количество людей, которые при обсуждении конкретного косяка в качестве возражения приводят количество звёздочек в репо

Сорри, не удержался. Если серьёзно — шарп не яваскрипт. Разные целевые аудитории, разные решаемые задачи, разный уровень квалификации для default dev. Если на это закрыть глаза — обсуждаем фитню, которая к реальности не имеет никакого отношения. Если не закрывать — опять-таки обсуждаем фигню из разряда "почему кошка не собака?".

G>Не только экономия на наборе кода. Но и читаемость, отсутвие в коде все лишнего bull shita. Код содержит только то, что хотел написать программист, никаких тебе технических конструкций.

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

Вот примерно такую экономию реурсов мозга вы и предлагаете. И добивающий — в тексте 4 ошибки, приятного поиска.


G>А вы часто пишите на C# без IDE? Ну если нет IDE, давайте тогда вернем венгерскую нотацию...


Часто. Своя/чужая документация, код на гитхабе, код в referencesource / выхлопе ilspy. Не говоря уж о просто чужом коде в IDE. В любом более-менее крупном проекте это обычно треть-половина работы.

С шарпом при этом никаких проблем, если конечно автор понимал, что пишет. Если не понимал — никакая IDE не спасает, увы


G>Ну да, а пока будете горбиатится и делать мартышкин труд по копированию кода...

Человек, который не освоил студию, вполне заслуживает горбатиться и делать мартышкин труд. Проблема не в инструментах, проблема в том, чтобы уметь их использовать.
Re[6]: Несколько соображений по дизайну C#
От: Gattaka Россия  
Дата: 11.07.16 07:56
Оценка: -1 :)
Здравствуйте, Sinix, Вы писали:

S>Сорри, не удержался. Если серьёзно — шарп не яваскрипт. Разные целевые аудитории, разные решаемые задачи, разный уровень квалификации для default dev. Если на это закрыть глаза — обсуждаем фитню, которая к реальности не имеет никакого отношения. Если не закрывать — опять-таки обсуждаем фигню из разряда "почему кошка не собака?".


G>>Не только экономия на наборе кода. Но и читаемость, отсутвие в коде все лишнего bull shita. Код содержит только то, что хотел написать программист, никаких тебе технических конструкций.

S>кэп точки в предлождениях и прочие знаки препинаания никак не спосоствуют читаемости ведь для любого и так понятно что имел в виду автор спасибо за внимание.

Вам должно быть такой код еще больше понравится
var some = Call() hara krishna
some.DoWork() krishna hari


S>Часто. Своя/чужая документация, код на гитхабе, код в referencesource / выхлопе ilspy. Не говоря уж о просто чужом коде в IDE. В любом более-менее крупном проекте это обычно треть-половина работы.

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

S>С шарпом при этом никаких проблем, если конечно автор понимал, что пишет. Если не понимал — никакая IDE не спасает, увы


G>>Ну да, а пока будете горбиатится и делать мартышкин труд по копированию кода...

S>Человек, который не освоил студию, вполне заслуживает горбатиться и делать мартышкин труд. Проблема не в инструментах, проблема в том, чтобы уметь их использовать.
Но это ведь еще и читать надо.
Re[5]: Несколько соображений по дизайну C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.07.16 08:00
Оценка: +1
Здравствуйте, Gattaka, Вы писали:

G>И это здорово, почему бы не пойти дальше. Сделать шаг вперед и в строчке выше не писать xs.ToList?


Потому что метод без скобочек означает method group conversion.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: Несколько соображений по дизайну C#
От: Sinix  
Дата: 11.07.16 08:17
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>Вам должно быть такой код еще больше понравится


Мала-мала будет. Для эзотерики есть куда более красивые языки (см hello world source).


S>>Часто. Своя/чужая документация, код на гитхабе, код в referencesource / выхлопе ilspy. Не говоря уж о просто чужом коде в IDE. В любом более-менее крупном проекте это обычно треть-половина работы.

G>Стоп, вы контекст не теряйте, пожалуйста. Когда вы читаете код на гитхабе вы только читаете. Вы не можете опечататься когда читаете.

А, пардон, переклинило. Смысл в том, что код чаще читается, чем пишется. Напечатать-то что угодно можно, дело нехитрое. Проблема в том, чтобы оно потом читалосьи поддерживалось легко.


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

G>Но это ведь еще и читать надо.

Ну да. Уже написали выше, тож продублирую. Конструктор практически никогда не ограничивается простым присваиванием полей. Валидация, xml-документация, ещё какая-нибудь логика. Смысл экономить пару строк, чтобы вскоре тратиь время на удаление этого сахара и написание нормального конструктора?
Re[8]: Локальность контекста
От: Qbit86 Кипр
Дата: 11.07.16 08:23
Оценка: +1
Здравствуйте, Sinix, Вы писали:

G>>Стоп, вы контекст не теряйте, пожалуйста. Когда вы читаете код на гитхабе вы только читаете. Вы не можете опечататься когда читаете.

S>А, пардон, переклинило. Смысл в том, что код чаще читается, чем пишется.

Это неважно, в браузере код читается, или в IDE, проблема та же.
someVar = 1729
... A lot of lines of code ...
sameVar = 19937
...

Хочется, чтобы при чтении последнего присваивания было понятно, происходит ли объявление новой переменной, или изменение какой-то старой.
Глаза у меня добрые, но рубашка — смирительная!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.