OberonCore
https://forum.oberoncore.ru/

Stores: TurnIntoAlien или ASSERT?
https://forum.oberoncore.ru/viewtopic.php?f=23&t=3302
Страница 1 из 1

Автор:  Евгений Темиргалеев [ Четверг, 03 Март, 2011 16:53 ]
Заголовок сообщения:  Stores: TurnIntoAlien или ASSERT?

В случае если при чтении сторы обнаруживается нарушение инварианта (приведённый в документации пример про считываение alien store не в счёт), как правильно поступать?

Ставить ASSERTы или переводить стору в alien?

Автор:  Иван Кузьмицкий [ Четверг, 03 Март, 2011 17:26 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Я воспринимаю alien store как неработоспособную сущность. Мне кажется, нарушение инварианта про то же самое.

Автор:  Евгений Темиргалеев [ Четверг, 03 Март, 2011 17:54 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Но Вы же не будете ставить и то, и другое. Нужно выбирать. Вы как поступите?

Автор:  Иван Кузьмицкий [ Четверг, 03 Март, 2011 17:58 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Я бы в alien преобразовал.

Автор:  Info21 [ Четверг, 03 Март, 2011 20:17 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Если тип известен, то ASSERT однозначно.

Автор:  Евгений Темиргалеев [ Четверг, 03 Март, 2011 20:22 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Info21 писал(а):
Если тип известен, то ASSERT однозначно.
Т.е. Вы за ASSERT при любом нарушении, если данные читаются "нормально"?

Типа
Код:
rd.ReadInt(n); ASSERT(n >= 0, 100)

Автор:  Info21 [ Четверг, 03 Март, 2011 22:30 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Евгений Темиргалеев писал(а):
Т.е. Вы за ASSERT при любом нарушении, если данные читаются "нормально"?
Не знаю, правильно ли я понимаю эту фразу, но если правильно, то да.

Автор:  Евгений Темиргалеев [ Пятница, 04 Март, 2011 10:36 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Info21 писал(а):
Евгений Темиргалеев писал(а):
Т.е. Вы за ASSERT при любом нарушении, если данные читаются "нормально"?
Не знаю, правильно ли я понимаю эту фразу, но если правильно, то да.
Уточню примером:
Код:
               rd.ReadString(e.title); ASSERT(ValidTitle(e.title), 101);
               rd.ReadStore(text);
               ASSERT((text # NIL) & (
                  (text IS TextModels.Model) OR (text IS Stores.Alien) ), 102);
               IF text IS TextModels.Model THEN
                  e.text := text(TextModels.Model)
                  (* Stores.Join(e, e.text) *)
               ELSE
                  rd.TurnIntoAlien(Stores.alienComponent)
               END
Так?

Автор:  Info21 [ Пятница, 04 Март, 2011 11:47 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Евгений Темиргалеев писал(а):
Так?
Нет, это не то, что я себе представил.
В данном случае при чтении образовался Alien -- ну, и надо идти от задачи, что с ним делать.

Автор:  Евгений Темиргалеев [ Пятница, 04 Март, 2011 12:38 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Уточняю (по примеру) исходный вопрос: нарушение инварианта при чтении (не считая появляения Stores.Alien), идеологически правильно обработать:
- ASSERT-м, как в примере выше
- переводом сторы в Alien: rd.TurnIntoAlien(мойКодПричины_НарушенИнвариантХХХ)
?

Автор:  Info21 [ Пятница, 04 Март, 2011 13:27 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Евгений Темиргалеев писал(а):
Уточняю (по примеру) исходный вопрос: нарушение инварианта при чтении (не считая появляения Stores.Alien), идеологически правильно обработать:
- ASSERT-м, как в примере выше
- переводом сторы в Alien: rd.TurnIntoAlien(мойКодПричины_НарушенИнвариантХХХ)
?
Не понимаю смысл примера, ни, соответственно, вопроса.

Растолкуйте уж словами.

Автор:  Евгений Темиргалеев [ Пятница, 04 Март, 2011 14:47 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Хочу понять, как правильно пользоваться каркасом, в данном случае Stores.

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

Трэповать или переводить стору в Alien с указанием причины?

В документации указаны два частных случая:
Цитата:
CONST alienVersion
This value is assigned to a Reader's cause field if Reader.ReadVersion read a version outside of the specified range.

CONST alienComponent
This value can be used as cause parameter to Reader.TurnIntoAlien to indicate that the store itself could be read, but that some store contained in it is an alien. As an example, a view may turn itself into an alien if its model is an alien.
Что делать вообще --- либо я проглядел, либо изложено слишком сухо и не догадываюсь.

Автор:  Info21 [ Пятница, 04 Март, 2011 15:06 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Где-то у них говорится, что Alien -- это когда отсутствует модуль, реализующий считываемый конкретный тип. Там же в самом начале записан Модуль.КонкретныйТип для сторы. ББ пытается создать такую стору, а потом вызвать ее Internalize.
Alien -- если он не может создать пустую стору.
Тогда он создаёт это Alien и запихивает туда данные as is.
Если у кого-то потом это модуль есть, то он может этот Alien нормально увидеть.

Ваша ситуация -- это ошибка на втором шаге, на считывании данных (как я сначала и предположил).
В этом случае должен решить разработчик, что ему делать, смотря по задаче.
Решение by default -- ASSERT однозначно.

Автор:  Евгений Темиргалеев [ Пятница, 04 Март, 2011 15:08 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Info21 писал(а):
Решение by default -- ASSERT однозначно.
C этим спору нет. Но хочется..гм.. более подробной методики.

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

Реализуется это как rd.TurnIntoAlien(причина), желательно с соответствующим кодом причины, для диагностики проблемы (разработчиком).

2) Если говорить про хранимые данные, подвергаемые только автоматической обработке, то тут мне пока не ясно... Есть ли здесь доводы за TurnIntoAlien или лучше огород не городить, а сразу, по факту, трэповать..?


P.S. Всем спасибо за подсказки. Для моего конкретного случая подходит (1).

Автор:  Евгений Темиргалеев [ Воскресенье, 06 Март, 2011 13:31 ]
Заголовок сообщения:  Re: Stores: TurnIntoAlien или ASSERT?

Без ASSERT-а для отладки в итоге не обошлось...
Код:
   PROCEDURE TurnIntoAlien (VAR rd: Stores.Reader; cause: INTEGER);
   BEGIN
      HALT(100);
      rd.TurnIntoAlien(cause)
   END TurnIntoAlien;
Выявился стандартный косяк копипаста :)
Код:
rd.ReadString(e.title); IF ValidTitle(e.title) THEN TurnIntoAlien(rd, 101) END

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