Список форумов forum.alsor.net forum.alsor.net
Форум небольшого круга друзей
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Задачка по разбору сообщений

 
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум
Предыдущая тема :: Следующая тема  
Автор Сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Чт Мар 19, 2009 6:34 pm    Заголовок сообщения: Задачка по разбору сообщений Ответить с цитатой

Я смотрю тут собрались светлые головы в ООП Smile Так что я хочу эти головы немного поиспользовать.

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

Собственно интересующий меня момент - "зная фотмат сообщения вытащить полезную информацию".

Т.е. на входе у нас есть некий буфер байтов:
Код:

byte[] buffer;

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

Для простоты предположим что сообщения текстовые, а не бинарные.
Пример (вместо '_' могут быть пробелы - не суть):
Код:

A0001S000250IBM__0000502500

как это сообщение должно трактоваться:
смотрим первый байт. в нем значение 'A' - это сообщение добавления ордера на продажу. Тип сообщения нам говорит о его структуре. В данном случа мы знаем что оно содержит следующие поля:
Код:

Тип - 1 байт (всегда символ 'A')
Номер ордера - 4 байта (число)
Сторона - 1 байт (S продажа B покупка)
Количество - 6 байт (число)
Наименование - 5 байт (строка, выравненная по левому краю, добитая справа символами '_')
Цена - 10 байт (число с фиксированной точкой, предполагается что первые 6 цифр - целая часть, последие 4 цифры - дробная)

Т.е. это сообщение содержит информацию об ордере с номером 1 на продажу 250 акций IBM по цене 50.25.

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


Как это реализовано сейчас, и что мне нравится и не нравится:
    все форматы сообщений описаны в виде некой метаинформации, к примеру XML документ (нравится)

    на основе метаинформации генерится код классов - по одному классу на каждый тип сообщения. Объекты таких классов способны принимать буфер байт после чего у них запрашиваются методы типа getPrice(). По сути такие объекты просто содержат внутри информацию о смещениях конкретных полей в буфере. (само использование генерации кода мне нравится, но то что генерится в итоге - вопрос для обсуждения, см. следующий пункт)

    в коде всегда присутствует некий switch-case который взяв первый байт бежит по его значениям и на основе этого дергает поля у конкретного объекта (это основное что не нравится). Т.е. получается, что несмотря на то что мы можем перегенерить код поменяв набор сообщений или их структуру - нам приходится руками доделывать остальной код.


Обсуждению подлежат любые аспекты - что на входе, внутренние структуры, что на выходе. Главная цель - аддитивность. (даже наличие описания метаинформации не критично - однако это выглядит как разумный подход)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Чт Мар 19, 2009 7:06 pm    Заголовок сообщения: Ответить с цитатой

Дополнение: в реальной системе также ключевым моментом будет производительность, однако я не хочу чтобы это влияло на дизайн кода - я лучше после постараюсь померять производительность предложенного решения с тем что есть сейчас. Тем более я не уверен что switch-case в котором 20 веток будет производительнее скажем Map или еще чего-то.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Snoopy



Зарегистрирован: 29.11.2005
Сообщения: 1395

СообщениеДобавлено: Чт Мар 19, 2009 7:08 pm    Заголовок сообщения: Ответить с цитатой

Поля у всех объектов одни, только разположены по-разному или состав полей совсем разный? Если второе, то непонятно что делает switch - у него получается нет какой-то конкретной задачи, он вообще "обо всём"?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Чт Мар 19, 2009 8:06 pm    Заголовок сообщения: Ответить с цитатой

Snoopy писал(а):
Поля у всех объектов одни, только разположены по-разному или состав полей совсем разный?


Набор полей в каждом конкретном сообщении произвольный за исключением первого однобайтового поля Тип.

Snoopy писал(а):
Если второе, то непонятно что делает switch - у него получается нет какой-то конкретной задачи, он вообще "обо всём"


Дело в том что нет какого-то одного switch-case который делает все - напротив, таких конструкций в коде будет несколько, для каждой конкретной задачи. Но ветки будут зависить от набора типов сообщений - а это предмет частых изменений и дополнений. Вот я и думаю - возможно ли вообще изолировать структуру и набор сообщений от остального кода приложения?

Использование 1: у нас есть некий Grid в котором есть поля: Наименование, Цена продажи, Сколько продается, Цена покупки, Сколько Покупается. И в нем мы для каждого наименования показываем лучшую цену и сколько акций по такой цене продается или покупается. Т.е. если после того сообщения которое я привел выше (цена была 50.25) придет сообщение о продаже 100 акций IBM но за 50.20 - мы в этом гриде сменим цену на 50.20 и количество на 100. Если придет сообщение о покупке - соответственно будем проставлять цены и количества в других колонках. Но информацию о ценах мы так же можем вытащить и из других сообщений - о совершенных сделках скажем. В таком случае внутри switch будет код вытаскивающий эти данные из сообщения, если в сообщении такая информация есть. (кстати в биржевых терминах такое представление называется Top of Book)

Использование 2: Мы опять же строим некий грид, но только уже для одного конкретного Наименования и только для продажи. В нем мы будем показывать все ордера а не только лучшие цены. Цены отсортированы. Т.е. опять в коде будет switch и из определенных сообщений мы будем вытаскивать цены продажи и добавлять строки в грид. В некоторых сообщениях вообще не будет цены, или это будет цена заявленная на покупку (нам не подходит) - в таком случае для них не будет ветки в этом switch.

Собственно я вообще не уверен что можно реализовать то что я хочу, или же может оказаться так что это окажется очень сложным и проще будет править руками код. Но основная проблема в том, что структура и набор сообщений какбы "протекает" в остальной код. А хочется это изолировать в одном месте.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Чт Мар 19, 2009 8:14 pm    Заголовок сообщения: Ответить с цитатой

На самом деле мне поможет само обсуждение, даже если мы не придем к какому-то решению или же вообще решим что задача не имеет смысла. Просто у меня уже глаза настолько замылины существующим (кривым) кодом, что я возможно не вижу леса за деревьями.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Сб Мар 21, 2009 2:52 pm    Заголовок сообщения: Ответить с цитатой

Я бы сделал также как это реализовано в JSF.

Поток байтов (он же массив или ещё какая-то форма).
Диспетчер, который считывает управляющую последовательность (в данном случае 'A')
Диспетчер загружает (или берёт из пула) SaleOrderDecoder
Подобно lucene можно дать этому декодеру контейнерный бин, куда складывать распарсенные занчения
При этом этот самый декодер -- это такое дерево декодеров, которые вызываются им и натравливаются на исходный поток.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Сб Мар 21, 2009 3:09 pm    Заголовок сообщения: Ответить с цитатой

teg писал(а):
Я бы сделал также как это реализовано в JSF.


А это ты про какую конкретно реализацию JSF? Я бы код посмотрел. Если скажешь full-qualified имена классов будет вообще супер.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Сб Мар 21, 2009 3:22 pm    Заголовок сообщения: Ответить с цитатой

alsor писал(а):
А это ты про какую конкретно реализацию JSF? Я бы код посмотрел. Если скажешь full-qualified имена классов будет вообще супер.


Состояние компонентов сохраняется и восстанавливается там везде одинаково. Это стандарт. Имелось в виду следующее:
Код:
@Override
    public Object saveState(FacesContext context) {
        Object values[] = new Object[2];
        values[0] = super.saveState(context);
        values[1] = label;
        return ((Object) (values));
    }

    @Override
    public void restoreState(FacesContext context, Object state) {
        Object values[] = (Object[])state;
        super.restoreState(context, values[0]);
        label = (String)values[1];
    }
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB