Вопрос о дизайне Java: хороший ли это дизайн?

#java #xml #design-patterns

#java #xml #шаблоны проектирования

Вопрос:

Я пишу Java-клиент, который взаимодействует с удаленным сервером через HTTP / XML.

Сервер отправляет команды моему клиенту в формате XML, вот так:

 <command>
<name>C1</name>
<param>
.....
</param>
</command>
  

Существует около 10 или более различных команд (C1, C2, …), каждая из которых имеет разный набор параметров.

Мой клиент обработает команду, затем сервер ответов с результатом выполнения выглядит следующим образом:

 <C1>
<code>200</code>
<desc>xxx</desc>
</C1>
  

Я знаком только с C, но очень новичок в Java и ООП,

итак, мой вопрос прост: как изящно спроектировать следующую логику способом ООП?

1. Преобразуйте XML-строку в XML-объект
2. Найдите соответствующего исполнителя на основе элемента ‘name’ XML и проанализируйте параметры
3. Выполните команду вместе с параметрами
4. Преобразуйте результат в XML-объект
5. Преобразуйте XML-объект в XML-строку

Хороший ли это дизайн?

1. Определите абстрактный базовый класс и множество подклассов для каждой команды, которые включают следующий метод:

 void parseCommand(MyXMLObject obj);
void execute();
MyXMLObject generateResult();
  

или просто простой метод:

 MyXMLObject execute(MyXMLObject obj);
  

и эти поля:

 String mCommandName;
int mRetCode;
String mRetDesc;
  

2. Затем определите класс factory для возврата экземпляра одного из подклассов на основе XML-объекта.

3. Код логической части:

 MyXMLObject obj = MyXMLUtil.getXMLObject(XMLString);
MyCommand command = MyCommandFactory.getCommand(obj);
MyXMLObject retObj = command.execute();
String retStr = MyXMLUtil.getString(retObj);
...//network operation
  

Ответ №1:

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

Большая проблема заключается в том, что это, во многих отношениях, переосмысление колеса. Существует множество фреймворков, которые обрабатывают отображение из POJOs (объектов Java) в структурированные текстовые форматы (такие как XML или JSON). Кроме того, существует множество общих реализаций командных фреймворков. Возможно, стоит изучить доступные варианты, прежде чем предоставлять собственную реализацию.

Комментарии:

1. Спасибо за ваше предложение. Я искал некоторые «командные фреймворки», но пока не нашел ни одного хорошего примера : (

2. @bhh: Почти в каждой компании, в которой я был, есть очень хорошая и проверенная реализация командной строки. Я уверен, что существуют также альтернативы с открытым исходным кодом (хотя это может заслуживать отдельного вопроса о stackoverflow). Но определенно существуют готовые решения для перехода с POJOs на формат, подобный XML или JSON.

Ответ №2:

В принципе, да, именно так все и работает. Но я думаю, вам следует разделить различные проблемы.

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

Комментарии:

1. JAXB является стандартом (JSR-222) для сопоставления объекта с XML: bdoughan.blogspot.com/2010/10 /… . XStream — это технология сериализации: xstream.codehaus.org/faq.html#Uses

Ответ №3:

Как говорили другие, дизайн выглядит довольно неплохо. Чтобы упростить себе жизнь, вам следует ознакомиться с Simple XML для синтаксического анализа XML -> Java и создания XML из объектов Java.

Комментарии:

1. Проверьте: bdoughan.blogspot.com/2010/10 /…

2. @Blaise: 1. Обычно я с подозрением отношусь к стандартам Java, но поскольку вы сравниваете Simple и JAXB параллельно, я попробую это для своего следующего проекта.