OberonCore
https://forum.oberoncore.ru/

B01: HostFiles.NewWriter
https://forum.oberoncore.ru/viewtopic.php?f=130&t=6169
Страница 2 из 3

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 15:28 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Евгений Темиргалеев писал(а):
Иван Денисов писал(а):
Так как для чего-то ввели тогда NIL в качестве возврата вместо аварийной остановки.
Его ввели Оминки задолго до нас, когда проектировали интерфейс Files.

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

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 15:30 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Борис Рюмшин писал(а):
Иван Денисов писал(а):
Борис Рюмшин писал(а):
Вот именно, что на практике подобных задач не возникает. Интерфейс излишен.

Противоречите сами себе. Так как для чего-то ввели тогда NIL в качестве возврата вместо аварийной остановки. Значит аварийная остановка таки случалась. Мы можем по кругу это обсуждать каждый год :) Хорошая традиция.

Я ни в чём не противоречу.

Борис вы говорите, что такое никогда не возникало. Но сами сделали, чтобы Files.NewWriter возвращал NIL. Зачем? А потому что Илья говорил, что были падения из-за АВОСТОВ. Поэтому надо было делать обработку исключений, чтобы проверять NIL или не NIL после создания Writer. А раз были случаи, то значит на практике такие задачи возникают. Вот и получается противоречие.

Автор:  Борис Рюмшин [ Среда, 09 Октябрь, 2019 15:39 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Соответствие спецификации не может быть противоречием. Это раз.
У Ильи случаются специфические случаи. Это два.
Кому проект один поправить, а у нас довольно большой отработанный и протестированный набор, который используется в разных проектах. Архитектурно для себя мы это исправим чуть позже, просто задействовав свою реализацию файлов с другим интерфейсом, не совместимым с ББ. Но, боюсь, следующее наше изделие, которое сейчас заменит сборку OberonCore, будет всё также содержать отличия от того, что сделано в Центре. Не мы рушим совместимость в данном случае, а они.

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 17:06 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Борис Рюмшин писал(а):
Соответствие спецификации не может быть противоречием.

Ещё раз. Документация отстала от изменений. Так что этот аргумент не работает.
Документацией был КОД, он был первичен в этом случае. В коде был АВОСТ, который было невозможно обойти. Для обхода были сделаны Closed и Shared. "Ни шагу назад!" - вот такой был лозунг. Вот так и в Центре пообсудили. Есть резон в таком изменении, чтобы был АВОСТ там. Чтобы найти ошибку как можно раньше. Есть такой принцип. Он общий для программирования, если я правильно понимаю. Оминк его туда вернули АВОСТ. Почему вернули, кто из знает... Ну и центр решил не идти против течения. Я это обсуждение помню и на форуме оно там зафикисировано.

Автор:  Борис Рюмшин [ Среда, 09 Октябрь, 2019 17:14 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Мы пока остаёмся при своём мнении по этому вопросу.

Автор:  Борис Рюмшин [ Среда, 09 Октябрь, 2019 17:16 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Иван Денисов писал(а):
В коде был АВОСТ, который было невозможно обойти. Для обхода были сделаны Closed и Shared.

Ну и, конечно, изменение базового интерфейса, чтобы обойти АВОСТ это сильное решение. Волевое.

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 18:48 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Борис Рюмшин писал(а):
Иван Денисов писал(а):
В коде был АВОСТ, который было невозможно обойти. Для обхода были сделаны Closed и Shared.

Ну и, конечно, изменение базового интерфейса, чтобы обойти АВОСТ это сильное решение. Волевое.

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

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 18:50 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

При том, что в Блэкбоксе как раз неплохо абстрагирован Files, и никто не мешает сделать копии модулей и линковать их соответственно для разных платформ 1.6 или 1.7. Вот селекторы как раз не очень хорошо использовать. Лучше бы без них обходиться.

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 18:52 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Борис Рюмшин писал(а):
Мы пока остаёмся при своём мнении по этому вопросу.

А какое тут может быть мнение, если это факт. Есть история кода.

Автор:  Борис Рюмшин [ Среда, 09 Октябрь, 2019 21:17 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Иван Денисов писал(а):
Борис Рюмшин писал(а):
Мы пока остаёмся при своём мнении по этому вопросу.

А какое тут может быть мнение, если это факт. Есть история кода.

Иван, ты отказываешь нам в праве иметь собственное мнение?

Автор:  Борис Рюмшин [ Среда, 09 Октябрь, 2019 21:27 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Ладно. Суть в том, что у нас этого изменения не будет. Во всяком случае пока.

Автор:  Иван Денисов [ Среда, 09 Октябрь, 2019 21:34 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Борис Рюмшин писал(а):
Иван Денисов писал(а):
Борис Рюмшин писал(а):
Мы пока остаёмся при своём мнении по этому вопросу.

А какое тут может быть мнение, если это факт. Есть история кода.

Иван, ты отказываешь нам в праве иметь собственное мнение?

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

Автор:  Евгений Темиргалеев [ Четверг, 10 Октябрь, 2019 00:51 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Иван Денисов писал(а):
При том, что в Блэкбоксе как раз неплохо абстрагирован Files, и никто не мешает сделать копии модулей и линковать их соответственно для разных платформ 1.6 или 1.7. Вот селекторы как раз не очень хорошо использовать. Лучше бы без них обходиться.

Иван, делать копии 100 модулей -- это не вариант.

Автор:  Евгений Темиргалеев [ Четверг, 10 Октябрь, 2019 01:22 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Иван Денисов писал(а):
По истории кода не может быть мнения, так как существует фактическая история изменений, где видно, что документация не была изменена следом за измененным кодом.
Как из того, что изменение не было сделано, следует, что его должны были сделать именно так, как сделали в Центре?

Берем оригинальный код.
Код:
   PROCEDURE (f: File) NewWriter (old: Files.Writer): Files.Writer;
      VAR w: Writer;
   BEGIN   (* portable *)
      ASSERT(f.state # closed, 20); ASSERT(f.state # shared, 21);
      ...

Первое предусловие 20 прописано в оригинальной документации File.Close: "The file f and the riders operating on file f are not valid anymore after closing f, i.e., no more file or rider operations may be performed on it".

Оминки могли забыть прописать это предусловие для NewWriter аналогично: "Если файл только для чтения, то вызов NewWriter -- недопустимая операция".

Это выглядит логичнее введения Shared() и Closed(), которые, как практика Центра на примере Stores64, используются для того, чтобы генерировать тот же трап на один уровень выше, т.е. не непосредственно в реализации Files, а в клиенте:
Код:
   PROCEDURE (this: Segment) NewWriter (old: Files.Writer): Files.Writer;
      VAR segWr: SegmentWriter;
   BEGIN
      ASSERT(~this.Closed(), 20); <--- здесь
      ASSERT(~this.Shared(), 21); <--- или здесь
      IF (old # NIL) & (old IS SegmentWriter) THEN segWr := old(SegmentWriter) ELSE NEW(segWr) END;
      IF segWr.base # this THEN
         segWr.base := this;
         segWr.wr := this.container.NewWriter(NIL); <<---- а не здесь

И тут я возвращаюсь к своему исходному вопросу (viewtopic.php?p=108957#p108957). Все пользователи ББ1.7 непротиворечиво используют новые методы Shared и Closed по этой логике и перед использованием файлов ставят эти проверки в своем клиентском коде? Или их никто не ставит, рассчитывая на АВОСТ-защиту от логических ошибок непосредственно в модулях реализации файлов? Т.е. по факту доказывают избыточность Shared и Closed, поскольку других примеров применения ни у кого пока не нашлось.

Автор:  Иван Денисов [ Четверг, 10 Октябрь, 2019 03:28 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Евгений Темиргалеев писал(а):
Иван Денисов писал(а):
По истории кода не может быть мнения, так как существует фактическая история изменений, где видно, что документация не была изменена следом за измененным кодом.
Как из того, что изменение не было сделано, следует, что его должны были сделать именно так, как сделали в Центре?

Берем оригинальный код.
Код:
   PROCEDURE (f: File) NewWriter (old: Files.Writer): Files.Writer;
      VAR w: Writer;
   BEGIN   (* portable *)
      ASSERT(f.state # closed, 20); ASSERT(f.state # shared, 21);
      ...

Первое предусловие 20 прописано в оригинальной документации File.Close: "The file f and the riders operating on file f are not valid anymore after closing f, i.e., no more file or rider operations may be performed on it".

Оминки могли забыть прописать это предусловие для NewWriter аналогично: "Если файл только для чтения, то вызов NewWriter -- недопустимая операция".


Формулировка в документации может быть уточнена, если об этом разговор.

Евгений Темиргалеев писал(а):
Это выглядит логичнее введения Shared() и Closed(), которые, как практика Центра на примере Stores64, используются для того, чтобы генерировать тот же трап на один уровень выше, т.е. не непосредственно в реализации Files, а в клиенте:
Код:
   PROCEDURE (this: Segment) NewWriter (old: Files.Writer): Files.Writer;
      VAR segWr: SegmentWriter;
   BEGIN
      ASSERT(~this.Closed(), 20); <--- здесь
      ASSERT(~this.Shared(), 21); <--- или здесь
      IF (old # NIL) & (old IS SegmentWriter) THEN segWr := old(SegmentWriter) ELSE NEW(segWr) END;
      IF segWr.base # this THEN
         segWr.base := this;
         segWr.wr := this.container.NewWriter(NIL); <<---- а не здесь

И тут я возвращаюсь к своему исходному вопросу (viewtopic.php?p=108957#p108957). Все пользователи ББ1.7 непротиворечиво используют новые методы Shared и Closed по этой логике и перед использованием файлов ставят эти проверки в своем клиентском коде? Или их никто не ставит, рассчитывая на АВОСТ-защиту от логических ошибок непосредственно в модулях реализации файлов? Т.е. по факту доказывают избыточность Shared и Closed, поскольку других примеров применения ни у кого пока не нашлось.

Shared() и Closed() необходимы для возможности правильно обработать исключения. Это необходимо математически. Система должна иметь механизмы обработки всех аварийных остановок. Либо надо было выносить переменную state на абстрактный уровень, и делать её чтение/запись доступным. И требовать от реализаций правильно работать с этой переменной. Либо ввести процедуры для мониторинга состояния этой переменной внутри реализации. Второй вариант лучше первого. Более безопасный. Это и было сделано.
А то, что используется редко, это уже другой вопрос. Но эта возможность обойти NewWriter, когда его выполнение невозможно, просто необходима!

Автор:  Иван Денисов [ Четверг, 10 Октябрь, 2019 05:20 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Теорема :)

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

Автор:  Евгений Темиргалеев [ Четверг, 10 Октябрь, 2019 09:50 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Иван Денисов писал(а):
А то, что используется редко, это уже другой вопрос. Но эта возможность обойти NewWriter, когда его выполнение невозможно, просто необходима!
Вопрос стоит как раз о том, что статистически это вообще не используется. О том, что теоретические рассуждения, которыми обосновали создание несовместимости в интерфейсе, оторваны от реальности.

Автор:  Иван Денисов [ Четверг, 10 Октябрь, 2019 09:52 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Евгений Темиргалеев писал(а):
Иван Денисов писал(а):
А то, что используется редко, это уже другой вопрос. Но эта возможность обойти NewWriter, когда его выполнение невозможно, просто необходима!
Вопрос стоит как раз о том, что статистически это вообще не используется. О том, что теоретические рассуждения, которыми обосновали создание несовместимости в интерфейсе, оторваны от реальности.

Не оторваны, так как изначально обсуждение было вызвано прецедентом на производстве у Ильи. Мы ходим по кругу. Есть необходимость обходить АВОСТ. Поэтому и вы ввели NIL. А вовсе не из-за документации. Обойти ASSERT можно двумя путями. Удалить его. Или добавить в интерфейс средства проверки. От удаления отказались по принципу раннего выявления ошибки. Также исходные коды показали логику работу Оминк над этим вопросом, то это еще больше подкрепило, что удалять ASSERT не стоит. Поэтому интерфейс был расширен.

Автор:  Евгений Темиргалеев [ Четверг, 10 Октябрь, 2019 10:04 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

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

И у других нет. Я же не просто так спрашивал выше.

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

Автор:  Илья Ермаков [ Четверг, 10 Октябрь, 2019 10:12 ]
Заголовок сообщения:  Re: B01: HostFiles.NewWriter

Тут дело в том, что снять авост (привести в соответствие с документацией) - это ослабить предусловие. Это не рушит обратную совместимость!
И я практически уверен, что никто из разработчиков на ББ не полагался на авост как на часть штатного поведения в своих системах.

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

А менять интерфейс типа - это несовместимое изменение интерфейса.
И снятие каких-то признаков файла тогда уже стоило бы делать обходными путями (некая процедура Files.HandleMsg и подключаемые хуки от реализаций и т.п.).

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