OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 16:53 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
В случае если при чтении сторы обнаруживается нарушение инварианта (приведённый в документации пример про считываение alien store не в счёт), как правильно поступать?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 17:26 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2934
Откуда: г. Ярославль
Я воспринимаю alien store как неработоспособную сущность. Мне кажется, нарушение инварианта про то же самое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 17:54 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Но Вы же не будете ставить и то, и другое. Нужно выбирать. Вы как поступите?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 17:58 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2934
Откуда: г. Ярославль
Я бы в alien преобразовал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 20:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8216
Откуда: Троицк, Москва
Если тип известен, то ASSERT однозначно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 20:22 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Info21 писал(а):
Если тип известен, то ASSERT однозначно.
Т.е. Вы за ASSERT при любом нарушении, если данные читаются "нормально"?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Четверг, 03 Март, 2011 22:30 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8216
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Т.е. Вы за ASSERT при любом нарушении, если данные читаются "нормально"?
Не знаю, правильно ли я понимаю эту фразу, но если правильно, то да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 10:36 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
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
Так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 11:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8216
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Так?
Нет, это не то, что я себе представил.
В данном случае при чтении образовался Alien -- ну, и надо идти от задачи, что с ним делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 12:38 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 13:27 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 14:47 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Хочу понять, как правильно пользоваться каркасом, в данном случае 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.
Что делать вообще --- либо я проглядел, либо изложено слишком сухо и не догадываюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 15:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8216
Откуда: Троицк, Москва
Где-то у них говорится, что Alien -- это когда отсутствует модуль, реализующий считываемый конкретный тип. Там же в самом начале записан Модуль.КонкретныйТип для сторы. ББ пытается создать такую стору, а потом вызвать ее Internalize.
Alien -- если он не может создать пустую стору.
Тогда он создаёт это Alien и запихивает туда данные as is.
Если у кого-то потом это модуль есть, то он может этот Alien нормально увидеть.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Пятница, 04 Март, 2011 15:08 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Info21 писал(а):
Решение by default -- ASSERT однозначно.
C этим спору нет. Но хочется..гм.. более подробной методики.

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

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

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Stores: TurnIntoAlien или ASSERT?
СообщениеДобавлено: Воскресенье, 06 Март, 2011 13:31 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Без 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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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