OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 03 Июль, 2020 17:48

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: #036 Тупик интерфейса DevMarkers?
СообщениеДобавлено: Воскресенье, 24 Май, 2020 19:29 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 243
Коллеги,

потребовалось мне сделать маркеры ошибок, но эдакие. Взялся я уточнять тип DevMarkers.View. И вот зашел в тупик:

DevMarkers.View = POINTER TO ABSTRACT RECORD
mode-: INTEGER
END;

MyMarkers.View = POINTER TO RECORD (DevMarkers.View) ... END;

PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); (* тупик тут *)
BEGIN
v.mode := source(View).mode (* так нельзя, ессно *)
v.CopyFromSimpleView^(source)
(* так тоже нельзя, потому что CopyFromSimpleView отмечена "-" - т.е. вызывать нельзя *)
END CopyFromSimpleView;

Есть, конечно, DevMarkers.View.InitErr, .SetMode и т.п., но они не подходят для создания дубликата, поскольку у них есть побочные эффекты.

Вопрос: как я понимаю, это упущение авторов интерфейса DevMarkers? Надо было им предусмотреть CopyFromSimpleView2-, как, например, в Controls.Control?

И еще вопрос: как-то же называется этот паттерн, и где-то же он описан; подскажите, пож, как и где?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Тупик интерфейса DevMarkers?
СообщениеДобавлено: Воскресенье, 24 Май, 2020 19:39 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 243
И еще про DevMarkers: они предусмотрели возможность расширениям иметь не два, а больше режимов (которые определяются полем .mode); На эту возможность указывает код в разных местах и именованные константы. Но в процедуре .SetMode эту возможность уничтожили:

Код:
PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
BEGIN
   ASSERT((firstMode <= mode) & (mode <= lastMode), 20);
...


Полагаю, это они ошиблись. Нужно либо выкинуть второй конъюнкт, либо, если нужно все-таки проверять верхнюю границу, сделать как-то так:
Код:
PROCEDURE (v: View) LastMode (): INTEGER, NEW, ABSTRACT;
PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE;
BEGIN
   ASSERT((firstMode <= mode) & (mode <= v.LastMode()), 20);
...


Предлагаю либо выкинуть проверку, либо добавить .LastMode.


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

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


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

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


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

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