OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 04:02

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Чтение длинных строк из файла
СообщениеДобавлено: Среда, 04 Июль, 2007 14:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Встала надобность читать SQL-запросы из ODC-файла, разделённые маркером (точка с запятой). Запрос может быть длинным, длиной больше 256 символов.
Соответственно, стандартный TextMappers.Scanner не подходит. Задача простейшая, но хочется её решить "методологически правильно", по-блэкбоксовски.
Унаследовать TextMappers.Scanner нельзя, как и перекрыть нужные методы. Копипастить TextMappers и править не хочется :)
А правка-то нужна минимальная - заменить "скан в строку" на "скан в динамический массив".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 14:47 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Не надо забывать :) , что кроме TextMappers.Scanner есть TextModels.Reader, который лучше подходит для работы с отдельными символами. ИМХО, сделать можно так:
- запомнили позицию pos
- дочитали до ; или до конца
- создали массив длины r.Pos() - pos + 1
- зачитали в него запрос
...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 15:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
Не надо забывать :) , что кроме TextMappers.Scanner есть TextModels.Reader, который лучше подходит для работы с отдельными символами. ИМХО, сделать можно так:
- запомнили позицию pos
- дочитали до ; или до конца
- создали массив длины r.Pos() - pos + 1
- зачитали в него запрос
...


Спасиб, конечно, за алгоритм. Вопрос же стоит не в том, как работать с отдельными символами. А именно в том, как правильно использовать конструкции BlackBox. Вот хочу я, чтобы у меня был собственный Scanner форматированного текста, на основе стандартного с минимальными изменениями. Но не хочу копипастить стандартный сканер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 15:31 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Учитывая, как сделан модуль TextMappers, Ваше желание не выполнимо. Выхода только два: либо копировать и править, либо править прямо в TextMappers.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 17:24 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
Учитывая, как сделан модуль TextMappers, Ваше желание не выполнимо. Выхода только два: либо копировать и править, либо править прямо в TextMappers.


Другими словами, фреймворк BlackBox для обработки текстов реализует шаблон проектирования Carrier-Rider-Mapper, но конкретная реализация Mapper, для чтения текста, в модуле TextMappers, не соответствует моим запросам. Поэтому нужно реализовать Mapper самостоятельно. Исходный текст TextMappers сильно облегчает задачу, да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 17:41 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Даже позволю себе процитировать документацию:
Цитата:
Если носители и курьеры строго придерживаются хорошо спроектированного курьерского интерфейса (типа узкое горло), можно добавлять новых преобразователей в любое время и использовать их с тем же носителем.

Основная работа по обработке текстов уже реализована в фреймворке, остаётся лишь написать свой преобразователь, для конкретного случая.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 20:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Можно попробовать агрегировать стандартный Mapper, перекрывая его в нужной функциональности и делегируя к нему остальную.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 04 Июль, 2007 21:02 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 08:14 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 12:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Так, свой вариант сканера я реализовал. Теперь хочу его использовать.
Насколько я понимаю, стандартная схема такова: определить TextModels.Model, затем подключить мой сканнер к этой модели с помощью ConnectTo. Ну а дальше всё ясно.
Пока в голове не укладывается такой нюанс, как получение модели (в схеме Carrier-Rider-Mapper это есть Carrier. В схеме Model-View-Controller это есть Model, которая, кстати, привязана к View).
То есть, чтобы получить модель через view.ThisModel, мне сперва надо заиметь её отображение (view)? По крайней мере, в исходниках Ящика так и делается. Мне кажется, что это не совсем логично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 13:29 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Иван А. Кузьмицкий писал(а):
... Мне кажется, что это не совсем логично.

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

Назначение View - показать (пользователю) содержимое модели.

Как Вы собираетесь состыковать пользователя и модель без View?

Пользователь видит и работает с Model через View. Мы получаем окно-View с которым работает пользователь, получаем модель, которую пользователь видит через это окно и ... работаем с этой же моделью.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 14:03 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Иван А. Кузьмицкий писал(а):
Пока в голове не укладывается такой нюанс, как получение модели.
То есть, чтобы получить модель через view.ThisModel, мне сперва надо заиметь её отображение (view)?

view.ThisModel() - это получение модели, отображаемой в view. То есть, это уже существующая модель.
Чтобы создать новую модель, нужно вызвать TextModels.dir.New()
К схемам C-R-M и M-V-C вам надо ещё добавить деление на абстрактный тип - конкретный тип - директория (Directory, она же "фабрика классов", "class factory"). Тогда ваше представление об архитектурных схемах в BlackBox будет почти полным. (Ещё есть "хуки" - hooks и, возможно, я что-то забыл.)
Надеюсь, я правильно понял ваше затруднение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 14:20 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
...Как Вы собираетесь состыковать пользователя и модель без View?

Ну, как раз и размышляю над этим вопросом. Вот есть файл с данными. Это модель. Нужно эти данные прочесть и как-то использовать, причём без отображения для пользователя (хотя кого считать пользователем, ещё вопрос. Алгоритм чтения строк - пользователь?). Но загрузка файла делается средствами отображения (Views.Old()).

Шаблон C-R-M, к примеру, имеет райдера. Райдер, требует для себя модель. А модель без отображения загрузиться не может. Такая вот архитектурная связка выходит.

Александр Ильин писал(а):
view.ThisModel() - это получение модели, отображаемой в view. То есть, это уже существующая модель.
Чтобы создать новую модель, нужно вызвать TextModels.dir.New()

Да, новую модель создать можно. А файл-то уже существует, мне нужно прочесть из него данные. Значит, свежесозданную фабрикой модель нужно сперва как-то соединить с данными из файла. А кроме как через Views.Old это никак не сделать. Это и заставляет призадуматься.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 14:25 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
Назначение View - показать (пользователю) содержимое модели.


Возможно, эта Ваша формулировка и есть ответ на мой вопрос. Содержимое модели без отображения недоступно извне.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 14:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Понимаете, какая штука. Модель может храниться и сама по себе, без отображения - она является Store. Т.е. при сохранении каких-то своих объектов Вы можете вызывать WriteStore для модели напрямую, и никакого отображения не будет...
Но когда Вы загружаете документ ODC - то он является отображением (поскольку на то он и документ, чтобы отображаться пользователю). В кго корне лежит Documents.View, хранящий информацию о размере страницы и проч. (видите, потому и отображение - что глобальные свойства документа являются "отображательскими"). А уже Documents.Model содержит в себе конкретное отображение, например, текстовое или форменное (оно и возвращается Views.Old, а с Document Вы при обычном раскладе отношений не имеете).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 15:06 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Илья Ермаков писал(а):
...Но когда Вы загружаете документ ODC - то он является отображением (поскольку на то он и документ, чтобы отображаться пользователю)...


И впрямь... Я в начале ветки написал, что использую ODC-файл, хотя это неверно! Я использую документ, а это уже совсем другая абстракция. Да, теперь всё встало на свои места. Коллеги, спасибо большое за отклики!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Июль, 2007 15:37 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
Иван А. Кузьмицкий писал(а):
Содержимое модели без отображения недоступно извне.

Почему это недоступно? Модель предоставляет интерфейс для управления своим содержимым.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 06 Июль, 2007 06:45 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван А. Кузьмицкий писал(а):
.. Вот есть файл с данными. Это модель. Нужно эти данные прочесть и как-то использовать, причём без отображения для пользователя (хотя кого считать пользователем, ещё вопрос. Алгоритм чтения строк - пользователь?). Но загрузка файла делается средствами отображения (Views.Old()).
... Значит, свежесозданную фабрикой модель нужно сперва как-то соединить с данными из файла. А кроме как через Views.Old это никак не сделать. Это и заставляет призадуматься.


То, что у Вас хранится в файле, это, скорее всего, должно быть Stores.Store (если не просто данные).
Тогда нужен просто Stores...ReadStore


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 08 Июль, 2007 21:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Trurl писал(а):
Иван А. Кузьмицкий писал(а):
Содержимое модели без отображения недоступно извне.

Почему это недоступно? Модель предоставляет интерфейс для управления своим содержимым.


info21 писал(а):
То, что у Вас хранится в файле, это, скорее всего, должно быть Stores.Store (если не просто данные).
Тогда нужен просто Stores...ReadStore


Да это у меня когнитивный диссонанс случился. Назвал составной документ, обладающий отображением, как обычный файл с данными :)


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

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


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

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


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

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