Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод типов 
:(
    Опции темы
 
Как вы относитесь к выводу типов?
Вывод типов - добро [ 20 ]  [74.07%]
Вывод типов - зло [ 2 ]  [7.41%]
Не знаю, что это такое [ 5 ]  [18.52%]
Всего проголосовавших: 27
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
GoldFinch
Дата 17.5.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(KelTron @ 17.5.2010,  05:52)
Цитата(GoldFinch @  15.5.2010,  10:56 Найти цитируемый пост)
какбэ не всегда программисту известен тип того с чем он работает

Тогда и выведение типов не поможет, оно совсем не для этого..

программисту не известно, а компилятору известно.
смотрите пример выше.
PM MAIL ICQ   Вверх
KelTron
Дата 19.5.2010, 10:37 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(Любитель @  17.5.2010,  05:58 Найти цитируемый пост)
Для методов же класса

Именно об этом я и говорю, если это значило то же что и
Цитата(Любитель @  16.5.2010,  11:52 Найти цитируемый пост)
К доступным извне

значит я не не правильно тебя понял.

Цитата(Любитель @  17.5.2010,  05:58 Найти цитируемый пост)
А чем лямбды (в случае использования их как делегатов, а не как expression tree) не являются функцией?

На счёт лямбд, мне кажется пример некорректен, т.к. у функции OrderBy вполне явный тип у параметра.
Мы можем написать так:
Код

delegate int XXX();
XXX x = () => 1 + 2;

Но так нет:
Код

delegate int XXX();
var x = () => 1 + 2;


Цитата(GoldFinch @  17.5.2010,  13:26 Найти цитируемый пост)
программисту не известно, а компилятору известно.

Если компилятору известно, значит и программисту известно. Другое дело если ему лень посмотреть, что там функция возвращает... но тогда как он будет работать с чем то ему неизвестным... 
Хотя по моему я понял, что ты имел ввиду.. Если ты говоришь про то, что тип очень неудобен для восприятия то да, соглашусь, но это не значит, что он неизвестен, всё-таки это разные понятия. Но даже в этом случае auto не избавит от typedef-ов.





--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
mes
Дата 19.5.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(KelTron @  19.5.2010,  09:37 Найти цитируемый пост)
Если компилятору известно, значит и программисту известно

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

Цитата(KelTron @  19.5.2010,  09:37 Найти цитируемый пост)
 Другое дело если ему лень посмотреть, что там функция возвращает

бывает это не столько лень, сколько затратно .. к тому же самому программисту это и не нужно, так чего на это тратить силы ? smile

Цитата(KelTron @  19.5.2010,  09:37 Найти цитируемый пост)
но тогда как он будет работать с чем то ему неизвестным... 

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

Цитата(KelTron @  19.5.2010,  09:37 Найти цитируемый пост)
Если ты говоришь про то, что тип очень неудобен для восприятия то да, соглашусь, но это не значит, что он неизвестен, всё-таки это разные понятия

да разные, и в обоих случаях есть польза от автоопределения.




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 19.5.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



KelTron, все что надо знать программисту о типе - это то каким концепциям он соответствует. конкретный тип знать не зачем.

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

для typedef'ов есть typeof (decltype)
PM MAIL ICQ   Вверх
KelTron
Дата 19.5.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(mes @  19.5.2010,  10:51 Найти цитируемый пост)
программисту для работы не нужен реальный тип, ему нужно знать только какой интерфейс поддерживается.

Цитата(GoldFinch @  19.5.2010,  11:07 Найти цитируемый пост)
KelTron, все что надо знать программисту о типе - это то каким концепциям он соответствует. конкретный тип знать не зачем.

Да кто с этим спорит..?

Похоже мы не понимаем друг друга.. Пара вопросов для уточнения:
Разве в определении boost::bind() не указано что оно возвращает, и мы не можем написать ЧтоТо ххх = boost::bind() ?

Цитата(mes @  19.5.2010,  10:51 Найти цитируемый пост)
чтоб программисту стало известно, он должен изучить весь контекст, который к тому же со временем ( например с новой версией библиотеки) может измениться

Но вот это ЧтоТо, возвращаемое boost::bind(), ведь останется прежним?


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
kemiisto
Дата 19.5.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Проголосовал за добро, но, как и любое "добро", использовать надо с осторожностью. smile Что прочуствовал, поигравшись пару дней со Scala (где-то раньше читал, не могу найти smile ) - не надо использовать вывод типов:
  • В выражениях, где происходит присваивание константы одного из встроенных типов данных. Специфицировать тип явно:
    Код

    val x: Double = 0.0

    а иначе компилятор может вывести что-то другое. Скажем, если опустить Double в примере выше, тип x будет Float.
  • В выражениях, где происходит присваивание значения выражения, тип которого трудно визуально определить. Всякие уже упомянутые цепочечные вызовы и т.п.
  • Ну и ежу понятно, в случае наличия иерархии типов и необходимости, скажем, хранить ссылку на экземпляр конкретного типа-потомка в переменной абстрактного типа-родителя. Тут точно не то выведиццо.


Это сообщение отредактировал(а) kemiisto - 19.5.2010, 12:33


--------------------
PM MAIL WWW GTalk Jabber   Вверх
mes
Дата 19.5.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(kemiisto @  19.5.2010,  11:32 Найти цитируемый пост)
Ну и ежу понятно, в случае наличия иерархии типов и необходимости, скажем, хранить ссылку на экземпляр конкретного типа-потомка в переменной абстрактного типа-родителя. Тут точно не то выведиццо.

Так естественно голову надо голову иметь, а не пихать _вся повдюду_ smile Вопрос, имхо, в том , поможет ли подобное программисту облегчить выражение его мыслей на ЯП.
smile

Цитата(KelTron @  19.5.2010,  11:03 Найти цитируемый пост)
Но вот это ЧтоТо, возвращаемое boost::bind(), ведь останется прежним? 

это _ЧтоТо_ зависит от того, что биндим и состоит из такой цепочки адаптеров, которую программист в уме и вычислить не сможет smile

Цитата(KelTron @  19.5.2010,  11:03 Найти цитируемый пост)
Разве в определении boost::bind() не указано что оно возвращает 


http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html :
Цитата

bind

template<class R, class F> unspecified-1 bind(F f)

Returns: A function object λ such that the expression λ(v1, v2, ..., vm) is equivalent to f(), implicitly converted to R.


Это сообщение отредактировал(а) mes - 19.5.2010, 13:10


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 19.5.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



Цитата(KelTron @  19.5.2010,  10:37 Найти цитируемый пост)
На счёт лямбд, мне кажется пример некорректен, т.к. у функции OrderBy вполне явный тип у параметра.
Мы можем написать так:

Ты путаешь разные вещи. Вывод типов это не только var. Я говорил про вывод типа возвращаемого значения из локальной функции (лямбды в случае шарпа). И тип выводится из контекста использования. Это вполне себе относится к выводу типов.

В шарпе вывод типов не столь широк, как возможен в принципе. Напомню, как можно делать в том же немерле:
Код

def dict = Dictionary();
dict.Add("someKey", 123);


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


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 19.5.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



неоднозначный вопрос
в каждом случае по-разному


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
KelTron
Дата 19.5.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(Любитель @  19.5.2010,  13:45 Найти цитируемый пост)
Вывод типов это не только var. Я говорил про вывод типа возвращаемого значения из локальной функции 

На счёт дженериков согласен, не учёл. Но всё равно не то же самое, тут всё-таки более "узкий" вывод..

Цитата(mes @  19.5.2010,  12:58 Найти цитируемый пост)
это _ЧтоТо_ зависит от того, что биндим и состоит из такой цепочки адаптеров, которую программист в уме и вычислить не сможет

Т.е. по сути запись вида ЧтоТо ххх = boost::bind() невозможна для смертного и единственный способ это auto xxx = boost::bind()?
Как печально..





--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
mes
Дата 19.5.2010, 17:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(KelTron @  19.5.2010,  16:21 Найти цитируемый пост)
Т.е. по сути запись вида ЧтоТо ххх = boost::bind() невозможна для смертного и единственный способ это auto xxx = boost::bind()?
Как печально..

не единственный.. smile 
пока нет auto можно использовать boost::function smile но это не отменяет нужности auto.

например бустовская реализация концепции foreach :
http://www.boost.org/doc/libs/1_42_0/boost/foreach.hpp
обратите внимание сколько завязано на auto_any..  а будь в наличие автоопределение типа все выглядило бы гораздо проще smile

да чего далеко ходить вот например обход вектора векторов..
Код

for (std::vector<std::vector<int> >::iterator i = v.begin(); i != v.end(); ++i ) 
  for (std::vector<std::vector<int> >::value_type::iterator  j = i->begin(); j != i->end(); ++j ) 
  ...

сравните с этим:
Код

 for (auto i = v.begin(); i != v.end(); ++i)
  for (auto j = i->begin(); j != i->end(); ++j)
  ...

хотя конечно еще лучше будет так :
Код

 for (auto i: v)
  for (auto j: *i) 
   ...   

smile


Это сообщение отредактировал(а) mes - 19.5.2010, 17:47


--------------------
PM MAIL WWW   Вверх
k0rvin
Дата 26.5.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(mes @ 19.5.2010,  17:30)
хотя конечно еще лучше будет так :
Код

 for (auto i: v)
  for (auto j: *i) 
   ...   

smile

а еще лучше так:
Код

 for (i: v)
  for (j: *i) 
   ...   



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
mes
Дата 26.5.2010, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(k0rvin @  26.5.2010,  18:15 Найти цитируемый пост)
а еще лучше так:

да, но это уже в С++ не затолкнуть.. как в вашем случае отличить какую i использовать внешнюю или новосозданную локальную ? 
smile

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


--------------------
PM MAIL WWW   Вверх
k0rvin
Дата 29.5.2010, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(mes @ 26.5.2010,  22:48)
Цитата(k0rvin @  26.5.2010,  18:15 Найти цитируемый пост)
а еще лучше так:

да, но это уже в С++ не затолкнуть.. как в вашем случае отличить какую i использовать внешнюю или новосозданную локальную ? 
smile

только новосозданную. использовать внешнюю -- дурной тон. как минимум

Добавлено через 1 минуту и 12 секунд
Цитата(mes @ 26.5.2010,  22:48)
также не получится указать, как ссылку или как значение рассматривать итератор.

и каким же образом auto указывает?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
mes
Дата 29.5.2010, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(k0rvin @  29.5.2010,  00:23 Найти цитируемый пост)
и каким же образом auto указывает? 

Код

for ( auto& i : array ) {}



Это сообщение отредактировал(а) mes - 29.5.2010, 10:40


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.3180 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.