OberonCore
https://forum.oberoncore.ru/

История с несколькими моралями (в том числе анти-FOR)
https://forum.oberoncore.ru/viewtopic.php?f=7&t=1443
Страница 1 из 7

Автор:  Илья Ермаков [ Пятница, 03 Апрель, 2009 22:34 ]
Заголовок сообщения:  История с несколькими моралями (в том числе анти-FOR)

Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...):

Цитата:
[22:30:00] <Seraf> FOR спасет мир)
[22:30:08] <ermakov> ))
[22:31:14] <Seraf> Сидел над курсачом щас... Нужне был линейный поиск... Через WHILE такая фигня получалась и не работала) Допетрил сделать через FOR - и все заработало)
[22:31:39] <ermakov> Покажи поиск. Через FOR поиск писать нельзя.

[22:31:55] <Seraf> PROCEDURE Double():BOOLEAN;
VAR i: INTEGER;
BEGIN
FOR i:=0 TO c0.outCount-1 DO
IF (c0.outs[i].x = i1) & (c0.outs[i].y = j1) THEN
RETURN TRUE;
END;
END;
RETURN FALSE;
END Double;
[22:32:03] <Seraf> =)
[22:32:14] <Seraf> Может быть это и не совсем поиск)))
[22:32:58] <ermakov> Поиск. С завуалированным goto. Надо кого-то линейкой по рукам.
[22:33:23] <Seraf> Я тут не причем)
[22:33:29] <Seraf> Он сам)
[22:33:31] <ermakov> Блин. Правильно Вирт в Обероне 07 запретил RETURN из середины. Ибо народ найдёт даже такой GOTO ))
[22:33:41] <Seraf> =)

[22:33:45] <ermakov> Через WHILE перепиши.
[22:34:01] <ermakov> То, что ты написал - безграмотнейшая вещь.
[22:34:02] <Seraf> Вот перепиши мне) Я пол часа мучался)
[22:34:09] <Seraf> Да я знаю
[22:34:13] <Seraf> Но она хоть работает)
[22:35:14] <ermakov> i := 0;
WHILE (i < c0.outCount) & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) ) DO
INC(i)
END
[22:36:09] <ermakov> Условие окончания у поиска - это всегда, когда бегунок - за последним элементом. Т.е. = кол-ву в массиве. Тогда усл-е продолжения - < кол-ва в массиве.
[22:36:15] <ermakov> Так и верно.
[22:36:21] <ermakov> Ты, видать, опечатался там.
[22:36:26] <Seraf> нет
[22:36:28] <ermakov> Вместо i написал j или вроде того.
[22:36:34] <Seraf> Неа
[22:36:38] <Seraf> Я все помню
[22:36:38] <ermakov> Или забыл i := 0.
[22:36:40] <ermakov> В начале.
[22:36:41] <Seraf> Нет
[22:36:43] <Seraf> Тоже было

[22:46:59] <Seraf>
PROCEDURE Link* (VAR grid: Grid; i0, j0, i1, j1: INTEGER);
VAR c0,c1: Cell;
r1,r2: Ref;

PROCEDURE Double():BOOLEAN;
VAR i: INTEGER;
BEGIN
i := 0;
WHILE (i < c0.outCount) & ((c0.outs[i].x # i1) & (c0.outs[i].y # j1)) DO
INC(i);
END;
RETURN i<c0.outCount;
END Double;

[22:48:18] <Seraf> Дядь Илюш, в каком месте я промахнулся?)
[23:02:11] <ermakov> Ну, друг... Я тебя без сладкого оставлю!!!
[23:02:22] <ermakov> & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) )
[23:02:43] <ermakov> если ты хочешь внести ~ в скобки, то как ты это должен сделать?
[23:03:06] <Seraf> # поставить
[23:03:09] <ermakov> Отрицание, применённое к конъюнкиции - это дизъюнкция отрицаний членов.
[23:03:30] <ermakov> т.е. <=> (c0.outs[i].x # i1) OR (c0.outs[i].y # j1)
[23:03:39] <Seraf> У меня так и стояли)
[23:03:44] <Seraf> Ой
[23:03:53] <Seraf> Как OR?
[23:03:55] <Seraf> Ты что?
[23:03:57] <Seraf> нееее
[23:04:14] <Seraf> Нужно чтобы и то выполнялось
[23:04:17] <ermakov> Правила мат. логики неумолимы. Кроме того, можно просто порассуждать - и убедишься, что именно так )
[23:05:02] <ermakov> НЕ (А и В) - это значит, что конъюнкция ложна. Конъюнкция ложна, когда ложен один ИЛИ оба её члена. Т.е. (НЕ А) ИЛИ (НЕ Б)
[23:05:24] <Seraf> ТвАя мать...
[23:05:43] <ermakov> Ничего, бывает ) Учимся ещё )
[23:06:08] <ermakov> (только вот гораздо более великовозрастные дядьки вот так проколюццца, а потом орут, что без FOR жисть не мила :) )
[23:06:27] <ermakov> Поэтому НЕ НАДО было упрощать исходное условие.
[23:06:46] <Seraf> Пошел я любить Матан...
[23:06:54] <Seraf> Неудачник((
[23:06:55] <ermakov> Есть шаблон лин. поиска, где идёт ~ (условие_поиска). Нахрена вносить этот ~ в скобки? Он те мешал? ))
[23:07:28] <ermakov> условие поиска имеет смысл - оно из задачи идёт. Условие, обратное к нему, уже не из задачи поиска. Его сознанию проверить сложнее.
[23:07:32] <Seraf> Мешал
[23:08:15] <Seraf> Хнык...
[23:08:25] <Seraf> *море слез
[23:12:15] <Seraf> Бей меня в следующий раз по рукам, если я FOR напишу...

[23:14:01] <ermakov> А история очень поучительная. Моралей много...
1-я. Если в языке есть возможность найти GOTO, программёр его обязательно найдёт.
2-я. За "буйством FOR-а" лежат проблемы мат. навыков.
3-я. Преждевременная (или вообще бессмысленная) оптимизация в ущерб прозрачности/соответствия единой схеме.


Автор:  Пётр Кушнир [ Пятница, 03 Апрель, 2009 22:43 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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

Автор:  Илья Ермаков [ Пятница, 03 Апрель, 2009 22:46 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

(уточню, что история публикуется с одобрения её "автора")

Автор:  Борис Рюмшин [ Пятница, 03 Апрель, 2009 22:48 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Преждевременная оптимизация - корень всех зол. (с) Кнут

Автор:  Info21 [ Пятница, 03 Апрель, 2009 23:44 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Борис Рюмшин писал(а):
Преждевременная оптимизация - корень всех зол. (с) Кнут
А точно Кнут?

(У меня профессиональное недоверие к такого рода атрибуциям. Вчера только опубликовал исследованьице по истории физики за 60-е гг.)

Автор:  Vlad [ Суббота, 04 Апрель, 2009 00:16 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

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


Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать...

Автор:  Пётр Кушнир [ Суббота, 04 Апрель, 2009 01:16 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
Илья Ермаков писал(а):
Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...):


Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать...
[сарказм mode on]
Илья, вы не тому учите детей! Надо учить каллекциям на питоне, там всё высокоуровнево и без т.н. "мяса". Ведь юзать готовые компоненты без осознания сути - это прекрасно!
[сарказм mode off]

Автор:  Илья Ермаков [ Суббота, 04 Апрель, 2009 08:09 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать...

Что так смущает досточтимого сэра? :)
Индексы и много переменных? Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ.

Автор:  Илья Ермаков [ Суббота, 04 Апрель, 2009 08:13 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Вообще, поразительно. Кода-то как такового не было. Неужели такая реакция на нормальное логическое условие. Вспоминается наблюдение Axel-я, чтто его коллеги избегают WHILE из-за того, что любое условие с несколькими & или OR кажется им уже сложным.

Автор:  Vlad [ Суббота, 04 Апрель, 2009 08:35 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Илья Ермаков писал(а):
Vlad писал(а):
Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать...

Что так смущает досточтимого сэра? :)
Индексы и много переменных?


Да, индексы непонятно по чему и шифрованные названия переменных.

Илья Ермаков писал(а):
Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ.


Гхм... Это должно испугать и внушить уважение? :) Вот я давеча совсем простую штуку делал. На входе два списка (разных по смыслу), из них строится один список строк и показывается пользователю в диалоге для того, чтобы он выбрал нужный ему элемент. Ну и потом с оригинальным элементом (в одном из двух данных списков) совершаются определенные действия. Поскольку сам диалог ничего не знает о природе двух данных списков, а знает только о списке строк, то и в качестве результата он возвращает индекс выбранной строки. И по этому индексу потом находится элемент в одном из двух данных списков. Так вот, к чему я это. Я вот теперь думаю, что индекс на выходе - это была все-таки плохая идея. Проще надо :) Без всякой математики по вычислению оригинального элемента, даже если она и сводится к банальному добавлению смещения. Нечитабельно это. И хрупко...

Автор:  Илья Ермаков [ Суббота, 04 Апрель, 2009 09:12 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Цитата:
Илья Ермаков писал(а):
Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ.

Гхм... Это должно испугать и внушить уважение? :)

Нет, это к тому, что понятия индекса и матрицы там естественные. А какое-нить понятие коллекции/набора - ни-пришей-ни-пристебай.

Из названий переменных фигурируют итераторы и парные типа c0, c1, которые подчёркивают вот эту парность-сопряжённость. Что такое с0, с1 - решается подъёмом глаз к VAR и взгляду на тип, т.к. вся внешняя процедура влезает меньше, чем на экран. Для того и VAR-секция придумана. Неужели удобнее зашивать информацию о том, что это такое есть, в длинные названия локальных переменных типа cell1, cell2?

Секция VAR аналогична соглашению "пусть...". Прочитали, включили контекст, далее смотрим "выкладки" ниже.

Автор:  Info21 [ Суббота, 04 Апрель, 2009 09:20 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad в данном случае просто провокатор. Не стоит тратить силы.

Автор:  Trurl [ Понедельник, 06 Апрель, 2009 08:51 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Вот, полюбуйтесь
Код:
  LT = LEN(TAB)
  FOR i = 1 TO LT
    IF i < LT
      IF S <= TAB[i + 1]
        EXIT
      ENDIF
    ENDIF
  NEXT
  IF i > LT
    i = LT
  ENDIF

Автор:  Илья Ермаков [ Понедельник, 06 Апрель, 2009 10:08 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Ужас. А язык - какой-нибудь PL-SQL?

Автор:  Geniepro [ Понедельник, 06 Апрель, 2009 11:42 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

PL-SQL похож на Аду.
А это -- просто VB...

Автор:  Vlad [ Понедельник, 06 Апрель, 2009 20:27 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Илья Ермаков писал(а):
Нет, это к тому, что понятия индекса и матрицы там естественные. А какое-нить понятие коллекции/набора - ни-пришей-ни-пристебай.


Хорошо, пусть будет индекс :) Рассмотрим конкретно вот эту строку:
Код:
WHILE (i < c0.outCount) & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) ) DO

Вот мои "претензии":
1) Почему граница индекса задается одной сущностью (c0), а индексируется другая (c0.outs)? В смылсе я понимаю, что такого не всегда можно избежать, но только руки сразу чешутся - влепить туда ASSERT(c0.outCount == c0.outs.size()).
2) c0.outs[i] я бы хотел видеть в отдельной локальной переменной с говорящим названием. Глядишь и условие стало бы не таким "мясным" и ошибиться в нем было бы труднее.
3) Таки for по индексу + проверка условия внутри нагляднее вот такого трехэтажного условия. Это как раз тот случай, когда Дейкстру можно принести в жертву практике. Во всяком случае при существующем синтаксисе языка.

Илья Ермаков писал(а):
Из названий переменных фигурируют итераторы и парные типа c0, c1, которые подчёркивают вот эту парность-сопряжённость. Что такое с0, с1 - решается подъёмом глаз к VAR и взгляду на тип,


Вот именно это меня в VAR и бесит - подъем глаз :) Разрыв с контекстом. Вообще я уже все сказал, что думаю по поводу этой вредной секции в соответствующей теме, не буду повторяться :)

Автор:  Илья Ермаков [ Понедельник, 06 Апрель, 2009 20:46 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Vlad писал(а):
1) Почему граница индекса задается одной сущностью (c0), а индексируется другая (c0.outs)? В смылсе я понимаю, что такого не всегда можно избежать, но только руки сразу чешутся - влепить туда ASSERT(c0.outCount == c0.outs.size()).

Потому что студент не заморачиваецца и использует массив статического предельного размера (динамически созданный под указанную максимальную степень графа) + его размер рядом. И правильно в данном случае делает.

Цитата:
2) c0.outs[i] я бы хотел видеть в отдельной локальной переменной с говорящим названием. Глядишь и условие стало бы не таким "мясным" и ошибиться в нем было бы труднее.

И будем писать лишнюю строку до цикла и в теле для выборки текущего out? Лишняя контекстность и удлиннение. Какие проблемы прочитать нормальное логическое выражение - не представляю. Непривычка - только и всего.

Цитата:
3) Таки for по индексу + проверка условия внутри нагляднее вот такого трехэтажного условия. Это как раз тот случай, когда Дейкстру можно принести в жертву практике.

Это тот случай, когда со студенческой скамьи надо натаскать на мат. логике и выражению мысли с помощью её предикатов. А иначе конечно - проще пытаться шаг за шагом проверять, не пора ли "спрыгнуть с поезда". Только где гарантии, что цепь таких проверок реально соответствует условию окончания итерационного процесса.

Цитата:
Вот именно это меня в VAR и бесит - подъем глаз :) Разрыв с контекстом. Вообще я уже все сказал, что думаю по поводу этой вредной секции в соответствующей теме, не буду повторяться :)

Да не поднимайте... Сначала прочтите соглашение "пусть будем обозначать то-то и так-то...", а потом 7-8 строк кода в теле процедуры.

Автор:  Vlad [ Понедельник, 06 Апрель, 2009 21:19 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Илья Ермаков писал(а):
Потому что студент не заморачиваецца и использует массив статического предельного размера (динамически созданный под указанную максимальную степень графа) + его размер рядом. И правильно в данном случае делает.


Да. Может быть и правильно в данном случае. Я говорю с точки зрения читателя без полного понимания контекста. Чем меньший контекст нужен для понимания кода - тем код читабельнее. Но конечно и этот принцип не надо превращать в догму :)

Илья Ермаков писал(а):
И будем писать лишнюю строку до цикла и в теле для выборки текущего out? Лишняя контекстность и удлиннение.


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

Илья Ермаков писал(а):
Какие проблемы прочитать нормальное логическое выражение - не представляю. Непривычка - только и всего.


Такие обычные чисто человеческие проблемы - надо лишний раз убедиться, что x и y относятся к одной сущности - c0.outs[i]. В такой код легко вкрадываются опечатки типа c1.outs[i].

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


А где гарантии, что человек не запутается в таком условии (что и имело место в данном случае)?

Илья Ермаков писал(а):
Да не поднимайте... Сначала прочтите соглашение "пусть будем обозначать то-то и так-то...", а потом 7-8 строк кода в теле процедуры.


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

Автор:  Евгений Темиргалеев [ Понедельник, 06 Апрель, 2009 21:41 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

У студента может код и мясной, ну куда уж ему... А у Вас, Vlad, мясные рассуждения применительно к образованию. Так что шли бы Вы лесом...

Автор:  Info21 [ Понедельник, 06 Апрель, 2009 21:45 ]
Заголовок сообщения:  Re: История с несколькими моралями (в том числе анти-FOR)

Условие поиска присутствует явно, цикл имеет абсолютно стандартную структуру.

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

С третьей стороны, это промежуточный какой-то код. К тому же учебный. Стилистические претензии предъявлять просто рано.

Страница 1 из 7 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/