OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 15 Июнь, 2025 17:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 17:20 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Да нет, в книге вирта, даже сортировка пузырьком неудобочитаема. Да и компилятор тоже не архисложная вещь. Обычный синтаксический спуск. Кодогенерация в принципе тоже не архисложная. Однако слабочитаемо. Вот компилятор Свердлова, который в книжке, существенно более читабелен (правда он и попроще).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 17:26 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Про Вирта уже говорили - там более старые факторы играли роль.
Я не помню, честно, его стиль именования - и точно исходники Вирта на меня практически не влияли. Книгу АСД его прочитывал, конечно, не раз, но больше за методическими целями, текст, а не исходники.
"Компиляторы" его не читал целиком, пока необходимости не было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 18:12 

Зарегистрирован: Среда, 22 Февраль, 2006 10:35
Сообщения: 144
Откуда: Новочеркасск
Александр Ильин
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 18:21 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Андрей писал(а):
Чтобы не быть голословным, вот пример даже не самой плохой в этом смысле функции:
Андрей столько раз привел этот код в разных вариантах, что я поневоле прочитал его. Здесь, как на ладони, проявляется полное неумение любителей "распознавать базовые схемы циклов" писать собственно циклы. Особенно впечатляет комментарий с постусловием.
Подробно разжевывать процесс синтеза цикла я не буду, ибо уже надоело.
А функция должна бы выглядеть примерно так (само собой, не тестировал).
Код:
PROCEDURE (rd: StdReader) SetPos (t: INTEGER);
  VAR p2: Page;
BEGIN
  ASSERT((t >= 0), 20);
  p2 := rd.base.first;
  WHILE (p2.t[p2.n-1] < t) & (p2.next # NIL) DO
    p2 := p2.next
  END;
  IF p2.next = NIL THEN
    (*Не знаю, что делать в данном случае – позиция слишком большая *)
  ELSE
    rd.page := p2;
    rd.n := LookAtPage(p2, t)
  END
  ExtractIt(rd)
END SetPos;

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 18:50 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
Вы не забывайте что в книге Вирта алгоритмы повыше повседневного уровня. И код ББ в местах системного характера - тоже.
Тут просто в голове у Вас корреляция, наверное, получилась: надо-разбираться-с-алгоритмом-сразу-не-понятно + ах-да-тут-ещё-переменные-короткие-какой-ужас.

Может быть люди по психо-физиологическим особенностям делятся на два лагеря. Первые по названиям сущностей ловят смысл, а вторые больше по циклам/ветвлениям и т.д., то есть действиям. Модуль ассоциативных массивов - вещь тоже не тривиальная, но почему его нужно кодировать иероглифами, я не знаю. Да и вообще. Как можно подменять сущность, которая сама говорит за себя (вызывает нужные ассоциации) абсолютно не связанной закорючкой (читать: буквой) a, b, c ,r и т.д., так, чтобы от взгляда на переменную программист понимал, что ничего не понимает и должен в очередной раз возвращаться к объявлениям. Чужеродная ассоция a => array of integer, b => current pos не сразу сложится и потребует вдумчивого чтения, а после забудется (в новой процедуре - новые правила).

Цитата:
Горячие споры про эти идентификаторы - частый пример, когда пытаются улучшать, изменяя только один фактор.

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

Цитата:
А функция должна бы выглядеть примерно так (само собой, не тестировал).

Линейный поиск сразу стал явным, что облегчило восприятие, но стоит увеличить размер процедуры и снова встанет проблема кодированных имён.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 19:35 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Peter Almazov писал(а):
Андрей столько раз привел этот код в разных вариантах, что я поневоле прочитал его. Здесь, как на ладони, проявляется полное неумение любителей "распознавать базовые схемы циклов" писать собственно циклы. Особенно впечатляет комментарий с постусловием.


Во-первых, семантика цикла: найти такую рядом стоящую пару p1, p2, что t - между ними. Явное объявление этой пары, как двух переменных, - это правильно. (Определение пары в расширенном смысле, включая пары, один из компонентов которых - несуществующая страница).
Отсюда - совершенно очевидный цикл: последовательный перебор пар, пока не обнаружена подходящая пара или не упёрлись в конец последовательности (да, да, само собой получился "линейный поиск", увы, я не виноват, что семантика цикла такая).

Выкладки же с постусловиями относятся не к циклу, а к IF-ам после. Чтобы разобраться, как после цикла интерпретировать граничные случаи (p1 = NIL или p2 = NIL).

Всё и строго, и семантически нагружено.
А что там Пётр может написать короче более "сухую" формалистику - мне, например, мало интересно.
Потому что "физический смысл" формалистики будет потерян.

Цитата:
Здесь, как на ладони, проявляется полное неумение любителей "распознавать базовые схемы циклов" писать собственно циклы.


"Вы, граф, говорят, цельный день по пятакам упражняетесь - и как раз с двадцати шагов" (С) Б. Акунин "Азазель"
Разумеется, если я стремлюсь составлять программу так, чтобы избегать "необычных циклов" (проще и тупее), то у меня менее развиты навыки борьбы с этими "необычными циклами", нечасто нужными.
Охотно уступлю Вам в этих навыках, лучше потренирую навыки редукции задач к тривиальным составляющим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 21:05 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Илья Ермаков писал(а):
Во-первых, семантика цикла: найти такую рядом стоящую пару p1, p2, что t - между ними.
В этом и состоит Ваша ошибка. Семантика цикла состоит в том чтобы найти ровно ОДНУ нужную страницу, а не пару.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 21:28 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Peter Almazov писал(а):
А функция должна бы выглядеть примерно так (само собой, не тестировал).
А если rd.base.first = NIL?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 22:28 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Александр Ильин писал(а):
Peter Almazov писал(а):
А функция должна бы выглядеть примерно так (само собой, не тестировал).
А если rd.base.first = NIL?
Это исключено, при инициализации размещается одна страница. Посмотрите на весь код повнимательнее. А если бы этого не было, то нужно было бы сделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 22:56 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Peter Almazov писал(а):
В этом и состоит Ваша ошибка. Семантика цикла состоит в том чтобы найти ровно ОДНУ нужную страницу, а не пару.


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

Код:
   PROCEDURE (rd: Reader) SetPos* (t: INTEGER), NEW, ABSTRACT;
   (* Считать предшествующий и последующий замеры для момента времени t.
      Предусловие
         20   t >= 0
 
      Постусловие:
            rd.t1 <= t
            rd.f1 - значение замера в момент времени t1
            rd.f2 - значение замера в момент времени t2
         если нет замеров после t
            rd.t2 = rd.t1
         если есть замеры после t
            (rd.t1 < rd.t2) & (rd.t <= rd.t2)
   *)
 


Проектируя сверху вниз, естественно сразу ввести (ещё до каких-то циклов) эти p1 и p2, а затем цикл построить с ними же. Цикл с парой переменных, хранящих "соседние" значения, вполне общепринят, как в тех же последовательностях аля Фиббоначчи. Т.е. из нисходящего проектирования всё естественно вылезло.

При другом смысле процедуры в голову пришёл бы и Ваш вариант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 23:06 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Тогда еще двойка за выбор имен! Не SetPos, а что-нибудь типа ReadLastTwo надо было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Вторник, 21 Декабрь, 2010 23:24 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Возможно... Только причём тут LastTwo? NearestTwo хотя бы тогда. Тыкаем примерное t, получаем два ближайших справа и слева фактических замера.

Просто схема использования Reader всё-таки стандартная для потокового чтения.
SetPos - получили первую пару, относительно примерно указанного t.
Дальше Read - двигаемся по фактически имеющимся замерам.

Таким образом, снова продиктовано "нисходящим образом".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Именование переменных
СообщениеДобавлено: Среда, 22 Декабрь, 2010 08:29 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Илья Ермаков писал(а):
Таким образом, снова продиктовано "нисходящим образом".
"Ошибки или дефекты, вызванные применением метода программирования "сверху-вниз", не являются ошибками и дефектами".

На самом деле "сверху-вниз" тут вообще не при чем. Просто при поиске был мусор в голове – не было четко определено, что, все-таки, ищем – одну позицию или некую "пару". Но при попытке сформулировать инвариант цикла весь мусор бы автоматически выдуло ветром.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB