Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - vlad

Страницы: 1 ... 89 90 [91] 92 93
1351
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 09:42:51 pm »
vlad, а оцени ка моё предложение по контролю http://oberon.talk4fun.net/index.php?topic=6.msg260#msg260
Ну и далее по тексту.

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

1352
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 09:25:48 pm »
1. С какого это бодуна мы хотим, чтобы не было побочных эффектов? Побочный эффект - нормальный инструмент в программировании.

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

Дык. Желание понятно. Метод решения - нет. Ну допустим вы запретите обращаться к "внешним" сущностям из "функций". От "закрытия файла" это не спасет. Всегда можно спустить в качестве аргумента ну очень абстрактный интерфейс, вызов метода которого закроет файл. Никакого контроля. Ограничить аргументы простыми неуказательными типами? Тогда толку от таких "функций" будет ничтожно мало.

Цитата: Сергей Прохоренко
Я понимаю, что тем, кто съел собаку на C/C++, теперь море по колено, и они такими мелочами, как наглядность, не заморачиваются.

Не надо обвинять плюсистов в настолько страшных грехах :) Они все люди и наглядность кода им тоже важна. И именно поэтому я считаю, что оберон еще пилить и пилить ;)

Цитата: Сергей Прохоренко
Оберон уже на три порядка нагляднее C/C++, чего же, дескать, еще желать?

Давайте не будем в этом топике ;) Ограничимся функциями и процедурами (хотя это тоже уже неоригинальный топик).

Цитата: Сергей Прохоренко
Но у людей, не прошедших эти медные трубы, требования к наглядности (и надежности!) более высокие.

Описываемую проблему ("неожиданное закрытие файла") я, будучи на С++, решаю такими самоограничениями:
1. Минимум глобальных переменных. Это значит, что функция не может закрыть файл, если только к ней через аргумент не пришло что-то, что можно использовать для закрытия файла.
2. По возможности аргументы делаются const. Это уменьшает вероятность того, что функция сделает что-то деструктивное даже используя такие аргументы.

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

1353
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 08:16:10 pm »
Вызов функции, возвращающей значение определенного типа, может быть операндом выражения соответствующего типа. Вызов процедуры - нет.

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

1354
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 07:46:55 pm »
Тогда лучше использовать дрвний термин "подпрограмма". Применение этого термина никак не требует разделения на процедуры и функции. Хотя даже в фортране (видимо, из чисто практических соображений) были и subroutine и function.

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

Вот я в упор не понимаю - какое у них разное употребление :) Сегодня функция... пардон, процедура ничего не возвращает (рисует фигуры, как кто-то приводил пример), завтра - она уже возвращает количество отрисованных фигур. И что, теперь она - функция и должна по-другому употребляться и восприниматься?

1355
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 04:48:56 pm »
А есть ли смысл у разделения на процедуры и функции?
Есть.
Функция - это то, к чему мы привыкли в математике.
А процедура имеет ясный и понятный смысл - это просто последовательность команд исполнителя, не обязательно возвращающий некий результат.
Например, рисование фигуры в окне.  Приплетать к последовательности команд еще и неких результат в виде значения - это лишнее.

Применительно к языку а-ля оберон, функция - это тоже последовательность команд, как ни крути. Так что вся разница сводится к возврату или не возврату значения. И эта разница, ИМХО, даже не стоит отдельного термина. Значение или возвращается или нет. Так же как не стоит отдельного термина процедура/функция без аргументов.

1356
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 01:14:23 pm »
В моей практике пока не возникало необходимости в таком уровне вложенности, максимум 2 от силы 3.
2Vlad
На всякий случай уточню, я говорил о вложенности описаний функций, но не их вызовов.
Тогда возможно мы говорили немного о разном  :-\\ Ивиняюсь, если я не правильно Вас понял.

Да, я говорил именно о вызовах, а не об описании. Иначе смысл всей затеи (разделение на функции с результатом и процедуры с OUT-параметрами) для меня теряется...

1357
Общий раздел / Re:Оберон в образовании.
« : Февраль 25, 2011, 03:02:48 am »
Ну так это просто приведет к тому, что никто не будет писать функции ...
... там где нужны процедуры, и никто не будет писать процедуры там, где нужны функции!  :)

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

P.S. Еще, вроде, в Аде что-то похожее есть. Но не знаю деталей.

1358
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 05:42:26 pm »
В этом случае я напишу процедуру, в которой сначала будет вызов функции, а далее ниже по тексту этот самый логгинг  ;)

Не напишите. У вас "сверху" 20 функций. Куда вы процедуру воткнете? На самый верх? Там логать уже будет слишком поздно. Или слишком рано.
Тогда я перепишу все 20 функций. "Бешеной собаке семь вёрст - не крюк"  :)

Ну так это просто приведет к тому, что никто не будет писать функции :) Чтобы потом не переписывать :)

1359
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 05:22:34 pm »
Ну что вы в самом деле :) Ну вот захотите вы какой-нибудь логгинг в этой функции добавить...
В этом случае я напишу процедуру, в которой сначала будет вызов функции, а далее ниже по тексту этот самый логгинг  ;) Мухи не должны быть вперемежку с котлетами  :)

Не напишите. У вас "сверху" 20 функций. Куда вы процедуру воткнете? На самый верх? Там логать уже будет слишком поздно. Или слишком рано.

1360
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 05:03:17 pm »
... абсолютно непрактично переделывать 20 функций в процедуры как только самая "нижняя" функция превратится в процедуру.
"Нижняя" функция не должна превращаться в процедуру, так как это может вызвать побочный эффект. И вообще, прежде чем начинать писать 19 "верхних" функций нужно определиться, что я хочу: вычислить выражение или выполнить обработку данных.

Ну что вы в самом деле :) Ну вот захотите вы какой-нибудь логгинг в этой функции добавить... В общем да - такой хаскель, только вручную ;)

1361
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 04:50:08 pm »
Что есть функция или процедура? Это есть кусок кода который что-то делает. У этого куска кода есть вход и выход. Все. Таким образом нужно явно указать что этому куску подаем на вход, и что будем принимать на выходе. Именно явно, а не как сейчас.
Не могу с этим согласиться. В Оберонах (ведь тема о них?) единицей инкапсуляции является модуль. Изнутри процедуры видны все глобальные переменные. Если обязать программистов явно указывать все первичные (на входе процедуры) и вторичные (на выходе процедуры) данные, то они (программисты) "повесятся" прокачивать через параметры все эти объёмы информации.

Да не. Это сначала только страшно кажется :) Вся эта куча зависимостей от глобальных переменных разбивается на кучки и инкапсулируется. Так что объемы прокачиваемой информации будут скрыты и все будут счастливы :)

1362
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 04:40:01 pm »
Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное?
Если процедура не меняет ничего глобального (в том числе -- и ввод/вывод), то толку от неё нет, только процессорное время зря тратит. Зачем она нужна?

В смысле? Она может сделать 2 + 2 и вернуть результат :) Или вы к тому, что все есть функция и нечего придумывать лишние сущности?

1363
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 04:30:33 pm »
Проблему, на мой взгляд, можно решить введя в язык следующие правила:
1. Внутри функции глобальные (по отношению к ней) переменные доступны только для чтения.
2. Параметры, передаваемые в функцию по ссылке, доступны внутри функции только для чтения.
3. Внутри функции запрещено использовать вызов процедур.

ИМХО такое правило не будет работать, потому что абсолютно непрактично переделывать 20 функций в процедуры как только самая "нижняя" функция превратится в процедуру. В этом смысле ограничение на уровне конкретных аргументов (просто const или как Алексей написал) более гранулярно и гибко. А функция/процедура - должна быть одной сущностью.

1364
Общий раздел / Re:Оберон в образовании.
« : Февраль 24, 2011, 03:29:24 pm »
Так покажите это! Для меня достаточно будет если вы покажете ..."
Не понял, что показать-то? Процедура - это обработка данных, которую необходимо выполнить. Функция - это значение, которое необходимо получить/вычислить. В процессе своей работы функция не должна изменять глобальное (по отношению к данной функции) состояние программы.

Не проще ли просто стремится к тому, чтобы процедуры/функции не изменяли что-то глобальное? Тогда не потребуется столь нечеткое разделение на процедуры и функции. И OUT-параметры - тоже не потребуются :)

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

Классный выход. Настолько классный, что в любом распространенном ЯП уровнем выше С в каком-то виде присутствует альтернатива "отрицательным" результатам. Даже в хаскеле - при том, что там нет исключений - зато есть монады :)

Цитата: Berserker
Пора уже понять, что практически все функции не способны гарантировать результат.

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

Цитата: Berserker
Что исключения одного класса обезличиваются при всплывании, превращаясь в нечто вроде TIOError. Что если мы хотим обработать 250 вызовов функций по-разному, нам понадобятся 250 обработчиков и их логика должна быть на том же уровне, что и вызов функций.

Они не обезличиваются. Это вы абстрагируетесь от конкретного типа, по всем правилам ООП. Хотите обработать 250 исключений по-разному - пожалуйста. Никто этого не делает, потому что никому это не надо :)
Логика обработки не может быть на одном уровне - иначе вы не сможете переиспользовать один и тот же код. Функция чтения файла не может знать, что ей делать с ошибкой открытия файла. Это может знать только конкретная операция, например операция открытия документа или операция чтения данных из файлового кэша. В одном случае документ не может быть открыт и пользователь получает внятную ошибку. В другом - данные берутся из оригинального источника и кладутся в кэш. В обоих случаях между "верхом" операции и функцией чтения файла в стэке могут быть десятки слоев абстракции, которым нафиг не нужна возня с такой ошибкой, они хотят делать свою работу.

Цитата: Berserker
С какой кстати высший уровень должен знать все типы исключений низших, а если не знать, то иметь лишь единственный молчаливый способ их обработать?

Действительно, с какой кстати? И почему единственный? Сколько надо - столько и сделаем. Обычно достаточно единичных обработчиков на кучу кода. И почему молчаливый? Как захотим - так и сделаем.

Страницы: 1 ... 89 90 [91] 92 93