Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция должна возвращать значение? 
:(
    Опции темы
Шухарт
  Дата 25.10.2011, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! 
Такой теоретический вопрос. Любая функция (метод) должна возвращать значение? 
Возможно вопрос наивный, но т.к. по образованию не связан с IT, хочу уточнить. С опытом прихожу к выводу что да, любая функция должна возвращать хоть что-то, это как правило хорошего тона, позволяет часто сделать выполнение алгоритма логичней и манипулировать ходом выполнения удобнее. 
Может в некоторых языках так и есть?

Заранее благодарен. Так же не буду рад какой-нибудь литературе общего толка которая бы навела порядок в голове относительно подобных вопросов, а то практических знаний и опыта хватает, а базовые теоретические хромают.
PS: про Кнута в 3 томах , но пока слишком фундаментально для меня. 


PM MAIL   Вверх
newbee
Дата 25.10.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Да, во многих языках не только функция как таковая, а вообще любая конструкция, возвращает некоторое значение. Это чертовскиудобно. Для примеров и понимания поковыряй всякие лиспы, в частности книгу SICP.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Шухарт
Дата 25.10.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



newbee, спасибо за наводку на SICP. 
PM MAIL   Вверх
Данкинг
Дата 25.10.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Если функция не возвращает значения - то это процедура. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
htoit
Дата 28.10.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Шухарт @ 25.10.2011,  21:59)
Здравствуйте! 
Такой теоретический вопрос. Любая функция (метод) должна возвращать значение? 

Заранее благодарен. Так же не буду рад какой-нибудь литературе общего толка которая бы навела порядок в голове относительно подобных вопросов, а то практических знаний и опыта хватает, а базовые теоретические хромают.
PS: про Кнута в 3 томах , но пока слишком фундаментально для меня.

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

хороший терминологический on-line словарь компьютерных терминов:
http://foldoc.org/
PM MAIL   Вверх
$дмитрий
Дата 30.10.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Любая функция (метод) должна возвращать значение?

Зависит от области применения. К примеру, если результатом вызова функции является вывод текста, то она и не будет ничего возвращать
PM MAIL   Вверх
rfq
Дата 3.11.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Шухарт @ 25.10.2011,  21:59)
Здравствуйте! 
любая функция должна возвращать хоть что-то, это как правило хорошего тона, позволяет часто сделать выполнение алгоритма логичней и манипулировать ходом выполнения удобнее. 

Не соглашусь. Сначала вы вводите возвращаемое значение просто так, затем кто-то решит придать ему смысл (напрмер, успех/неуспех), затем его будут игнорировать и тем самым внесут ошибку. 
И вообще, увидев "return 1", будут терять время на выяснение вопроса "а что значит 1"?, и выяснив, что 1 здесь не значит ничего, поймут, что напрасно потратили время, и сочтут такой стиль за дурной тон.
PM MAIL   Вверх
baldina
Дата 3.11.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



традиционно подпрограммы по способу назначения, организации и использования делят на функции и процедуры. в чистом виде можно считать, что функция суть производит вычисления и возвращает значение (очень похоже на функцию в математике), а процедура генерирует побочные эффекты (в том числе, возможно, путем изменения значений аргументов, переданных по ссылке).
во многих языках есть лишь одна конструкция для организации подпрограмм. например, в С/С++, php, javascript все подпрограммы называются функциями, однако они не обязательно должны возвращать значение.
возврат значения не имеет смысла, если единственное назначение подпрограммы - сгенерировать побочный эффект. например в подпрограммах вывода (типа echo, alert, print).

Цитата(Шухарт @  25.10.2011,  21:59 Найти цитируемый пост)
любая функция должна возвращать хоть что-то

"хоть что-то" никому не нужно, нужно "что-то конкретное"

Это сообщение отредактировал(а) baldina - 3.11.2011, 12:08
PM MAIL   Вверх
newbee
Дата 6.11.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Господа, вот вы все про print, про побочные эффекты... А почему бы print-у не вернуть сгенерированную им строку?

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


--------------------
You're face to face
With man who sold the world
PM   Вверх
$дмитрий
Дата 6.11.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

А почему бы print-у не вернуть сгенерированную им строку?

Рассмотрим символическую функцию showError(), из названия понятно ее предназначение. Что эта функция должна возвращать?
PM MAIL   Вверх
newbee
Дата 6.11.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата($дмитрий @  6.11.2011,  17:00 Найти цитируемый пост)
Рассмотрим символическую функцию showError(), из названия понятно ее предназначение.
Не совсем понятно, куда и как она показывает. Можно вернуть сам текст ошибки, ее код, а лучше - и то, и другое.

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


--------------------
You're face to face
With man who sold the world
PM   Вверх
$дмитрий
Дата 6.11.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Не совсем понятно, куда и как она показывает

Вероятнее всего на устройство вывода

Цитата

Можно вернуть сам текст ошибки, ее код, а лучше - и то, и другое.

Префикс show как раз и говорит о том что текст отображается, зачем же ему еще и возвращать его? smile
PM MAIL   Вверх
newbee
Дата 6.11.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата($дмитрий @  6.11.2011,  19:47 Найти цитируемый пост)
Вероятнее всего на устройство вывода
Интереснее всего, в блокирующем режиме показываем или нет, еще было интересно, что функция получает на вход.

Цитата($дмитрий @  6.11.2011,  19:47 Найти цитируемый пост)
Префикс show как раз и говорит о том что текст отображается, зачем же ему еще и возвращать его?
Я ж не спорю, что эта обезьянья работа с выводом сообщений и окошечек не требует возвращаемого значения. Но если язык обязывает что-то вернуть, то всегда можно найти, что именно. А если не найдется - nil. Многое зависит от языка и культуры программирования на нем. Если мы берем императивный процедурный си, то вполне естественно, что многие функции будут возвращать void или int для контроля ошибок, что в контексте нашего разговора эквивалентно, ведь опять результат выполнения функции спрятан в сайд-эффектах. А если мы возьмем общелисп, который хоть и по-настоящему мульти-парадигменный, но очень поощряет применение функциональных подходов к программированию, мы увидим, что очень удобно разбивать программу так, чтобы функции выполняли работу без сайд-эффектов, а все вычисления могли сводиться к одной большой цепочке, включая вызовы функций, условия, циклы, печать и т.д.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Shaggie
Дата 6.11.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(newbee @  6.11.2011,  20:13 Найти цитируемый пост)
Но если язык обязывает что-то вернуть, то всегда можно найти, что именно. А если не найдется - nil.

Не все языки обязывают что-либо возвращать. Зачем возвращать nil, если ничего возвращать не нужно в принципе?

Мне в этом смысле импонирует тот же Хаскель. Базовая часть выполнена в функциональном стиле, и всегда есть какое-либо возвращаемое значение. А для работы с сайд-эффектами есть два типа функций, можно вернуть получившиеся значения, а можно их отбросить (если упрощённо). Это более корректно семантически, и при чтении кода сразу понятно, чего именно хотел автор.

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


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
baldina
Дата 7.11.2011, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(newbee @  6.11.2011,  13:47 Найти цитируемый пост)
представления о побочных эффектах сильно разнятся от того, как и на каком языке думает программист

имеются в виду языки программирования, верно? я и не утверждал, какие именно представления должны быть. однако имхо если программист думает на английском, то printString печатает строку (побочный эффект), а getString строку возвращает. на любом языке программирования.

Добавлено через 2 минуты и 57 секунд
хотя вообще конечно Вы правы. припоминаю, приходилось мне видеть функцию bolshoyeOkno(), вся работа которой заключалась в возврате ширины окна)))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

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


 




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


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

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