powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен шаблон
15 сообщений из 15, страница 1 из 1
Нужен шаблон
    #34613619
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужен шаблон для реализации следующей задачи:
Есть железяка, для нас - черный ящик, которая генерирует раз в сутки 3 файла, файлы разбиты на блоки равной длины, структура блока следующая:

Код: plaintext
1.
2.
3.
4.
смещение      длина поля         описание
     0               6                  Длина строки внутри блока
     6               8                  Служебная структура (содержит тип блока и еще одну длину)
     14            ...                Строка

Для строк в первых двух файлах определен заголовок (для каждого файла свой формат и длина заголовка). Из заголовка можно узнать название формата (определяет структуру и длину) следующей за заголовком части строки. За этой частью идет "пустой байт" и еще определенная структура.

С третьим файлом немного сложнее, там в начале строки есть структура типа заголовка, из которой можно узнать название формата следующей за заголовком части строки. За этой частью идет структура неизвестно какого формата, т.е. там может быть все что угодно. За ней "пустой байт" и еще определенная структура.

Т.е. как Вы понимаете структура строк в блоках не одинакова, даже в пределах одного файла, т.е. в одном блоке одна структура, в другом другая, в третьем как в первом и т.д.

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

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

Задача: нужен шаблон проектирования для работы с этими файлами
...
Рейтинг: 0 / 0
Нужен шаблон
    #34613935
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. генерить классы - откровенный бред
2. State Machine
3. сколько$ ?
...
Рейтинг: 0 / 0
Нужен шаблон
    #34613985
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
expp1. генерить классы - откровенный бред
2. State Machine
3. сколько$ ?

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

2. State Machine - это вопрос, комментарий или что? что-то я не въехал

3. несколько десятков
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614080
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фабричный метод. Классика жанра - считывание изображений.
википедия
Главное выделить общий контракт по обработке сообщений. Например, я его использую для формирования кода посылки сообщений. Есть некая сущность в виде списка сообщений и мне нужно создать скрипт, который эти сообщения шлет. Соответственно контракт базового класса сообщений есть TMessage.getSendCode() (пишу на Дельфи). Есть потомки TBaseMessage, TTimerMessage и т.д. Каждое сообщение имеет свой формат (первые пять полей как правило совпадают). Есть TMessageCreator, который принимает на вход поток данных (аналог DataInput в Java) и разбирается, какое сообщение нужно создать. Соотвественно, создает сообщение нужно класса и возвращает его результатом. В итоге, код обработки выглядит примерно так:

Чтение:
Код: plaintext
1.
2.
3.
4.
   while  ( not  EoF(input))  do 
   begin 
    trace.add(TMessageCreator.createMessage(input));
   end ;

Запись:
Код: plaintext
1.
2.
3.
4.
   while  (trace.iterator.hasNext())  do 
   begin 
    writeln( out ,trace.iterator.getMessage().getSendCode());
   end ;
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614217
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно задачу сформулировать ещё разок и лаконичнее (может с примерами)?
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614256
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BesZPпопросить черный ящик сгенерировать мне java-классы очень понравилось :)
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614281
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zalexaka BesZPпопросить черный ящик сгенерировать мне java-классы очень понравилось :)
Та да, сам ору :) аааааааааааааааааааааааааааааааа
А по делу написать?
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614286
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BesZPА по делу написать? Leonidv вам уже написал или вам это не подходит?
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614338
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мэн, понятно с трудом чего тебе надо от жабы

пока понятно:

1. тебе нужна конфигуряемая читалка (вместо генерения классов), т.е. она сначала конфигуряется читая файло формата, потом читает файлы этого формата
2. подобные читалки (builder, factory) обычно делают из нескольких под-читалок (на каждое поле), которые активизируются главное читалкой в нужной последовательности (state machine).

patterns: builder, factory, state machine
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614439
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exppмэн, понятно с трудом чего тебе надо от жабы

пока понятно:

1. тебе нужна конфигуряемая читалка (вместо генерения классов), т.е. она сначала конфигуряется читая файло формата, потом читает файлы этого формата
2. подобные читалки (builder, factory) обычно делают из нескольких под-читалок (на каждое поле), которые активизируются главное читалкой в нужной последовательности (state machine).

patterns: builder, factory, state machine

Не, читать файл формата я не собираюсь, т.к.
1. он для меня недоступен;
2. он сам записан в хрен знает каком формате и чтобы его прочитать, надо еще чегото прочитать :) - опа замутили )

Мне нужен такой шаблон, чтобы я без проблем мог использовать сгенерированные классы для распарсивания строк. Т.е. если бы эти классы генерировались всего один раз, то и обычная фэктори бы подошла, а тут получается сегодня я работаю с одним набором сгенерированных классов, а завтра пропатчилось ПО в черном ящике, смещения и длины полей стали другими - надо снова генерить очередной набор классов. Нужен шаблон который бы без особых затруднений позволял мне подключать новый набор сгенерированных классов. Пока я себе это вижу как фэктори->subфэктори.
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614478
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
путь тебе твой ящщег выдаёт удобоваримый конфиг, генерация/загрузка классов тут не нужны.
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614495
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключевой момент - что вы с ними (сообщениями, данными) дальше будете делать. Пока этого не решите, будут у вас проблемы.
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614525
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exppпуть тебе твой ящщег выдаёт удобоваримый конфиг, генерация/загрузка классов тут не нужны.

не может он выдать такой конфиг, т.к. разработчики (hp) не заложили такой возможности :(
...
Рейтинг: 0 / 0
Нужен шаблон
    #34614540
BesZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeonidvКлючевой момент - что вы с ними (сообщениями, данными) дальше будете делать. Пока этого не решите, будут у вас проблемы.

все распарсенные данные будут заливаться в БД, что еще влечет за собой кучу ручной работы :(
...
Рейтинг: 0 / 0
Нужен шаблон
    #34615225
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда все очень просто. Базовый класс должен содержать только один метод - что типа writeToDB или getSQL(). Можно легко сделать так, как я описал. Если не понимаете что я написал - читайте книги по паттернам.
Если сложность в динамическом подключение файлов, можно написать собственный загрузчик классов. Тогда для каждого типа сообщений написать свой построитель, который определяет подходит ли он или нет. В построителе (в моем случае, TMessageCreator) нужно регистрировать построители конкретных классов.
То есть код считывания очередного сообщения в TMessageCreator будет чем-то вроде.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
TMessageBuilder =  class 
   public 
    // Определяет, нужно ли использовать конкретную реализацию 
    // построителя. Курсор потока после использования функции не смещается. 
    function  useMe(input : TInputStream) : boolean;
   
    // Строит новое сообщение конкретного типа. Курсор потока после использования 
    // функции указывает на начало следующего сообщения. 
    function  build(input : TInputStream) : TMessageTypeA;
 end ;


 for  i :=  0   to  High(FMessageBuilders)  do 
 begin 
   if  (FMessageBuilders[i].useMe(input))  then 
   begin 
    Result := FMessageBuilders[i].build(input);
    exit;
   end ;
 end ;
Насколько я понимаю, данный шаблон проектирования широко применяется в Java при работе с мультимедиа информацией. Например, в пакете ImageIO.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен шаблон
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]