Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: NurGeo от 25-11-2015, 01:14:42

Название: var или не var?
Отправлено: NurGeo от 25-11-2015, 01:14:42
А можно вопрос. Почему не возникает исключение в случае когда объект не полилиния?
Это возможно только на C# или на vb.net также возможно?
Код - C# [Выбрать]
  1. var lwp = dbObj as Polyline; // If a "lightweight" (or optimized) polyline
И произойдет ли исключение если написать так,
Код - C# [Выбрать]
  1. Polyline lwp = dbObj; // If a "lightweight" (or optimized)
Синтаксис возможно неправильный, имеется ввиду если тип объекта указать переменной?
Название: Re: var или не var?
Отправлено: Владимир Шу от 25-11-2015, 08:43:43
NurGeo, Я не большой специалист в С#, но тут могу ответить.
По С#: https://msdn.microsoft.com/ru-ru/library/cc488006.aspx  и тут http://professorweb.ru/my/csharp/assembly/level2/2_2.php (операторы AS, IS)
VB.NEt: https://msdn.microsoft.com/library/zyy863x8%28v=vs.100%29.aspx (Операторы CType, DirectCast и TryCast)

Александр любит объявлять переменные через var (такой стиль написания), к ошибке в данном случае это не приведет, но ИМХО это дурной тон.
Код становиться намного понятнее, если тип переменной указан явно.
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 25-11-2015, 09:43:30
Александр любит объявлять переменные через var (такой стиль написания), к ошибке в данном случае это не приведет, но ИМХО это дурной тон.
Код становиться намного понятнее, если тип переменной указан явно
Да, соглашусь с Вами - это я пошел на поводу у ReSharper'а. Читать код конечно удобней, когда есть явное объявление типов, но как ни странно - я уже привык к var. Со временем (с опытом) конечно начну использовать оба варианта. Объявление через var иногда полезно и нужно (как например var dbObj в примере выше)

А можно вопрос. Почему не возникает исключение в случае когда объект не полилиния?
Как раз для этого используется оператор as. Смысл такой примерно - берем неявную переменную dbObj и пытаемся сделать ее явной (Polyline). Результат запишем в lwp. Если dbObj не является Polyline, то вместо исключения просто получим lwp == null.

Это возможно только на C# или на vb.net также возможно?
Возможно (http://stackoverflow.com/questions/2450185/vb-net-equivalent-of-c-sharp-as)
И произойдет ли исключение если написать так
Да, произойдет, если dbObj не окажется Polyline
Название: Re: var или не var?
Отправлено: Владимир Шу от 25-11-2015, 09:54:40
Объявление через var иногда полезно и нужно (как например var dbObj в примере выше)
не полезно и если внимательно посмотреть код на msdn, то это видно. Если вы заранее не знаете, какой объект автокада будете обрабатывать, то есть соответствующие родительские типы.
Смысл такой примерно - берем неявную переменную dbObj и пытаемся сделать ее явной (Polyline). Результат запишем в lwp. Если dbObj не является Polyline, то вместо исключения просто получим lwp == null.
ИМХО, не такой. Оператор AS сравнит типы переменных и если они совпадут, то передаст в переменную lwp указатель на этот объект в памяти. Не совпадут, не передаст,
именно по этому в примерах, такого рода приведения выполняются в не иницализированную переменную, которая еще не содержит указатель на объект и потому равна null. а обнулит переменную.
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 25-11-2015, 09:57:45
не полезно
эмммм... не убедили ))
Оператор AS сравнит типы переменных и если они совпадут, то передаст в переменную lwp указатель на этот объект в памяти.
Так я тоже самое написал, только простым языком )) А если не совпадут - то null
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 25-11-2015, 09:59:08
Boxa.Shu, в любом случае - изъясняться красиво и правильно - не мой конек :D
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 25-11-2015, 10:49:09
е полезно и если внимательно посмотреть код на msdn, то это видно. Если вы заранее не знаете, какой объект автокада будете обрабатывать, то есть соответствующие родительские типы.
Вот интересные доводы и обсуждения на тему - http://habrahabr.ru/post/39231/
Название: Re: var или не var?
Отправлено: Владимир Шу от 25-11-2015, 11:15:04
Вот интересные доводы и обсуждения на тему - http://habrahabr.ru/post/39231/
Я пожалуй процитирую один из ответов в том топике:
Цитировать
Доводы нормальные, но надо понимать, что в Microsoft тоже не глупые люди работают, и если они что-то рекомендуют (или не рекомендуют) в отношении использования ИХ инструментов, то лучше прислушаться именно к ним.
Уверен, доводов у Microsoft не меньше, тот же Кшиштоф Квалина часто разбирает подобные спорные моменты.

Если в инструкции к твоей машине написано, что масло нужно менять раз в 10000 км и лить бензин Аи 95 и выше, то ты именно так делать и будешь или начнешь выяснять, что будет если масло менять как попало и лить 76 и соляру? Думаю ответ очевиден.

Хотя флуд все это.
Название: Re: var или не var?
Отправлено: bargool от 25-11-2015, 14:25:36
C# Coding Conventions (C# Programming Guide) (https://msdn.microsoft.com/en-us/library/ff926074.aspx)
Раздел "Implicitly Typed Local Variables":
Цитировать
Use implicit typing for local variables when the type of the variable is obvious from the right side of the assignment, or when the precise type is not important
Так что всё зависит от ситуации (и предпочтения microsoft тоже меняются)
Название: Re: var или не var?
Отправлено: Дима_ от 25-11-2015, 22:06:11
Александр любит объявлять переменные через var (такой стиль написания), к ошибке в данном случае это не приведет, но ИМХО это дурной тон.
ИХМО явное указание типа это рудимент. Код не надо читать на печатной бумаге - для этого есть IDE, которые раскрашивают, делают автоотступы и пр. для читаемости кода - не зря А. Ривилис, в каждом втором посте нового автора напоминает  оформлять код соответствующим образом. Вывод типа давным давно успешно реализован - вот пример даже на web странице http://www.fssnip.net (http://www.fssnip.net) - (показывает тип при поднесении мыши к выражению любого примера). Явное задание типа - только разводит "типографию" и делает код менее универсальным. Да кое-где его лучше указать (например для лучшей работы интелисенса), но делать это повсеместно - это скорей результат дурного наследия C# от Си (имею в виду читаемость кода). Код должен не только описывать, но и показывать алгоритм задачи, а не "топить" Вас в типы и пр. второстепенную "мешуру" - хотя это конечно вопрос больше к синтаксису языка.
Название: Re: var или не var?
Отправлено: NurGeo от 25-11-2015, 22:48:32
Всем спасибо за информацию, получил необходимую информацию по is, as на C# и trycast на vb. Как же многого я не знаю, если абстрактно сравнить со школой, то даже букварь не освоил и уже хочу писать сочинения :).
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 25-11-2015, 23:23:10
и trycast на vb
ИМХО. Лучше не тратить время на освоение VB.Net
Как же многого я не знаю, если абстрактно сравнить со школой, то даже букварь не освоил и уже хочу писать сочинения
Почитайте недавний спор в этой теме (http://adn-cis.org/forum/index.php?topic=1832.15) - ответы с 19 по 24 ;)
Название: Re: var или не var?
Отправлено: Александр Ривилис от 26-11-2015, 09:41:41
Дима_
Не согласен. Я считаю, что без всякого "поднесения мышки к выражению", про взгляде на программу, я должен сразу видеть типы переменных. Для меня это не обсуждается. И это условие усиливается в десять раз для учебного примера и в сто раз если это код для для передачи в ADN DevHelp. Почему кто-то должен тратить своё время для понимания моего кода только потому, что мне лень вписать правильные типы?

Дальше дискутировать на эту тему не буду - можете считать меня консерватором и ретроградом. ;)
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 26-11-2015, 09:44:11
ну раз оффтоп, то можно себе позволить  ;D ;D ;D ::)
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs8.postimg.org%2Fcu8f2xsy9%2Frisovach_ru.jpg&hash=907afcdf5bb8c3f52e5b6adb42c00b68) (http://postimg.org/image/cu8f2xsy9/)
Название: Re: var или не var?
Отправлено: Александр Пекшев aka Modis от 26-11-2015, 09:52:19
Если оба варианта верны и работают (не берем в счет некоторые исключения), то логично предположить - оба варианта имеют место быть. Разница лишь в том, для чего/кого пишется код: если я пишу его только для себя и мне удобно использовать var - это не значит, что я делаю не правильно. Ну а если учебные пособия, коды для ADN help или работа с кодом нескольких людей - тогда уже можно и спорить. Даже не спорить - а придерживаться какого-то стиля. Тем более - в кодинге, как и в любом творческом деле, у каждого человека присутствует свой стиль! Даже вот эти варианты зрительно сильно отличаются:
Код - C# [Выбрать]
  1. var line = new Line(new Point3D(0,1,0), new Point3D(1,1,0));
и
Код - C# [Выбрать]
  1. Line line = new Line(
  2.      new Point3D(0,1,0),
  3.      new Point3D(1,1,0)
  4.      );
Название: Re: var или не var?
Отправлено: Андрей Бушман от 26-11-2015, 11:57:39
ИХМО явное указание типа это рудимент. Код не надо читать на печатной бумаге - для этого есть IDE, которые раскрашивают, делают автоотступы и пр. для читаемости кода - не зря А. Ривилис, в каждом втором посте нового автора напоминает  оформлять код соответствующим образом. Вывод типа давным давно успешно реализован - вот пример даже на web странице http://www.fssnip.net - (показывает тип при поднесении мыши к выражению любого примера). Явное задание типа - только разводит "типографию" и делает код менее универсальным. Да кое-где его лучше указать (например для лучшей работы интелисенса), но делать это повсеместно - это скорей результат дурного наследия C# от Си (имею в виду читаемость кода). Код должен не только описывать, но и показывать алгоритм задачи, а не "топить" Вас в типы и пр. второстепенную "мешуру" - хотя это конечно вопрос больше к синтаксису языка.
Не согласен. Несомненно, var - более компактная форма записи, но это удобство достигается, на мой взгляд, за счёт некоторой потери удобочитаемости.

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

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

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

ИМХО
Название: Re: var или не var?
Отправлено: Андрей Бушман от 26-11-2015, 12:26:14
Вдогонку: вот (https://msdn.microsoft.com/ru-ru/library/bb383973.aspx?f=255&MSPPError=-2147217396) хороший пример того, когда применение var действительно необходимо. Любую фичу нужно применять к месту и с умом, а не пихать везде где только можно только лишь потому, что это возможно.

ИМХО
Название: Re: var или не var?
Отправлено: Дима_ от 26-11-2015, 16:43:01
Я пожалуй плохо расписал предыдущий пост - поясню - в C (да и в "базе" C#) код без типа выглядит действительно "адски" нечитабельно, оно-же как например абсолютно невозможно читать ассемблер, если у него количество строк комментариев не превышает вдвое количество кода. Это не вопрос правильности оформления - а ущербность выразительности языка - без анотации типа, который выводится из программы и не понятно чего она делает. Я тоже считаю что алгоритм кода должен быть понятен при взгляде на программу - без просмотра его в пашаговом режиме отладки. Программист должен ясно представлять и соответственно видеть алгоритм задачи, а не тонкости реализации конкретной платформы - это задача оптимизатора компилятора. Давайте честно - в Linq выражениях Вам как, мешает отсутствие типа? Или может алгоритм хуже виден? По моему наоборот.
P.S. В совсем старых своих кодах на СИ - я для этой цели и Венгерскую нотацию использовал - но времена меняются...
Название: Re: var или не var?
Отправлено: Андрей Бушман от 26-11-2015, 23:19:49
Давайте честно - в Linq выражениях Вам как, мешает отсутствие типа? Или может алгоритм хуже виден? По моему наоборот
В моём предыдущем сообщении дана ссылка на пример целесообразного использования var - там как раз LINQ.

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

Когда пишу на C#, Венгерскую нотацию не использую. Полагаю, что не стоит переключаться с вопроса о var на Венгерскую запись. :)
Название: Re: var или не var?
Отправлено: Дима_ от 27-11-2015, 00:12:41
Когда пишу на C#, Венгерскую нотацию не использую.
Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживает - т.к. идет непрерывное развитие языков и инструментария программирования. Были свои стандарты в процедурном программировании, где они сейчас. Да если писать на "проверенных временем решениях" естественно надо писать соблюдая те стандарты под которые они были разработаны. C# имеет особенность в том, что он уходит от "корней" от версии к версии все дальше с большой скоростью. Мой прогноз - максимум через 10 лет - в C# "стандартным" будет код без явного задания типа - и читаться он будет ни чуть не хуже.
з.ы. То Андрей - просто из любопытства - мне тоже, до сих пор, пару раз в год "приходиться" вспоминать и Cи и иногда даже ассемблер - но это в части работы совсем далекой от персооналок и автокада (на так сказать "настоящем харде"). Зачем Вам практически понадобились С++ и прямые WinApi (я так понимаю что ты имеешь в виду не вызов "единичных" функций - а именно написание как минимум модуля).
Название: Re: var или не var?
Отправлено: Андрей Бушман от 27-11-2015, 00:21:37
з.ы. То Андрей - просто из любопытства - мне тоже, до сих пор, пару раз в год "приходиться" вспоминать и Cи и иногда даже ассемблер - но это в части работы совсем далекой от персооналок и автокада (на так сказать "настоящем харде"). Зачем Вам практически понадобились С++ и прямые WinApi (я так понимаю что ты имеешь в виду не вызов "единичных" функций - а именно написание как минимум модуля).
1. Не всё то, что мне нужно, можно сделать на .NET. Например - хуки.
2. Защитить .NET код (интеллектуальную собственность) достаточно сложно.

Да, в последнее время я занят переписыванием c C# на C++ утилиты по CAD администрированию локальной и удалённых машин.
Название: Re: var или не var?
Отправлено: Дима_ от 27-11-2015, 01:20:59
Поофтоплю в теме вырезанной из другой за оффтоп ;)
Почему-то вспомнилось - пару лет назад я разрабатывал расчетную функцию которая, в силу отсутствия эффективного математического метода для ее решения (задача сводилась, по сути к вариации задаче о рюкзаке) занималась по сути перебором и к сожалению на размере данных требуемых задачей занимала существенное время. И когда алгоритм был реализован и "допилен" я решил сделать "ход конем" - написать аналогичную на ассемблере - и вызывать его из основной программы как внешний модуль. Так вот, я реализовав его столкнулся с тем фактом - что производительность выросла ровно на 0 (по сути если придираться, то даже дольше т.к. тратятся ресурсы на внешний вызов - но это время конечно не влияло на фактический результат).  Я потом долго через ilspy искал в чем подвох, и это, я обращаю внимание, при том что x86 ассемблер я знаю достаточно не плохо. Там не было никаких вызовов ОС, вся математика "процессора" была на чистых регистрах (для тех кто не в курсе - это самый быстрый способ передачи "внутри процессора" - все языки высокого уровня используют либо память, либо стек - и то и то существенно дольше если считать в машинных тактах). Транслятор IL реализован очень качественно, используя всю мощь MMXов и пр. расширений на уровне процессора - которые в рукопашную реализовать ой как не просто. После этого меня окончательно перестали посещать мысли по оптимизации через низкоуровневый код - только для написания кода под что-то очень железное.
p.s. нативный C++ мне раньше в подобных случаях всегда удавалось "переиграть".
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 27-11-2015, 08:36:39
Я про это и говорил с самого начала - явный тип это фишка (рудимент) которая себя отживает
Спор из разряда какая религия лучше, но все-таки явное указание-правильный путь.
Р. Мартин - Чистый код. Создание, анализ и рефакторинг
Так вот автор затрагивает данный аспект с другой стороны.

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

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

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

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

Все сводится в итоге ко времени. VAR или ВРЕМЯ вот в чем вопрос?
Название: Re: var или не var?
Отправлено: Андрей Бушман от 27-11-2015, 11:56:28
После этого меня окончательно перестали посещать мысли по оптимизации через низкоуровневый код
Там, где я использую C\C++ - это делается не для оптимизации, но либо для защиты интеллектуальной собственности, либо для выполнение тех операций, которые мне не удалось выполнить при помощи .Net.
Транслятор IL реализован очень качественно, используя всю мощь MMXов и пр. расширений на уровне процессора - которые в рукопашную реализовать ой как не просто.
Я в курсе. Джеффри Рихтер об этом писал в одной (а может и не одной) из своих книг, сообщая, что управляемый код по скорости работы почти не уступает неуправляемому именно за счёт того, что JIT по максимуму учитывает возможности текущего процессора, в то время как неуправляемый, статически скомпилированный код, ориентирован на среднестатистический процессор (дабы мог исполняться на любой машине). За счёт этого нивелируется время, единожды потраченное на JIT.
Название: Re: var или не var?
Отправлено: Дима_ от 27-11-2015, 15:11:15
Оно вам надо каждый раз просматривая код подсознательно угадывать какой тип будет возвращен?
Я пишу ровно про это, но с другой стороны - я вообще не хочу смотреть какие типы там вернутся - тип это проблема компилятора - программист должен думать об алгоритме задачи, а не о том через какие там типы это "вывернется". Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности (декларативности) языка - если у языка нормальная выразительность - явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода.
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 29-11-2015, 20:55:55
проблемы не в типах, а отсутствии выразительности (декларативности) языка
пишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.

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

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

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

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

отсутствие входных/выходных типов это отсутствие контроля. Последствия отсутствия контроля - это ошибка.
Название: Re: var или не var?
Отправлено: Дима_ от 29-11-2015, 22:23:16
Дима_,
пишите не на языке, а с помощью языка и проблем с выразительностью станет меньше.
Да нет у меня проблем с выразительностью. Что такое писать не на языке а с помощью языка - я не понял - "проставьте типы" что Вы имели в виду?
суп = сварить(вода, петрушка, картошка, лук);Да ужасный это псевдоязык где можно грызуна в суп засунуть - не надо на таком писать. Не надо принимать выразительность тем, что вы можете назвать любой объект петрушка.
з.ы. я на dwg.ru уже наверное более десятка раз "сотрясал воздух" по поводу языков, декларативности и др. базовых понятиях программирования, с которыми многие программисты, к сожалению, знакомы ну очень поверхностно. Если подвести итог, тип нужен в си подобных языках (и даже в C# на текущем уровне), но причина этому - не "полезность" аннотации типа, а отсутствие (нахождение их в зачаточном виде) средств декларативного программирования - вот и приходится выражать программу в типах, чтоб можно было хоть как-то понять что пытался сделать программист.
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 30-11-2015, 13:09:25
проблемы не в типах, а отсутствии выразительности (декларативности) языка
Да нет у меня проблем с выразительностью

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

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

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

слишком поверхностный вывод. Видимо не было задач, связанных с обработкой больших массивов данных? Скорее всего выводы насчет языка были другие. Если массив более 1 млн, неэффективно абстрагироваться от типов и приведения данных.
Название: Re: var или не var?
Отправлено: Андрей Бушман от 30-11-2015, 13:15:46
Привалов Дмитрий,
может хватит сферического коня в вакууме рассматривать? :)
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 30-11-2015, 14:15:20
может хватит сферического коня в вакууме рассматривать? :)
пожалуй смысла нет)
Как ни крути "var или не var?" это личный выбор
Название: Re: var или не var?
Отправлено: Дима_ от 30-11-2015, 15:29:53
Это значит, что четко сформулированный код будет одинаково хорошо "Выразителен" на разных языках и дело тут не в "отсутствии выразительности (декларативности) языка", "var" и т.д.
Ну так я еще раз попрошу - если все равно на чем писать - напишите на C# sql запрос, или опишите на нем-же web страницу - помогут Вам типы?
Видимо не было задач, связанных с обработкой больших массивов данных?
Не путайте динамическую типизацию и автоматический вывод типа - автоматом выведен тип или задан вручную - скомпилированно будет одно и то-же.
з.ы. Ну если Вы считаете что Вы больший "ас" по эффективному решению "больших данных" можем и посоревноваться на бутыль коньяка - каждый пишет как хочет и на чем хочет :) .
Название: Re: var или не var?
Отправлено: Андрей Бушман от 30-11-2015, 15:54:23
Ну если Вы считаете что Вы больший "ас" по эффективному решению "больших данных" можем и посоревноваться на бутыль коньяка - каждый пишет как хочет и на чем хочет :) .
Off-Topic: показать
Привалов Дмитрий, что-то мне подсказывает, что Дима_ не особо рискует потерять коньяк. :)
Название: Re: var или не var?
Отправлено: Владимир Шу от 30-11-2015, 16:22:00
каждый пишет как хочет и на чем хочет
И думается мне, что использован будет не C#, а что-то типа F# и функциональный подход, а там с типами и с Var-ами совсем все по другому =о)
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 30-11-2015, 17:45:03
Цитата: Дима_
Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности

Ну так я еще раз попрошу - если все равно на чем писать - напишите на C# sql запрос, или опишите на нем-же web страницу - помогут Вам типы?

Тип тут действительно и не причем и декларативность и var тоже. В чем проблема понятно описать запрос?
5 строк и что? Вы диван можете тащить целиком по лестнице, а можете разобрать и спустить по частям на лифте.
Разбейте запрос на понятные легко читаемые элементы делов то? Или программа запроса для устройства с ограниченной памятью?
Пример в студию запроса на 5 строк, который нельзя выразить с помощью языка!

 
Цитата: Дима_
Я пишу ровно про это, но с другой стороны - я вообще не хочу смотреть какие типы там вернутся - тип это проблема компилятора - программист должен думать об алгоритме задачи, а не о том через какие там типы это "вывернется". Перепишите логику любого sql запроса больше 5-ти строк на си - ставь типы или нет - понять действие будет очень тяжело - проблемы не в типах, а отсутствии выразительности (декларативности) языка - если у языка нормальная выразительность - явно заданные типы однозначно только мешают как восприятию, так и "сужают" универсальность кода.

Ну если Вы считаете что Вы больший "ас" по эффективному решению "больших данных" можем и посоревноваться на бутыль коньяка - каждый пишет как хочет и на чем хочет :)

В чем суть разговора? c# не достиг декларативности? Какой-же язык по Вашему мнению достиг декларативности и выразительности?
При чем тут "ас" и спор на коньяк?
И почему "как хочет и на чем хочет"? Выбирайте только декларативный, выразительный язык который так отстаиваете, где компилятор все делает за вас и в задании типов  участия не принимается!
Название: Re: var или не var?
Отправлено: Дима_ от 30-11-2015, 22:11:31
В чем проблема понятно описать запрос?
Да в том что его там не описать - никак, (ну с запросом еще можно выкрутиться - и сказать что Вот есть LINQ, с натяжкой это можно принять за ответ, но что, например, делать с web страницей). Вы на императивном языке можете описать "белеберду" из действий, в которой - даже Вы сами потом будете с карандашом разбираться. А как Вы написанный Вами запрос на сервер отправите? А его-же Вы сможете к csv файлу применить? Нет - Вам будет необходимо вводить дополнительный язык DSL (или воспользоваться существующим). Но в любом случае, он будет "вылезать" за рамки вашего Си (он не для того предназначен). Так вот в DSL'ах конечно можно прикрутить типы - но никто это в здравом уме делать не будет (на практике такого нет), но алгоритм читаться будет многократно четче - собственно Вы его этим языком и описываете - вынося реализацию за скобки. Аннотация типа - это аппендицит идущий еще от ассемблера (хоть там и нету явных типов - а все есть данные, включая код, но он очень "жестко" отреагирует если Вы случайно "запустите данные" - хотя случайно - не получится - ибо на то есть защита на уровне процессора - но это все отдельная история) задача которого объяснить компьютеру "физический" смысл данных. В хаскеле даже булевый тип описан средствами самого языка, без ссылок на "компьютерный" бит - и ничего - прекрасно работает.
По остальным вопросам: суть разговора я уже описал не раз - типы это не то что делает алгоритм читабельней - они дают зацепки мысли и примитивный контроль, но не делают код выразительней.
Про аса и спор - ну так Вы первые начали выдвигать предположения, что это у меня от недостатка опыта в определенных сегментах - может оно и так - готов проверить. Язык я, можете не сомневаться выберу декларативный - мне есть с чем сравнивать - благо неплохо знаю и те и другие.
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 03-12-2015, 08:37:18
но что, например, делать с web страницей
то же что и в любом языке, либо оставить в коде и получить нечитабельный код, либо вынести в отдельный файл, тот же html и подгружать отдельно. В итоге редактируете  html редактором, имеете подсветку тегов и т.д. Например так сделано в ASP.NET.

Вы на императивном языке можете описать "белеберду" из действий, в которой - даже Вы сами потом будете с карандашом разбираться. А как Вы написанный Вами запрос на сервер отправите?
...ммм основной код будет "очень сложным", типа такого
LoadHtmlPage("page1");
Request readData = SendRequestToServer("server1");
ApplayToCsv("csv3", readData );
....все действия что просили описал, к языку слабо привязано. А реализация вынесена по классам/функциям которые раз написал и забыл.

Аннотация типа - это аппендицит идущий еще от ассемблера.
Вы первые начали выдвигать предположения, что это у меня от недостатка опыта в определенных сегментах.
Если бы был опыт, то не писали про ненужность типов.
Есть разница когда создаешь массив на разное количество элементов 1000, 100 000, 500 000, 1 000 000, 5 000 000, 100 000 000.
Задайтесь целью создать максимально возможный массив на вашем компьютере, оцените время создания массива, заполнения данными, чтения данных. После изучения и оптимизации к типам может измениться отношение. ;-)
Название: Re: var или не var?
Отправлено: Дима_ от 03-12-2015, 10:42:07
то же что и в любом языке, либо оставить в коде и получить нечитабельный код, либо вынести в отдельный файл..
Любом котором Вы знаете, например на лиспе пример с http://www.racket-lang.org/ (http://www.racket-lang.org/):
#lang web-server/insta
;; A "hello world" web server
(define (start request)
  (response/xexpr
   '(html
     (body "Hello World"))))
И самая суть в том, что лисп это никак не язык для описания Web страниц, это язык на котором можно описать любую семантику средствами самого языка (не путать с синтаксисом - например C# и VB.Net - это один и тот-же язык, вполне допускаю, что оба компилятора рождаются в Microsoft из одного проекта, они отличаются только синтаксисом - то есть "названием" ключевых слов и правилами разметки).
В си семантика очень "слабая", поэтому приходиться создавать отдельные модули на других языках - Linq, Xaml (второй со сноской - т.к. XAML конечно разработан не только для него и собственно начальная цель - разделить - но суть та же - GUI на си не описать).
А то что Вы написали не содержит не символа web страницы.
Про массивы - есть задачи где действительно требуется большой объем данных, но обычно такие порядки я вижу у кодеров которые не потрудились узнать, что такое последовательности, сопоставления, карты, хеши, словари и пр. - покажите мне Вашу реальную задачку где вам понадобился массив на 100 000 000 индексов. И самое главное - а чем будет отличаться коллекция (работа с ней) заполненная указанным типом, от коллекции заполненной типом выведенным компилятором?
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 03-12-2015, 12:00:59
покажите мне Вашу реальную задачку где вам понадобился массив на 100 000 000 индексов
чтение LAS файла, созданного воздушным лазерным сканированием.
http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html

типом выведенным компилятором
встречный вопрос, как компилятор угадает тип?
Название: Re: var или не var?
Отправлено: Дима_ от 03-12-2015, 13:31:38
Тип угадает по применению - ищи алгоритм Хиндли - Минлера - это база сейчас уже более продвинутые.
з.ы. То есть, получается, Вы ничего не знали о том что такое вывод типа - но активно писали что тип надо обязательно указывать.
з.з.ы. А что для чтения LAS без массива никак? Я не готов вчитываться в мануал в ненужую мне задачу - конкретизируйте - почему там необходимо пременить массив (то есть считать или "развернуть" все (ну или достаточно большую часть) данных в память одновременно) - что Вы делаете (какое преобразование) с данными этого формата? Я слабо верю что их нельзя проиндексировать или просто выполнить последовательное преобразование.
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 03-12-2015, 14:20:33
Тип угадает по применению - ищи алгоритм Хиндли - Минлера - это база сейчас уже более продвинутые.
з.ы. То есть, получается, Вы ничего не знали о том что такое вывод типа - но активно писали что тип надо обязательно указывать.
Point3d[] pointArrаy = new Point3d[1000000];
Приведите пример кода с созданием массива по алгоритму Хиндли - Минлера.
Мне очень интересно как компилятор "Тип угадает по применению", без передачи типа и будет ли выделена память сразу или подразумевается выделение по мере заполнения массива?

А что для чтения LAS без массива никак? Я не готов вчитываться в мануал в ненужую мне задачу - конкретизируйте - почему там необходимо пременить массив (то есть считать или "развернуть" все (ну или достаточно большую часть) данных в память одновременно) - что Вы делаете (какое преобразование) с данными этого формата? Я слабо верю что их нельзя проиндексировать или просто выполнить последовательное преобразование.
Задачи были разные, вырезка по произвольному контуру, построение внешнего контура облака точек, визуализация облака.
Для визуализации точки загружались в память видеокарты(не помню точно, вроде 8гб), где можно было покрутить-посмотреть 40-80 млн. в зависимости от настроек.
Название: Re: var или не var?
Отправлено: Дима_ от 03-12-2015, 15:53:11
Приведите пример кода с созданием массива по алгоритму Хиндли - Минлера.
Вы сейчас бред написали - алгоритм  Хиндли - Минлера не создает массив. Он определяет его тип - по применению  - то есть если потом к этому массиву применяется метод который ожидает Point3D - а это можно определить на этапе компиляции - то компилятор понимает что в этом массиве храняться именно Point3d - и проставляет ему соответствующий тип, если -же вы переделаете программу и вместо точек там будут обрабатываться, например ObjectId - конструктору массива будет присвоен соответствующий тип.
Есть еще обобщенные методы - это когда Вы пишите функцию один раз - а их создается по количеству вызывов с уникальной перегрузкой входных типов - примеры ищите сами, а то я не очень понимаю людей которые вначале спорят, выствляя из себя опытных специалистов по данному вопросу, а потом просят привести примеры азов.
По второму вопросу - а что у нас точки в видеокарту только разом загружаются? Или по контуру нельзя отсеять только необходимые точки последовательно.
Название: Re: var или не var?
Отправлено: Привалов Дмитрий от 03-12-2015, 18:31:34
Он определяет его тип - по применению  - то есть если потом к этому массиву применяется метод который ожидает Point3D.
....хм опять тип, и как это связано с?
Аннотация типа - это аппендицит идущий еще от ассемблера
следующий этап на пути к "Dream language", как избавиться от типа в методе?

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

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

....весть то разговор к чему. Вы сами то хоть представляете целостно картину, как будет выглядеть код без типов в массивах, функциях и объектах? И самое главное как это будет реализовываться?
Скорее всего это возможно, но упрется в тип Object там где не надо,  или компилятор будет подсовывать типы double вместо float и т.д.
...вангую, что код программы будет выглядеть компактнее, но программа либо скушает больше памяти из-за неправильной упаковки типов, либо будет тратить ресурсы на преобразование типов, все это обязательно вылезет на больших массивах!