Re: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 04:53
Оценка: +5
Здравствуйте, Аноним, Вы писали:

А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


1. Потому что так короче. Строка кода будет содержать больше "смысла", вместо того, чтобы угождать компилятору.
2. Наглядность должна быть в реализации бизнес-логики, а не в перекладывании объектов/значений из одних мест в другие:
var firstName = person.FirstName;
if(nameChecker.ConfirmName(firstName))
{
  ...
}

В этом куске кода person.FirstName может быть string, а может быть и объектом PersonFirstName. Обратите внимание — это нифига не влияет ни на локальную firstName, ни на вызов ConfirmName. Если вам так важно посмотреть что же там за тип — возьмите и посмотрите. Но при чтении конкретно этой логики, ИМХО, абсолютно не интересно какой там тип.
Re[2]: Почему var лучше чем явное указание типа?
От: HowardLovekraft  
Дата: 24.08.12 06:34
Оценка: 2 (2) +2
Здравствуйте, Doc, Вы писали:

Doc>Смотря в какой ситуации. Например, тут даже var вреден, т.к. тип age с ходу не ясен:

Doc>
var age = this.GetUserAge();

Всегда удивлял этот аргумент.
Если я просто первый раз вижу в глаза код, мне пофигу, какой тип у `age`, а так же еще у сотни переменных, потому что не запомню. Если же цель больше, чем просто посмотреть, то определение типа переменной — это мизер по сравнению с тем, чтобы понять алгоритм.
Re[2]: Почему var лучше чем явное указание типа?
От: ylem  
Дата: 24.08.12 03:46
Оценка: +4
Doc>Смотря в какой ситуации. Например, тут даже var вреден, т.к. тип age с ходу не ясен:
Doc>
var age = this.GetUserAge();


А для чего знать, каким типом в CLR представлен возраст?
К чему не надо он ведь потом неявно не приведется. А если приведется, то и объявление типа уповать вредно.
Re: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 23.08.12 18:54
Оценка: +1 -2
Здравствуйте, Аноним, Вы писали:

А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


Смотря в какой ситуации. Например, тут даже var вреден, т.к. тип age с ходу не ясен:
var age = this.GetUserAge();

А вот тут:
var myList = new List<Tuple<string, int>>();

полезен — и тип переменной понятен и строка короче чем:
List<Tuple<string, int>> myList = new List<Tuple<string, int>>();


В итоге, лично я подставляю var там где тип явно читается и без его явного указания.
Re: Почему var лучше чем явное указание типа?
От: Nikolay_P_I  
Дата: 24.08.12 04:49
Оценка: +1 :))
Здравствуйте, Аноним, Вы писали:

А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


У меня вообще с var редко получается встречаться.
Потому как обычно программируется слева-направо.
Распишу по шагам:

1) Псевдокод типа //получить возраст клиента (Age, используем здешний пример)
2) Пишем Age clientAge = this.GetUserAge(); На этот момент никакого GetUserAge() еще нет, он не был ранее нужен.
3) Создаем рефакторингом this.GetUserAge() с NotImplementedException, заполним его позже. Причем метод создастся с правильной сигнатурой возврата, а не object.
4) Работаем с clientAge дальше.

Ну вот не могу я понять — нафига мне потом этот самый Age в var переделывать ?
var хорошо идет, когда есть готовый объект из библиотеки и функцию в нем подбираешь через intellisence, то есть заранее не знаешь — что она вернет.
Re: Почему var лучше чем явное указание типа?
От: SemiCoder США  
Дата: 26.08.12 13:31
Оценка: 3 (1) :)
Здравствуйте, Аноним, Вы писали:

А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


Имеет смысл потратить немного времени на изучение того, как сам Майкрософт продает эту фичу, вот например:
C# Coding Conventions.
Смотрите отдельный раздел посвященный Вашему вопросу — "Implicitly Typed Local Variables".

Ну и конечно — моя точка зрения такова, что если Вы выбираете платформу разработки от МС, то, согласитесь, есть смысл руководствоваться оригинальной документацией. Если какой-то тул навязывает свою модель — это по крайней мере странно. Также это опасно тем, что новички могут принять такой стиль за gospel truth и однажды за это поплатиться.
Re[4]: Почему var лучше чем явное указание типа?
От: TK Лес кывт.рф
Дата: 24.08.12 09:06
Оценка: 1 (1)
Здравствуйте, Doc, Вы писали:

Doc>var age = this.GetUserAge();

Doc>вам надо возраст увеличить на год. Ваши действия? age++? а если это string? а вдруг float?

откуда такая идея про age++? Скорее уж age.AddYears(1)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Почему var лучше чем явное указание типа?
От: VladFein США  
Дата: 23.08.12 19:01
Оценка: :)
Здравствуйте, nikov, Вы писали:

N>Вот как это объясняют разработчики ReSharper'а:


N>Varification -- Using Implicitly Typed Locals


И там же довольно интересные возражения...
Re[4]: Почему var лучше чем явное указание типа?
От: ylem  
Дата: 24.08.12 04:25
Оценка: +1
А>Чтобы быстрее вникать в исходники при прочтении.
А>Можно навести на var и узнать тип в студии, но это лишние телодвижения.

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

>>К чему не надо он ведь потом неявно не приведется.

А>Не факт. Implicit conversions никто не отменял.

Я не имел в виду, что он ни к чему не приведется. Я имел в виду, что он к чему не надо не приведется. А если приведется, то на явное объявление типа я бы уповать не стал -- слишком ненадежно.

Я вижу, что переменная называется возраст и не буду ее складывать с ростом и массой тела. И явное указание тут ничем не поможет.

На всякий случай: я не пытаюсь Вас в чем-то убедить, а только рассчитываю получить какие-нибудь примеры, которые или меня убедят в обратном, или я решу, что для меня все-таки важнее меньше букв и меньше заморачиваться "несущественными" деталями реализации.
Re[3]: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 06:34
Оценка: +1
Здравствуйте, Nikolay_P_I, Вы писали:

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


A>>1. Потому что так короче. Строка кода будет содержать больше "смысла", вместо того, чтобы угождать компилятору.

A>>2. Наглядность должна быть в реализации бизнес-логики, а не в перекладывании объектов/значений из одних мест в другие:
A>>
A>>var firstName = person.FirstName;
A>>if(nameChecker.ConfirmName(firstName))
A>>{
A>>  ...
A>>}
A>>

A>>В этом куске кода person.FirstName может быть string, а может быть и объектом PersonFirstName. Обратите внимание — это нифига не влияет ни на локальную firstName, ни на вызов ConfirmName. Если вам так важно посмотреть что же там за тип — возьмите и посмотрите. Но при чтении конкретно этой логики, ИМХО, абсолютно не интересно какой там тип.

N_P>Вот только для продолжения кода (например, строкой persons.CheckName) надо будет не просто взглянуть на код, а наехать на него и понять, что возвращает person.FirstName. Потому как persons.CheckName работает не с object, а с вполне конкретным и конечным набором типов и не факт, что var firstName он понимает.


1. Это проблема целостности API. Если в программе словом "name" называются и строки, и объекты, и при этом оба кейза есть на одном и том же уровне абстракции — это просто хреновая программа, язык тут не виноват. Вменяемо структурированная программа на каждом уровне абстракции содержит какие-то "понятия", которые между собой могут взаимодействовать. Например "NameChecker" может проверять "Name". Код на этом уровне должен писаться именно в таких терминах. В зависимости от специфики уровня, естественно, никто никого не обязывает использовать класс Name вместо string. Лишь бы в пределах уровня термины, понятия и связи были целостны и сочетаемы.

2. Ну не делайте же вид, что пишете код в ноутпаде В этом сценарии студия вам сразу покажет, что в этом месте есть проблема.
Re[3]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 24.08.12 08:18
Оценка: :)
Здравствуйте, ylem, Вы писали:

Y>А для чего знать, каким типом в CLR представлен возраст?

Y>К чему не надо он ведь потом неявно не приведется. А если приведется, то и объявление типа уповать вредно.

Удобно именно при чтении исходника. Понятно что потом есть подсказки VS, компиляция, юнит-тесты. Но тут я сразу вижу
1) Что это за тип (какие операции разрешены с ним дальше)
2) Если GetUserAge() написана не мной, и вдруг поменяет возвращаемый тип, то компилятор укажет именно на эту строку, а не неизвестно где (если везде писать var то не известно сколько и какого кода затронет одно изменение типа, т.к. все var поползут по цепочке).
Re[10]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 09:21
Оценка: :)
Здравствуйте, andyag, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Вы мой вопрос не поняли. Что _вообще_ должно быть понятно из вашего кода? Когда куда-то выкладывается какой-то кусок кода, это делается с целью пояснить конкретные аспекты конкретной ситуации.


A>Вот пример:


A>Ребята, помогите, программа падает с null pointer exception вот тут:

A>
A>YepIAmSpecifyingTheConcreteTypeExplicitly myObject = service.getMyObject();
A>

A>Ответ: "У вас service == null". Тип myObject можно не показывать. Ненужное показано, нужное — нет

A>Ребята, у меня почему-то метод возвращает null:

A>
A>MyEliteService service = ....
A>service.getMyObject(); // вот тут возвращается null
A>

A>Ответ: "Хрен его знает почему". Опять есть тип, опять он нахрен не нужен.

A>Приведите пожалуйста аналогичный пример с простеньким контекстом и с кодом. Вроде такого:


A>Ребята, я хочу итерировать в фор-иче, а оно не итерирует:

A>
A>int iThinkThisShouldBeIterable = service.getSomething();
A>foreach(int x in iThinkThisShouldBeIterable) { ... }
A>


A>Напишите своими руками аналогичный пример и вместе посмеёмся


Окей. В общем-то, я про другое немного толковал — не про то, чтобы прояснить аспекты конкретной ситуации, о чем вы подумали. А о том, что некоторый кусок кода, в котором используется var не для инициализации переменной, понимать быстрее, когда используется явное указание типа.

Например (кусок реального кода):
        public override FrameworkElement CreateCell(C1FlexGrid flex, CellType cellType, CellRange range)
        {
            var cell = base.CreateCell(flex, cellType, range);

            if (cellType != CellType.Cell) return cell;

            var notes = dataTable.BodyRows[range.Row].Cells[range.Column].Notes;
            if (!string.IsNullOrEmpty(notes))
                ToolTipService.SetToolTip(cell, 
                                          new TextBlock {
                                              Text = notes,
                                              TextWrapping = TextWrapping.Wrap
                                          });

            if (dataTable.BodyRows[range.Row].Cells[range.Column].IsReadonly)
                ((Border) cell).Background = new SolidColorBrush(Color.FromArgb(0xFF, 0xF5, 0xF5, 0xF5));

            if (dataTable.BodyRows[range.Row].Cells[range.Column].IsRowHeader)
                ((Border) cell).Background = new SolidColorBrush(Color.FromArgb(0xFF, 0xEA, 0xEA, 0xEA));

            return cell;
        }


Какого типа, по вашему переменная notes?
Может быть, стоило приложить определение типа DataCell, в котором объявлено свойство Notes?
Как вы узнаете, что Cells[] возвращает DataCell?

Но хорошо, вы можете посмотреть на строку
   Text = notes,

И понять, что свойство Text TextBlock'а это строка, но если SetToolTip будет выглядеть как:
ToolTipService.SetToolTip(cell, notes);
то, согласитесь, это будет уже не так очевидно.

Вопрос: зачем столько телодвижений, если я могу явно указать тип string?
Тем самым, я локализую всё, что мне нужно знать, в одном методе.
Поэтому.
Re[11]: Почему var лучше чем явное указание типа?
От: TK Лес кывт.рф
Дата: 24.08.12 12:05
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Вопрос: зачем столько телодвижений, если я могу явно указать тип string?


А какого типа BodyRows, Cells, range.Column, ToolTipService, а какой тип у Color и что возвращает FromArgb ?

А>Тем самым, я локализую всё, что мне нужно знать, в одном методе.


Чем таким notes выделяется?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 25.08.12 06:04
Оценка: -1
Здравствуйте, HowardLovekraft, Вы писали:

HL>Лично мне он даст понимае того, что предполагаемый автор кода — идиот и ни на йоту не приблизит к понимаю его логики.


Зато с var вы подставите свой тип и будете сами того не зная придумывать уже свою логику метода.

HL>Вам литературный прием "гипербола" знаком?


Вот и оставьте его для литературы. Потому что из того же примера, метод с 100500 var при смене одного возвращаемого типа поведет себя абсолютно не предсказуемо. И где и какая ошибка вылезет тоже неизвестно.

IMHO попытка использовать var везде это уже уход от строгой типизации объектов.
Re[6]: Почему var лучше чем явное указание типа?
От: ldarcy  
Дата: 26.08.12 02:30
Оценка: -1
Здравствуйте, Doc, Вы писали:

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


HL>>Лично мне он даст понимае того, что предполагаемый автор кода — идиот и ни на йоту не приблизит к понимаю его логики.


Doc>Зато с var вы подставите свой тип и будете сами того не зная придумывать уже свою логику метода.


вы определитесь — верите вы автору кода или нет? Если верите, то скорее всего GetUserAge вернет TimeSpan/etc и тип можно опустить и уменьшить визуальный мусор. Если не верите, то даже при указанных типах GetUserAge может возвращать возраст Луны.
Re[12]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 28.08.12 10:43
Оценка: :)
Здравствуйте, Sinclair.

Я бы хотел ответить и Вам, и TK (сообщение).
1. Мои аргументы насчет всего, что объявлено вне метода — ошибочны.
А>>Может быть, стоило приложить определение типа DataCell, в котором объявлено свойство Notes?
А>>Как вы узнаете, что Cells[] возвращает DataCell?
2. Явное определение типа все-таки лучше, чем var, поскольку оно придает коду больше надежности (обтекаемые выражения, да).
S>Я и так вижу, что делает приведённый вами код. Если Notes внезапно вернёт ILocalizableRichTextExtractor, то мне будет на это всё равно.
Я не могу с этим согласиться, т.к. если notes используется в методе, использующем object как входной параметр, то у нас все замечательно скомпилится, НО использовано будет не то, что предполагалось изначально.
Пример: SetToolTip(control, object) — есть большая разница, или мы внесем вторым параметром текст тултипа, или мы по ошибке передадим ILocalizableRichTextExtractor.ToString(). Причем, мы об этом НЕ узнаем(!), пока не увидим этот "тултип" в программе.
Явное приведение типа позволяет создать "точку уверенности в типе", поскольку мы знаем, что если используемый тип изменится, то приложение не скомпилится, причем именно там, где объявляется переменная.
3. Можно использовать var и "ясно объявленные" переменные и все будет замечательно.
4. Когда говорят против var, то всегда упоминают снижение читаемости.
При ясных именах переменных и общей "правильной" структуре кода внутри метода, согласен, что читаемость страдает не сильно.
Но, опять же, ЕСЛИ. В общем случае, видимо, все же var.
Надежность прежде всего!
Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 23.08.12 16:51
Оценка:
Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста
Re: Почему var лучше чем явное указание типа?
От: Sharov Россия  
Дата: 23.08.12 17:06
Оценка:
Здравствуйте, Аноним, Вы писали:

Неплохая статья у Липперта на эту тему.
Кодом людям нужно помогать!
Re: Почему var лучше чем явное указание типа?
От: __kot2  
Дата: 23.08.12 18:07
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста
любое дублирование кода или данных это гемор при изменении кода — когда чтобы поменять одно, приходится еще менять и другое и третье
Re: Почему var лучше чем явное указание типа?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.08.12 18:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


Вот как это объясняют разработчики ReSharper'а:

Varification -- Using Implicitly Typed Locals
Re[2]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 03:13
Оценка:
Здравствуйте, Doc.

Аналогично.
Re[3]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 03:59
Оценка:
Здравствуйте, ylem, Вы писали:

Doc>>Смотря в какой ситуации. Например, тут даже var вреден, т.к. тип age с ходу не ясен:

Doc>>
var age = this.GetUserAge();


Y>А для чего знать, каким типом в CLR представлен возраст?

Y>К чему не надо он ведь потом неявно не приведется. А если приведется, то и объявление типа уповать вредно.

Чтобы быстрее вникать в исходники при прочтении.
Можно навести на var и узнать тип в студии, но это лишние телодвижения.
Если код не в студии, то нужно смотреть сигнатуру метода.

>К чему не надо он ведь потом неявно не приведется.

Не факт. Implicit conversions никто не отменял.
Re[5]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 05:51
Оценка:
Здравствуйте, ylem, Вы писали:

Y>В этой причине я не сомневался. Вот только зачем при чтении исходников может понадобиться знать, каким типом реализован возраст?

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

Для скорости вникания. Вообще, каждый сам для себя решает.
В той статье выше Липперт, например, ссылается на то же, что и вы.

For example, suppose you did something like this:
    var distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
Suppose the elided type is DataTable. 
Is it important to the reader to know that this is a DataTable? 
That's the key question. Maybe it is. 
Maybe the correctness and understandability of the rest of the method depends completely on the reader understanding that distributionLists is a DataTable, and not a List<Contact> or an IQueryable<Contact> or something else.

Но резюмирует тем, что
>Use explicit types if doing so is necessary for the code to be correctly understood and maintained.
В общем, читая собственный код некоторой давности инстинктивно хочется, чтобы там не было var.
Я бы хотел с вами согласиться, но, исходя из своего опыта, мне хочется ставить var в этих скользких местах.

Y>На всякий случай: я не пытаюсь Вас в чем-то убедить, а только рассчитываю получить какие-нибудь примеры, которые или меня убедят в обратном, или я решу, что для меня все-таки важнее меньше букв и меньше заморачиваться "несущественными" деталями реализации.

Same here.
Re[2]: Почему var лучше чем явное указание типа?
От: Nikolay_P_I  
Дата: 24.08.12 06:23
Оценка:
Здравствуйте, andyag, Вы писали:

A>1. Потому что так короче. Строка кода будет содержать больше "смысла", вместо того, чтобы угождать компилятору.

A>2. Наглядность должна быть в реализации бизнес-логики, а не в перекладывании объектов/значений из одних мест в другие:
A>
A>var firstName = person.FirstName;
A>if(nameChecker.ConfirmName(firstName))
A>{
A>  ...
A>}
A>

A>В этом куске кода person.FirstName может быть string, а может быть и объектом PersonFirstName. Обратите внимание — это нифига не влияет ни на локальную firstName, ни на вызов ConfirmName. Если вам так важно посмотреть что же там за тип — возьмите и посмотрите. Но при чтении конкретно этой логики, ИМХО, абсолютно не интересно какой там тип.

Вот только для продолжения кода (например, строкой persons.CheckName) надо будет не просто взглянуть на код, а наехать на него и понять, что возвращает person.FirstName. Потому как persons.CheckName работает не с object, а с вполне конкретным и конечным набором типов и не факт, что var firstName он понимает.
Re[4]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 07:11
Оценка:
Здравствуйте, andyag, Вы писали:

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


A>2. Ну не делайте же вид, что пишете код в ноутпаде В этом сценарии студия вам сразу покажет, что в этом месте есть проблема.


Может я хочу выложить тестовый кусок кода в интернете. И на какое место студия сразу покажет в этом сценарии?
Re[5]: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 07:22
Оценка:
Здравствуйте, Аноним, Вы писали:

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


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


A>>2. Ну не делайте же вид, что пишете код в ноутпаде В этом сценарии студия вам сразу покажет, что в этом месте есть проблема.


А>Может я хочу выложить тестовый кусок кода в интернете. И на какое место студия сразу покажет в этом сценарии?


Если вы выложите минимальный работающий код, иллюстрирующий то, что вы хотите донести до читателя — проблем не возникнет ни с var, ни без него. Потому что это просто валидный код.
Если вы выложите просто кусок кода, вырезанный из программы, при его вставке в студию оно будет ругаться и с var, и без него. Потому что это обрубок кода.
Или я не понимаю ваш сценарий?

Пример:
MyService myService = ...;
myService.performTrickyAction();

вместо
var myService = ...;
myService.performTrickyAction();

Есть какая-то разница? В обоих случаях видно, что есть какой-то сервис. В обоих случая видно, что у него есть как минимум 1 метод. Больше ничего не видно ни там, ни там.

Приведёте пример?
Re[3]: Почему var лучше чем явное указание типа?
От: TK Лес кывт.рф
Дата: 24.08.12 07:31
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Всегда удивлял этот аргумент.

HL>Если я просто первый раз вижу в глаза код, мне пофигу, какой тип у `age`, а так же еще у сотни переменных, потому что не запомню.

А если там будет bool age = this.GetUserAge(); тоже пофигу?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 07:53
Оценка:
Здравствуйте, andyag, Вы писали:

A>Приведёте пример?

var:
var distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);

Указание типа:
DataTable distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
или
List<Contact> distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
или
IQueryable<Contact> distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
Re[3]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 08:04
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

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


HL>Всегда удивлял этот аргумент.

HL>Если я просто первый раз вижу в глаза код, мне пофигу, какой тип у `age`, а так же еще у сотни переменных, потому что не запомню. Если же цель больше, чем просто посмотреть, то определение типа переменной — это мизер по сравнению с тем, чтобы понять алгоритм.
Это дает большее понимание контекста, в котором написана эта строка без необходимости уточнять тип переменной, наводя на var/смотря в сигнатуру метода.
Если в вашем методе сотня переменных, то это очень плохо.
Re[7]: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 08:20
Оценка:
Здравствуйте, Аноним, Вы писали:

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


A>>Приведёте пример?

А>var:
А>
А>var distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
А>

А>Указание типа:
А>
А>DataTable distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
А>или
А>List<Contact> distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
А>или
А>IQueryable<Contact> distributionLists = MyEmailStore.Contacts(ContactKind.DistributionList);
А>


Я не вижу вашего намерения. Хрен с ним, с чудовищным именем метода "Contacts", не показано зачем вообще вы его дёргаете и что потом делаете с результатом. Если ничего не делаете, distributionLists вообще не нужна. Что вы мне сообщите, написав, что там IQueryable?
Re[3]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 24.08.12 08:25
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Если я просто первый раз вижу в глаза код, мне пофигу, какой тип у `age`,


var age = this.GetUserAge();
вам надо возраст увеличить на год. Ваши действия? age++? а если это string? а вдруг float?

HL>а так же еще у сотни переменных, потому что не запомню.


Это тут причем? Явное указание как раз для того чтобы не запоминать.

HL>Если же цель больше, чем просто посмотреть, то определение типа переменной — это мизер по сравнению с тем, чтобы понять алгоритм.


Ну да. А еще именование переменной цикла userIndex мирез по сравнению с i. Но код читать и понимать удобнее.
Re[8]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 08:26
Оценка:
Здравствуйте, andyag, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Я не вижу вашего намерения. Хрен с ним, с чудовищным именем метода "Contacts", не показано зачем вообще вы его дёргаете и что потом делаете с результатом. Если ничего не делаете, distributionLists вообще не нужна. Что вы мне сообщите, написав, что там IQueryable?


Вопрос не в том, что я сообщу, а в том, все ли будет понятно без явного указания типа.
Это мне неизвестно, поэтому обозначаю тип явно.
Re[4]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 24.08.12 08:28
Оценка:
Здравствуйте, andyag, Вы писали:

A>1. Это проблема целостности API. Если в программе словом "name" называются и строки, и объекты, и при этом оба кейза есть на одном и том же уровне абстракции — это просто хреновая программа, язык тут не виноват.


У вас все используемые API написаны вами?
Re[5]: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 08:38
Оценка:
Здравствуйте, Doc, Вы писали:

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


A>>1. Это проблема целостности API. Если в программе словом "name" называются и строки, и объекты, и при этом оба кейза есть на одном и том же уровне абстракции — это просто хреновая программа, язык тут не виноват.


Doc>У вас все используемые API написаны вами?


Нет, далеко не все.
Re[9]: Почему var лучше чем явное указание типа?
От: andyag  
Дата: 24.08.12 08:49
Оценка:
Здравствуйте, Аноним, Вы писали:

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


A>>Здравствуйте, Аноним, Вы писали:


A>>Я не вижу вашего намерения. Хрен с ним, с чудовищным именем метода "Contacts", не показано зачем вообще вы его дёргаете и что потом делаете с результатом. Если ничего не делаете, distributionLists вообще не нужна. Что вы мне сообщите, написав, что там IQueryable?


А>Вопрос не в том, что я сообщу, а в том, все ли будет понятно без явного указания типа.

А>Это мне неизвестно, поэтому обозначаю тип явно.

Вы мой вопрос не поняли. Что _вообще_ должно быть понятно из вашего кода? Когда куда-то выкладывается какой-то кусок кода, это делается с целью пояснить конкретные аспекты конкретной ситуации.

Вот пример:

Ребята, помогите, программа падает с null pointer exception вот тут:
YepIAmSpecifyingTheConcreteTypeExplicitly myObject = service.getMyObject();

Ответ: "У вас service == null". Тип myObject можно не показывать. Ненужное показано, нужное — нет

Ребята, у меня почему-то метод возвращает null:
MyEliteService service = ....
service.getMyObject(); // вот тут возвращается null

Ответ: "Хрен его знает почему". Опять есть тип, опять он нахрен не нужен.

Приведите пожалуйста аналогичный пример с простеньким контекстом и с кодом. Вроде такого:

Ребята, я хочу итерировать в фор-иче, а оно не итерирует:
int iThinkThisShouldBeIterable = service.getSomething();
foreach(int x in iThinkThisShouldBeIterable) { ... }


Напишите своими руками аналогичный пример и вместе посмеёмся
Re[10]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 10:25
Оценка:
Здравствуйте, andyag.

На всякий случай: я не пытаюсь Вас в чем-то убедить, но стараюсь лучше объяснить то, что написал ранее.
Re[6]: Почему var лучше чем явное указание типа?
От: ylem  
Дата: 24.08.12 11:56
Оценка:
А>Но резюмирует тем, что

Мне больше другая строчка из резюме нравится. Про то, что:
>> Consider using var if the code emphasizes the semantic "business purpose" of the variable and downplays the "mechanical" details of its storage.

Буквально недавно надо было разбирать двоичный поток, приходящий снаружи. Там явное объявление типа Int32, Float и т.п. выглядело на мой вкус совершенно уместно (как раз "mechanical" details).
Re[12]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 24.08.12 12:49
Оценка:
Здравствуйте, TK, Вы писали:

TK>Чем таким notes выделяется?


notes просто для примера. А выделяется тем, что переменная, т.е. объявлена тут же в теле метода.
Re[5]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 24.08.12 16:18
Оценка:
Здравствуйте, TK, Вы писали:

TK>откуда такая идея про age++? Скорее уж age.AddYears(1)


Как откуда. Мы не знаем тип age. Мысль в том сообщении была про то, что при записи через var без телодвижения по уточнению типа может быть любой вариант.
Re[4]: Почему var лучше чем явное указание типа?
От: HowardLovekraft  
Дата: 24.08.12 18:47
Оценка:
Здравствуйте, TK, Вы писали:

TK>А если там будет bool age = this.GetUserAge(); тоже пофигу?

Безусловно, это бросится в глаза.
Но этот пример как раз является отличным подтверждением того, что наличие типа слева никак не влияет на понимание кода.
Ведь согласись, в разы (если на на порядок) больше времени уйдет чтоб понять, что хотел сказать автор, объявив булевую переменную в названием "age".
Re[4]: Почему var лучше чем явное указание типа?
От: HowardLovekraft  
Дата: 24.08.12 18:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это дает большее понимание контекста, в котором написана эта строка без необходимости уточнять тип переменной, наводя на var/смотря в сигнатуру метода.

Вот какое понимание контекста лично для вас даст вот этот пример?
Лично мне он даст понимае того, что предполагаемый автор кода — идиот и ни на йоту не приблизит к понимаю его логики.

А>Если в вашем методе сотня переменных, то это очень плохо.

Вам литературный прием "гипербола" знаком?
Re[7]: Почему var лучше чем явное указание типа?
От: Doc Россия http://andrey.moveax.ru
Дата: 26.08.12 03:30
Оценка:
Здравствуйте, ldarcy, Вы писали:

L>вы определитесь — верите вы автору кода или нет? Если верите, то скорее всего GetUserAge вернет TimeSpan/etc и тип можно опустить и уменьшить визуальный мусор. Если не верите, то даже при указанных типах GetUserAge может возвращать возраст Луны.


По умолчанию не верю, но и не считаю полным идиотом. Так что не надо крайностей. TimeSpan, int, UserAge — все это нормальные варианты.
Re[11]: Почему var лучше чем явное указание типа?
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.08.12 10:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Какого типа, по вашему переменная notes?

А зачем мне это знать?
Я и так вижу, что делает приведённый вами код. Если Notes внезапно вернёт ILocalizableRichTextExtractor, то мне будет на это всё равно.

А>Может быть, стоило приложить определение типа DataCell, в котором объявлено свойство Notes?

Зачем?
А>Как вы узнаете, что Cells[] возвращает DataCell?
Зачем мне это узнавать?

А>Вопрос: зачем столько телодвижений, если я могу явно указать тип string?

Зачем эти телодвижения?
А>Тем самым, я локализую всё, что мне нужно знать, в одном методе.
Всё, что мне нужно знать, я вижу и с var.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Почему var лучше чем явное указание типа?
От: WolfHound  
Дата: 28.08.12 12:28
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>И там же довольно интересные возражения...

В каком месте?

Лично я каждый день использую немерле. Там вывод типов значительно мощнее. И никаких проблем. Одни плюшки.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Почему var лучше чем явное указание типа?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.08.12 12:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

А>>Какого типа, по вашему переменная notes?

S>А зачем мне это знать?
S>Я и так вижу, что делает приведённый вами код. Если Notes внезапно вернёт ILocalizableRichTextExtractor, то мне будет на это всё равно.

Поскольку мы живем не в идеальном мире, то часто интерфейсы похожи друг да друга но имеют разный контракты. Иногда нужно указывать тип явно, что бы жостко обозначить какой именно контракт ожидается в конкретном коде.
Например IMegaList и ISuperList имеют методы Add. В одном уникальные элементы не позволяются, в другом — могут быть разрешены.

var list = GetList();
list.Add(1);
list.Add(1);


В зависимости от того, как определена переменная list в одном случае ошибка вылезет в рантайме, в другом — в компайлтайме если изменить сигнатуру метода GetList.
Re[4]: Почему var лучше чем явное указание типа?
От: WolfHound  
Дата: 28.08.12 13:30
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>1) Что это за тип (какие операции разрешены с ним дальше)

Ты знаешь все методы всех типов? Титан.

Doc>2) Если GetUserAge() написана не мной, и вдруг поменяет возвращаемый тип, то компилятор укажет именно на эту строку, а не неизвестно где (если везде писать var то не известно сколько и какого кода затронет одно изменение типа, т.к. все var поползут по цепочке).

Постоянно это делаю. При этом использую намного более агрессивный вывод типов немерла. Проблем нет.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Почему var лучше чем явное указание типа?
От: VladFein США  
Дата: 28.08.12 18:16
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


VF>>И там же довольно интересные возражения...

WH>В каком месте?

“Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types.”


"I agree with Alexander. Var should only be used for anonymous types. It was designed for anonymous types and for use with LINQ. Using var to implicitly type local variables is not good practice and makes code more unreadable."


"After reworking some code and using var wherever possible, I can't say it has provided any benefit and at best obfuscates meaning in most situation."


"I really am having a hard time to read code with too many vars — it's just a reduction of information. While you may say that it "forces" devs to go with better variable names, I'd still opt for explicity typing *and* good variables (and people who don't care will still use bad naming schemes)... "



"Before var existed, was anyone in the community thinking "my code would be so much more readable if only I didn't have to type all my local variables"? No, of course not. It was pretty much invented only to support Linq. The fact that it can be used for non-anonymous types doesn't mean it should."

Re[5]: Почему var лучше чем явное указание типа?
От: WolfHound  
Дата: 28.08.12 19:33
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>>>И там же довольно интересные возражения...

WH>>В каком месте?
VF>

VF>“Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types.”

Каждый день читаю чужой код, в котором такой вывод типов по сравнению, с которым var детский сад.

VF>

VF>"I agree with Alexander. Var should only be used for anonymous types. It was designed for anonymous types and for use with LINQ. Using var to implicitly type local variables is not good practice and makes code more unreadable."

Повторение другими словами.

VF>

VF>"After reworking some code and using var wherever possible, I can't say it has provided any benefit and at best obfuscates meaning in most situation."

Нужно смотреть на его код. Скорей всего там плохие имена.

VF>

VF>"I really am having a hard time to read code with too many vars — it's just a reduction of information. While you may say that it "forces" devs to go with better variable names, I'd still opt for explicity typing *and* good variables (and people who don't care will still use bad naming schemes)... "

Моя практика чтения кода, в котором еще меньше типов (при полной статической типизации) это не подтверждает.

VF>

VF>"Before var existed, was anyone in the community thinking "my code would be so much more readable if only I didn't have to type all my local variables"? No, of course not. It was pretty much invented only to support Linq. The fact that it can be used for non-anonymous types doesn't mean it should."

Я думал. Меня всегда раздражало, что компилятор заставляет писать то, что он и так знает.

Ну и не стоит забывать про любителей динамической типизации, у которых "не писать типы" это главный аргумент. Благо сильный вывод типов эту проблему устраняет, не создавая проблем динамики.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 29.08.12 07:18
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


А>>>Какого типа, по вашему переменная notes?

S>>А зачем мне это знать?
S>>Я и так вижу, что делает приведённый вами код. Если Notes внезапно вернёт ILocalizableRichTextExtractor, то мне будет на это всё равно.

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

I>Например IMegaList и ISuperList имеют методы Add. В одном уникальные элементы не позволяются, в другом — могут быть разрешены.

I>
I>var list = GetList();
I>list.Add(1);
I>list.Add(1);
I>


I>В зависимости от того, как определена переменная list в одном случае ошибка вылезет в рантайме, в другом — в компайлтайме если изменить сигнатуру метода GetList.

Скажите, пожалуйста, а как вы оцениваете шансы возникновения подобной ситуации?
По-моему, такие ситуации очень не часты и маловероятны.
Так не лучше ли не заморачиваться с неявным выведением типа и просто использовать var?
Re[14]: Почему var лучше чем явное указание типа?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.08.12 08:13
Оценка:
Здравствуйте, Аноним, Вы писали:

I>>В зависимости от того, как определена переменная list в одном случае ошибка вылезет в рантайме, в другом — в компайлтайме если изменить сигнатуру метода GetList.

А>Скажите, пожалуйста, а как вы оцениваете шансы возникновения подобной ситуации?
А>По-моему, такие ситуации очень не часты и маловероятны.
А>Так не лучше ли не заморачиваться с неявным выведением типа и просто использовать var?

А разве я призываю отказываться от var ?
Re[15]: Почему var лучше чем явное указание типа?
От: Аноним  
Дата: 29.08.12 08:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А разве я призываю отказываться от var ?


Нет-нет, никого никуда призывать не нужно.

По-моему, можно успешно оправдывать/ругать как использование var, так и использование явного указания типа в ситуации, которая описана в C# Coding Conventions в секции "Implicitly Typed Local Variables":
int var4 = ExampleClass.ResultSoFar();

Так что же все-таки делать, если так и не понятно, использовать var или не использовать?
Re[2]: Почему var лучше чем явное указание типа?
От: G-Host  
Дата: 29.08.12 12:01
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, Аноним, Вы писали:


А>>Решил попробовать РеШАрпер а он кучу таких варнингов выдает. В чем преимущество var. Мне кажется когда явно тип указываешь это более наглядно. Подскажите, пожалуйста


Doc>Смотря в какой ситуации. Например, тут даже var вреден, т.к. тип age с ходу не ясен:

Doc>
var age = this.GetUserAge();

Doc>А вот тут:
Doc>
var myList = new List<Tuple<string, int>>();

Doc>полезен — и тип переменной понятен и строка короче чем:
Doc>
List<Tuple<string, int>> myList = new List<Tuple<string, int>>();

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