Посоветуйте паттерн
От: _Sphinx_ Россия http://www.rogov.su
Дата: 09.05.08 18:27
Оценка:
Полагаю, что задача довольно типичная и для ее решения должен подходить какой-то из паттернов.

Итак, исходные условия
1. Маленькая библиотека, пишется на C#, предполагается использование только в среде .NET, соответственно использование того, что получится, должно быть максимально удобным в контексте языка C#
2. Пишется библиотека для разбора и обработки некоторых данных, получаемых по сети. Данные представляют собой пакеты некоторого протокола (в данном случае речь идет про протокол NetFlow хотя это и не принципиально). Протокол имеет несколько версий, что сказывается на структуре и содержимом пакетов. Достоверно известно, что в любой версии первые 2 байта пакета означают номер версии протокола. Необходимо сделать обертку для этих данных — т.е. прилетает пакет, мы его разбираем на части, и засовываем в какой-то класс.

Вот как собственно сделать это наиболее удобным образом? чтобы и выглядело прилично, и было расширяемо нормально (в случае появления новых версий).

Я пока думаю сделать так: завести отдельные классы для каждой версии, базовый класс (Foo) для них и в нем статический метод. Этот метод будет возвращать объект с типом Foo принимая входной массив байт. Соответственно, будет определять версию пакета и создавать объект нужного типа, инициализируя его всеми необходимыми данными. Если это как то вписывается в существующие паттерны, то как это можно назвать? Мне думалось, что это фабрика, но как-то не очень похоже на фабрику...

Соответственно для конечной программы обработка пакета представляет собой что-то типа:

byte [] packetData;
// Здесь получаем содержимое пакета по сети
PacketVersion1 PV1 = null;
PacketVersion2 PV2 = null;

PacketBase Packet = PacketBase.Parse(packetData);
if(typeof(Packet) == typeof(PacketVersion1))
{
    PV1 = (PacketVersion1)Packet;
}

if(typeof(Packet) == typeof(PacketVersion2))
{
    PV2 = (PacketVersion2)Packet;
}


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

Нужен совет.

P.S. как напишу это хозяйство — выложу исходники для всех желающих на условиях Absolutely Free, мож кому пригодится....
ICQ: 203-009-172
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.