var или не var?

Автор Тема: var или не var?  (Прочитано 22558 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #15 : 26-11-2015, 11:57:39 »
ИХМО явное указание типа это рудимент. Код не надо читать на печатной бумаге - для этого есть IDE, которые раскрашивают, делают автоотступы и пр. для читаемости кода - не зря А. Ривилис, в каждом втором посте нового автора напоминает  оформлять код соответствующим образом. Вывод типа давным давно успешно реализован - вот пример даже на web странице http://www.fssnip.net - (показывает тип при поднесении мыши к выражению любого примера). Явное задание типа - только разводит "типографию" и делает код менее универсальным. Да кое-где его лучше указать (например для лучшей работы интелисенса), но делать это повсеместно - это скорей результат дурного наследия C# от Си (имею в виду читаемость кода). Код должен не только описывать, но и показывать алгоритм задачи, а не "топить" Вас в типы и пр. второстепенную "мешуру" - хотя это конечно вопрос больше к синтаксису языка.
Не согласен. Несомненно, var - более компактная форма записи, но это удобство достигается, на мой взгляд, за счёт некоторой потери удобочитаемости.

Лично мне всегда удобней читать код, в котором тип переменной указан явно, не вынуждая меня дополнительно пробегать глазами по строчке в поисках инициализации переменной с целью выяснения, какой же тип она имеет. Не стоит забывать о том, что существуют такие ресурсы как GitHub и BitBucket, которые позволяют просматривать исходный код проектов, с подсветкой синтаксиса, в online-режиме без использования IDE - там нет "интелисенса", а обозначенные ресурсы достаточно популярны.

Порой я читаю такие исходники в браузере, а порой распечатываю и читаю, пока еду в метро делая, по мере необходимости, пометки маркером или карандашом. Не стоит забывать так же и о том, что зачастую порции кода присутствуют в документации, а так же в различных книжках. А теперь представь, что книжку в метро или документацию на планшете читает новичок, едущий в метро, или сидящий в парке на скамейке и видит в коде вызов некоторого метода, результат которого присваивается переменной типа var. Этот человек ещё толком не знаком с API, о котором читает. У него возникает логичный вопрос: а каков реальный тип этой переменной? Для того, чтобы понять это ему придётся открыть SDK и посмотреть сигнатуру метода (если он просматривает код не в IDE), либо сделать себе "зарубку", что нужно будет полезть в SDK позднее, когда такая возможность представится. Это очень неудобно.

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

ИМХО

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #16 : 26-11-2015, 12:26:14 »
Вдогонку: вот хороший пример того, когда применение var действительно необходимо. Любую фичу нужно применять к месту и с умом, а не пихать везде где только можно только лишь потому, что это возможно.

ИМХО

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: var или не var?
« Ответ #17 : 26-11-2015, 16:43:01 »
Я пожалуй плохо расписал предыдущий пост - поясню - в C (да и в "базе" C#) код без типа выглядит действительно "адски" нечитабельно, оно-же как например абсолютно невозможно читать ассемблер, если у него количество строк комментариев не превышает вдвое количество кода. Это не вопрос правильности оформления - а ущербность выразительности языка - без анотации типа, который выводится из программы и не понятно чего она делает. Я тоже считаю что алгоритм кода должен быть понятен при взгляде на программу - без просмотра его в пашаговом режиме отладки. Программист должен ясно представлять и соответственно видеть алгоритм задачи, а не тонкости реализации конкретной платформы - это задача оптимизатора компилятора. Давайте честно - в Linq выражениях Вам как, мешает отсутствие типа? Или может алгоритм хуже виден? По моему наоборот.
P.S. В совсем старых своих кодах на СИ - я для этой цели и Венгерскую нотацию использовал - но времена меняются...

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #18 : 26-11-2015, 23:19:49 »
Давайте честно - в Linq выражениях Вам как, мешает отсутствие типа? Или может алгоритм хуже виден? По моему наоборот
В моём предыдущем сообщении дана ссылка на пример целесообразного использования var - там как раз LINQ.

В совсем старых своих кодах на СИ - я для этой цели и Венгерскую нотацию использовал - но времена меняются...
Времена могут и меняться, но проверенные временем решения используются до сих пор и, как мне кажется, будут ещё долго использоваться как раз таки в виду этой самой проверенности временем. Я в своих текущих C\C++ исходниках использую Венгерскую нотацию, принятую к использованию в MSDN, например в объявлениях и определениях экспортируемых функций. Такой подход существенно облегчает чтение как моих, так и чужих исходников на C\C++, использующих WinAPI.

Когда пишу на C#, Венгерскую нотацию не использую. Полагаю, что не стоит переключаться с вопроса о var на Венгерскую запись. :)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: var или не var?
« Ответ #19 : 27-11-2015, 00:12:41 »
Когда пишу на C#, Венгерскую нотацию не использую.
Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживает - т.к. идет непрерывное развитие языков и инструментария программирования. Были свои стандарты в процедурном программировании, где они сейчас. Да если писать на "проверенных временем решениях" естественно надо писать соблюдая те стандарты под которые они были разработаны. C# имеет особенность в том, что он уходит от "корней" от версии к версии все дальше с большой скоростью. Мой прогноз - максимум через 10 лет - в C# "стандартным" будет код без явного задания типа - и читаться он будет ни чуть не хуже.
з.ы. То Андрей - просто из любопытства - мне тоже, до сих пор, пару раз в год "приходиться" вспоминать и Cи и иногда даже ассемблер - но это в части работы совсем далекой от персооналок и автокада (на так сказать "настоящем харде"). Зачем Вам практически понадобились С++ и прямые WinApi (я так понимаю что ты имеешь в виду не вызов "единичных" функций - а именно написание как минимум модуля).

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #20 : 27-11-2015, 00:21:37 »
з.ы. То Андрей - просто из любопытства - мне тоже, до сих пор, пару раз в год "приходиться" вспоминать и Cи и иногда даже ассемблер - но это в части работы совсем далекой от персооналок и автокада (на так сказать "настоящем харде"). Зачем Вам практически понадобились С++ и прямые WinApi (я так понимаю что ты имеешь в виду не вызов "единичных" функций - а именно написание как минимум модуля).
1. Не всё то, что мне нужно, можно сделать на .NET. Например - хуки.
2. Защитить .NET код (интеллектуальную собственность) достаточно сложно.

Да, в последнее время я занят переписыванием c C# на C++ утилиты по CAD администрированию локальной и удалённых машин.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: var или не var?
« Ответ #21 : 27-11-2015, 01:20:59 »
Поофтоплю в теме вырезанной из другой за оффтоп ;)
Почему-то вспомнилось - пару лет назад я разрабатывал расчетную функцию которая, в силу отсутствия эффективного математического метода для ее решения (задача сводилась, по сути к вариации задаче о рюкзаке) занималась по сути перебором и к сожалению на размере данных требуемых задачей занимала существенное время. И когда алгоритм был реализован и "допилен" я решил сделать "ход конем" - написать аналогичную на ассемблере - и вызывать его из основной программы как внешний модуль. Так вот, я реализовав его столкнулся с тем фактом - что производительность выросла ровно на 0 (по сути если придираться, то даже дольше т.к. тратятся ресурсы на внешний вызов - но это время конечно не влияло на фактический результат).  Я потом долго через ilspy искал в чем подвох, и это, я обращаю внимание, при том что x86 ассемблер я знаю достаточно не плохо. Там не было никаких вызовов ОС, вся математика "процессора" была на чистых регистрах (для тех кто не в курсе - это самый быстрый способ передачи "внутри процессора" - все языки высокого уровня используют либо память, либо стек - и то и то существенно дольше если считать в машинных тактах). Транслятор IL реализован очень качественно, используя всю мощь MMXов и пр. расширений на уровне процессора - которые в рукопашную реализовать ой как не просто. После этого меня окончательно перестали посещать мысли по оптимизации через низкоуровневый код - только для написания кода под что-то очень железное.
p.s. нативный C++ мне раньше в подобных случаях всегда удавалось "переиграть".

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: var или не var?
« Ответ #22 : 27-11-2015, 08:36:39 »
Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживает
Спор из разряда какая религия лучше, но все-таки явное указание-правильный путь.
Р. Мартин - Чистый код. Создание, анализ и рефакторинг
Так вот автор затрагивает данный аспект с другой стороны.

1. Исследования показывают, что на самом деле программист основное время тратит не на написание кода, а на его чтение. При чтении кода человек вынужден дешифровать(перевести) информацию в понятный для него логический вид. На дешифрацию уходит время, запас внимания и т.д. увеличивается нагрузка на мозг, больше нужно держать в памяти (out of memory).
Оно вам надо каждый раз просматривая код подсознательно угадывать какой тип будет возвращен?
Вы все-равно будете это делать хотите того или нет!

2. Ошибки, куда уж без них. Хорошо если вы придерживались "Чистого кода" и
var entity = GetNextEntity();
всем своим видом подсказывает, что вернется Entity.

но напарник, или Вы через год переписали одну из функций и не сменили ее название
public DbObject GetNextEntity(){
....
return dbObject;
}

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

Все сводится в итоге ко времени. VAR или ВРЕМЯ вот в чем вопрос?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #23 : 27-11-2015, 11:56:28 »
После этого меня окончательно перестали посещать мысли по оптимизации через низкоуровневый код
Там, где я использую C\C++ - это делается не для оптимизации, но либо для защиты интеллектуальной собственности, либо для выполнение тех операций, которые мне не удалось выполнить при помощи .Net.
Транслятор IL реализован очень качественно, используя всю мощь MMXов и пр. расширений на уровне процессора - которые в рукопашную реализовать ой как не просто.
Я в курсе. Джеффри Рихтер об этом писал в одной (а может и не одной) из своих книг, сообщая, что управляемый код по скорости работы почти не уступает неуправляемому именно за счёт того, что JIT по максимуму учитывает возможности текущего процессора, в то время как неуправляемый, статически скомпилированный код, ориентирован на среднестатистический процессор (дабы мог исполняться на любой машине). За счёт этого нивелируется время, единожды потраченное на JIT.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: var или не var?
« Ответ #24 : 27-11-2015, 15:11:15 »
Оно вам надо каждый раз просматривая код подсознательно угадывать какой тип будет возвращен?
Я пишу ровно про это, но с другой стороны - я вообще не хочу смотреть какие типы там вернутся - тип это проблема компилятора - программист должен думать об алгоритме задачи, а не о том через какие там типы это "вывернется". Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности (декларативности) языка - если у языка нормальная выразительность - явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: var или не var?
« Ответ #25 : 29-11-2015, 20:55:55 »
проблемы не в типах, а отсутствии выразительности (декларативности) языка
пишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.

явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода
тип не важен?
какая-то задача на псевдокоде.
суп = сварить(вода, петрушка, картошка, лук);

..вы уже представили себе типы объектов и разложили их в голове

вы точно уверены что получите суп из данных ингредиентов?

а если лук тип оружие
а петрушка тип грызун. ..просто имя у него Петрушка.

отсутствие входных/выходных типов это отсутствие контроля. Последствия отсутствия контроля - это ошибка.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: var или не var?
« Ответ #26 : 29-11-2015, 22:23:16 »
Дима_,
пишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.
Да нет у меня проблем с выразительностью. Что такое писать не на языке а с помощью языка - я не понял - "проставьте типы" что Вы имели в виду?
суп = сварить(вода, петрушка, картошка, лук);Да ужасный это псевдоязык где можно грызуна в суп засунуть - не надо на таком писать. Не надо принимать выразительность тем, что вы можете назвать любой объект петрушка.
з.ы. я на dwg.ru уже наверное более десятка раз "сотрясал воздух" по поводу языков, декларативности и др. базовых понятиях программирования, с которыми многие программисты, к сожалению, знакомы ну очень поверхностно. Если подвести итог, тип нужен в си подобных языках (и даже в C# на текущем уровне), но причина этому - не "полезность" аннотации типа, а отсутствие (нахождение их в зачаточном виде) средств декларативного программирования - вот и приходится выражать программу в типах, чтоб можно было хоть как-то понять что пытался сделать программист.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: var или не var?
« Ответ #27 : 30-11-2015, 13:09:25 »
проблемы не в типах, а отсутствии выразительности (декларативности) языка
Да нет у меня проблем с выразительностью

Уже стоит определиться есть проблемы с выразительностью или нет! Если есть и решаются они применением VAR и потом это называется "нет у меня проблем с выразительностью", то имеются проблемы с "чистотой кода", а не выразительностью языка.

Есть пара книг "Чистый код" и "Совершенный код", любую из них стоит прочитать. В одной из них сформулирована фраза  "писать не на языке а с помощью языка". Это значит, что четко сформулированный код будет одинаково хорошо "Выразителен" на разных языках и дело тут не в "отсутствии выразительности (декларативности) языка", "var" и т.д.

Если подвести итог, тип нужен в си подобных языках (и даже в C# на текущем уровне), но причина этому - не "полезность" аннотации типа, а отсутствие (нахождение их в зачаточном виде) средств декларативного программирования - вот и приходится выражать программу в типах, чтоб можно было хоть как-то понять что пытался сделать программист.

слишком поверхностный вывод. Видимо не было задач, связанных с обработкой больших массивов данных? Скорее всего выводы насчет языка были другие. Если массив более 1 млн, неэффективно абстрагироваться от типов и приведения данных.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: var или не var?
« Ответ #28 : 30-11-2015, 13:15:46 »
Привалов Дмитрий,
может хватит сферического коня в вакууме рассматривать? :)

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: var или не var?
« Ответ #29 : 30-11-2015, 14:15:20 »
может хватит сферического коня в вакууме рассматривать? :)
пожалуй смысла нет)
Как ни крути "var или не var?" это личный выбор