OberonCore https://forum.oberoncore.ru/ |
|
Чтение длинных строк из файла https://forum.oberoncore.ru/viewtopic.php?f=23&t=548 |
Страница 1 из 1 |
Автор: | Иван Кузьмицкий [ Среда, 04 Июль, 2007 14:06 ] |
Заголовок сообщения: | Чтение длинных строк из файла |
Встала надобность читать SQL-запросы из ODC-файла, разделённые маркером (точка с запятой). Запрос может быть длинным, длиной больше 256 символов. Соответственно, стандартный TextMappers.Scanner не подходит. Задача простейшая, но хочется её решить "методологически правильно", по-блэкбоксовски. Унаследовать TextMappers.Scanner нельзя, как и перекрыть нужные методы. Копипастить TextMappers и править не хочется ![]() А правка-то нужна минимальная - заменить "скан в строку" на "скан в динамический массив". |
Автор: | Евгений Темиргалеев [ Среда, 04 Июль, 2007 14:47 ] |
Заголовок сообщения: | |
Не надо забывать ![]() - запомнили позицию pos - дочитали до ; или до конца - создали массив длины r.Pos() - pos + 1 - зачитали в него запрос ... |
Автор: | Иван Кузьмицкий [ Среда, 04 Июль, 2007 15:06 ] |
Заголовок сообщения: | |
Евгений Темиргалеев писал(а): Не надо забывать
![]() - запомнили позицию pos - дочитали до ; или до конца - создали массив длины r.Pos() - pos + 1 - зачитали в него запрос ... Спасиб, конечно, за алгоритм. Вопрос же стоит не в том, как работать с отдельными символами. А именно в том, как правильно использовать конструкции BlackBox. Вот хочу я, чтобы у меня был собственный Scanner форматированного текста, на основе стандартного с минимальными изменениями. Но не хочу копипастить стандартный сканер. |
Автор: | Евгений Темиргалеев [ Среда, 04 Июль, 2007 15:31 ] |
Заголовок сообщения: | |
Учитывая, как сделан модуль TextMappers, Ваше желание не выполнимо. Выхода только два: либо копировать и править, либо править прямо в TextMappers. |
Автор: | Иван Кузьмицкий [ Среда, 04 Июль, 2007 17:24 ] |
Заголовок сообщения: | |
Евгений Темиргалеев писал(а): Учитывая, как сделан модуль TextMappers, Ваше желание не выполнимо. Выхода только два: либо копировать и править, либо править прямо в TextMappers.
Другими словами, фреймворк BlackBox для обработки текстов реализует шаблон проектирования Carrier-Rider-Mapper, но конкретная реализация Mapper, для чтения текста, в модуле TextMappers, не соответствует моим запросам. Поэтому нужно реализовать Mapper самостоятельно. Исходный текст TextMappers сильно облегчает задачу, да. |
Автор: | Иван Кузьмицкий [ Среда, 04 Июль, 2007 17:41 ] |
Заголовок сообщения: | |
Даже позволю себе процитировать документацию: Цитата: Если носители и курьеры строго придерживаются хорошо спроектированного курьерского интерфейса (типа узкое горло), можно добавлять новых преобразователей в любое время и использовать их с тем же носителем.
Основная работа по обработке текстов уже реализована в фреймворке, остаётся лишь написать свой преобразователь, для конкретного случая. |
Автор: | Илья Ермаков [ Среда, 04 Июль, 2007 20:59 ] |
Заголовок сообщения: | |
Можно попробовать агрегировать стандартный Mapper, перекрывая его в нужной функциональности и делегируя к нему остальную. |
Автор: | Илья Ермаков [ Среда, 04 Июль, 2007 21:02 ] |
Заголовок сообщения: | |
А можно сделать спец. процедуру ScanLongString, которая параметром получает стандартный маппер и оперирует с ним. Как в компиляторе и др. подобных местах - пишется внешняя к Mapper процедура Scan, которая возвращает дополнительные коды лексем. Вроде так. Если не ошибаюсь... Если ошибаюсь - пардон, уже засыпаю носом в окошко форум ![]() |
Автор: | Евгений Темиргалеев [ Четверг, 05 Июль, 2007 08:14 ] |
Заголовок сообщения: | |
В компиляторе свой сканер. |
Автор: | Иван Кузьмицкий [ Четверг, 05 Июль, 2007 12:36 ] |
Заголовок сообщения: | |
Так, свой вариант сканера я реализовал. Теперь хочу его использовать. Насколько я понимаю, стандартная схема такова: определить TextModels.Model, затем подключить мой сканнер к этой модели с помощью ConnectTo. Ну а дальше всё ясно. Пока в голове не укладывается такой нюанс, как получение модели (в схеме Carrier-Rider-Mapper это есть Carrier. В схеме Model-View-Controller это есть Model, которая, кстати, привязана к View). То есть, чтобы получить модель через view.ThisModel, мне сперва надо заиметь её отображение (view)? По крайней мере, в исходниках Ящика так и делается. Мне кажется, что это не совсем логично. |
Автор: | Евгений Темиргалеев [ Четверг, 05 Июль, 2007 13:29 ] |
Заголовок сообщения: | |
Иван А. Кузьмицкий писал(а): ... Мне кажется, что это не совсем логично.
Назначение модели - хранить некоторые данные. Модель не имеет никакого отношения к отображению данных, пользовательскому интерфейсу и взаимодействию с пользователем. Назначение View - показать (пользователю) содержимое модели. Как Вы собираетесь состыковать пользователя и модель без View? Пользователь видит и работает с Model через View. Мы получаем окно-View с которым работает пользователь, получаем модель, которую пользователь видит через это окно и ... работаем с этой же моделью. |
Автор: | Александр Ильин [ Четверг, 05 Июль, 2007 14:03 ] |
Заголовок сообщения: | |
Иван А. Кузьмицкий писал(а): Пока в голове не укладывается такой нюанс, как получение модели.
То есть, чтобы получить модель через view.ThisModel, мне сперва надо заиметь её отображение (view)? view.ThisModel() - это получение модели, отображаемой в view. То есть, это уже существующая модель. Чтобы создать новую модель, нужно вызвать TextModels.dir.New() К схемам C-R-M и M-V-C вам надо ещё добавить деление на абстрактный тип - конкретный тип - директория (Directory, она же "фабрика классов", "class factory"). Тогда ваше представление об архитектурных схемах в BlackBox будет почти полным. (Ещё есть "хуки" - hooks и, возможно, я что-то забыл.) Надеюсь, я правильно понял ваше затруднение. |
Автор: | Иван Кузьмицкий [ Четверг, 05 Июль, 2007 14:20 ] |
Заголовок сообщения: | |
Евгений Темиргалеев писал(а): ...Как Вы собираетесь состыковать пользователя и модель без View? Ну, как раз и размышляю над этим вопросом. Вот есть файл с данными. Это модель. Нужно эти данные прочесть и как-то использовать, причём без отображения для пользователя (хотя кого считать пользователем, ещё вопрос. Алгоритм чтения строк - пользователь?). Но загрузка файла делается средствами отображения (Views.Old()). Шаблон C-R-M, к примеру, имеет райдера. Райдер, требует для себя модель. А модель без отображения загрузиться не может. Такая вот архитектурная связка выходит. Александр Ильин писал(а): view.ThisModel() - это получение модели, отображаемой в view. То есть, это уже существующая модель.
Чтобы создать новую модель, нужно вызвать TextModels.dir.New() Да, новую модель создать можно. А файл-то уже существует, мне нужно прочесть из него данные. Значит, свежесозданную фабрикой модель нужно сперва как-то соединить с данными из файла. А кроме как через Views.Old это никак не сделать. Это и заставляет призадуматься. |
Автор: | Иван Кузьмицкий [ Четверг, 05 Июль, 2007 14:25 ] |
Заголовок сообщения: | |
Евгений Темиргалеев писал(а): Назначение View - показать (пользователю) содержимое модели.
Возможно, эта Ваша формулировка и есть ответ на мой вопрос. Содержимое модели без отображения недоступно извне. |
Автор: | Илья Ермаков [ Четверг, 05 Июль, 2007 14:54 ] |
Заголовок сообщения: | |
Понимаете, какая штука. Модель может храниться и сама по себе, без отображения - она является Store. Т.е. при сохранении каких-то своих объектов Вы можете вызывать WriteStore для модели напрямую, и никакого отображения не будет... Но когда Вы загружаете документ ODC - то он является отображением (поскольку на то он и документ, чтобы отображаться пользователю). В кго корне лежит Documents.View, хранящий информацию о размере страницы и проч. (видите, потому и отображение - что глобальные свойства документа являются "отображательскими"). А уже Documents.Model содержит в себе конкретное отображение, например, текстовое или форменное (оно и возвращается Views.Old, а с Document Вы при обычном раскладе отношений не имеете). |
Автор: | Иван Кузьмицкий [ Четверг, 05 Июль, 2007 15:06 ] |
Заголовок сообщения: | |
Илья Ермаков писал(а): ...Но когда Вы загружаете документ ODC - то он является отображением (поскольку на то он и документ, чтобы отображаться пользователю)...
И впрямь... Я в начале ветки написал, что использую ODC-файл, хотя это неверно! Я использую документ, а это уже совсем другая абстракция. Да, теперь всё встало на свои места. Коллеги, спасибо большое за отклики! |
Автор: | Trurl [ Четверг, 05 Июль, 2007 15:37 ] |
Заголовок сообщения: | |
Иван А. Кузьмицкий писал(а): Содержимое модели без отображения недоступно извне.
Почему это недоступно? Модель предоставляет интерфейс для управления своим содержимым. |
Автор: | Info21 [ Пятница, 06 Июль, 2007 06:45 ] |
Заголовок сообщения: | |
Иван А. Кузьмицкий писал(а): .. Вот есть файл с данными. Это модель. Нужно эти данные прочесть и как-то использовать, причём без отображения для пользователя (хотя кого считать пользователем, ещё вопрос. Алгоритм чтения строк - пользователь?). Но загрузка файла делается средствами отображения (Views.Old()).
... Значит, свежесозданную фабрикой модель нужно сперва как-то соединить с данными из файла. А кроме как через Views.Old это никак не сделать. Это и заставляет призадуматься. То, что у Вас хранится в файле, это, скорее всего, должно быть Stores.Store (если не просто данные). Тогда нужен просто Stores...ReadStore |
Автор: | Иван Кузьмицкий [ Воскресенье, 08 Июль, 2007 21:36 ] |
Заголовок сообщения: | |
Trurl писал(а): Иван А. Кузьмицкий писал(а): Содержимое модели без отображения недоступно извне. Почему это недоступно? Модель предоставляет интерфейс для управления своим содержимым. info21 писал(а): То, что у Вас хранится в файле, это, скорее всего, должно быть Stores.Store (если не просто данные).
Тогда нужен просто Stores...ReadStore Да это у меня когнитивный диссонанс случился. Назвал составной документ, обладающий отображением, как обычный файл с данными ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |