Какой паттерн?
От: Аноним  
Дата: 28.06.10 11:58
Оценка:
В базе данных имеются строки с XML, каждый XML содержит некий объект, тип которого определяется самим XML-ем.

Хочется в коде организовать классами все эти XML-и.

объект.FromXML(xml);

if(объект.Тип == "объект_1")
return объект_1.From(объект);

if(объект.Тип == "объект_2")
return объект_2.From(объект);

if(объект.Тип == "объект_3")
return объект_3.From(объект);

if(объект.Тип == "объект_4")
return объект_4.From(объект);


Предложите, пожалуйста, более аккуратный способ. Мне кажется такой есть.
Re: Какой паттерн?
От: TK Лес кывт.рф
Дата: 28.06.10 12:05
Оценка: 1 (1) +2
Здравствуйте, Аноним, Вы писали:

А>В базе данных имеются строки с XML, каждый XML содержит некий объект, тип которого определяется самим XML-ем.

А>Хочется в коде организовать классами все эти XML-и.

А>Предложите, пожалуйста, более аккуратный способ. Мне кажется такой есть.


Паттерн называется фабрика. отдаете ей XML (или объект) а она возвращает вам "конкретную" версию (объект_1/объект_2/объект_3/объект_4)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Какой паттерн?
От: Aen Sidhe Россия Просто блог
Дата: 28.06.10 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В базе данных имеются строки с XML, каждый XML содержит некий объект, тип которого определяется самим XML-ем.


А>Хочется в коде организовать классами все эти XML-и.


А>Предложите, пожалуйста, более аккуратный способ. Мне кажется такой есть.


Почитай про Xml Serialization. Всё делается атрибутами.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Какой паттерн?
От: Аноним  
Дата: 29.06.10 08:12
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Почитай про Xml Serialization. Всё делается атрибутами.


А десериализатор может сам определить тип объекта? Как это сделать?
Re[3]: Какой паттерн?
От: Aen Sidhe Россия Просто блог
Дата: 29.06.10 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Aen Sidhe, Вы писали:


AS>>Почитай про Xml Serialization. Всё делается атрибутами.


А>А десериализатор может сам определить тип объекта? Как это сделать?


Может. По имени ноды, по значению атрибута, ещё как-либо. XmlArrayItemAttribute и его аналоги в помощь.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[4]: Какой паттерн?
От: Аноним  
Дата: 29.06.10 08:18
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Aen Sidhe, Вы писали:


AS>>>Почитай про Xml Serialization. Всё делается атрибутами.


А>>А десериализатор может сам определить тип объекта? Как это сделать?


AS>Может. По имени ноды, по значению атрибута, ещё как-либо. XmlArrayItemAttribute и его аналоги в помощь.


И ещё вопрос, сорри, можно ли как-то десериализовать в уже готовый объект. Мой объект на хранит половину данных в реляционном виде, половину в xml. Поэтому я сперва гружу в него реляционные запросом, а потом, при необходимости, хочу подгрузить xml. Прошу прощения.
Re[5]: Какой паттерн?
От: Aen Sidhe Россия Просто блог
Дата: 29.06.10 08:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Aen Sidhe, Вы писали:


AS>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, Aen Sidhe, Вы писали:


AS>>>>Почитай про Xml Serialization. Всё делается атрибутами.


А>>>А десериализатор может сам определить тип объекта? Как это сделать?


AS>>Может. По имени ноды, по значению атрибута, ещё как-либо. XmlArrayItemAttribute и его аналоги в помощь.


А>И ещё вопрос, сорри, можно ли как-то десериализовать в уже готовый объект. Мой объект на хранит половину данных в реляционном виде, половину в xml. Поэтому я сперва гружу в него реляционные запросом, а потом, при необходимости, хочу подгрузить xml. Прошу прощения.


Нет, десериализатор создаёт новый объект.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Не совсем
От: BluntBlind  
Дата: 29.06.10 08:29
Оценка:
Здравствуйте, TK, Вы писали:

TK>Паттерн называется фабрика. отдаете ей XML (или объект) а она возвращает вам "конкретную" версию (объект_1/объект_2/объект_3/объект_4)

Это что-то другое, что умеет распознавать и вызывать СООТВЕТСТВУЮЩИЙ метод фабрики.

Есть IОбъект1, IОбъект2, IОбъект3 ...

Фабрика:
interface IСемействоОбъектовСоздатель
{
    IОбъект1 CreateОбъект1(данные);
    IОбъект2 CreateОбъект2(данные);
    IОбъект3 CreateОбъект3(данные);
    ...
}

// Плюс конкретные реализации этих интерфейсов
Re[5]: Какой паттерн?
От: TK Лес кывт.рф
Дата: 29.06.10 10:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И ещё вопрос, сорри, можно ли как-то десериализовать в уже готовый объект. Мой объект на хранит половину данных в реляционном виде, половину в xml. Поэтому я сперва гружу в него реляционные запросом, а потом, при необходимости, хочу подгрузить xml. Прошу прощения.


Можно взять который "маппер" который сделает "отображение" загруженного XML (зависит насколько у него сложная схема) на свойства существующего объекта.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Не совсем
От: TK Лес кывт.рф
Дата: 29.06.10 10:40
Оценка:
Здравствуйте, BluntBlind, Вы писали:

TK>>Паттерн называется фабрика. отдаете ей XML (или объект) а она возвращает вам "конкретную" версию (объект_1/объект_2/объект_3/объект_4)

BB>Это что-то другое, что умеет распознавать и вызывать СООТВЕТСТВУЮЩИЙ метод фабрики.
BB>Есть IОбъект1, IОбъект2, IОбъект3 ...

BB>Фабрика:

BB>// Плюс конкретные реализации этих интерфейсов

Судя по коду:
return объект_1.From(объект); 
...
return объект_2.From(объект); 
...
return объект_3.From(объект); 
...
return объект_4.From(объект);


Как минимум, есть некий базовый интерфейс к которому приводятся объект_1, объект_2, объект_3 и объект_4. Зачем для этого четыре метода — непонятно.

А вот IОбъект1, IОбъект2, IОбъект3 и IСемействоОбъектовСоздатель для исходной задачи это домысливание и over-design.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.