Как избежать большого оператора if-else в Java - PullRequest
1 голос
/ 04 апреля 2011

Я разрабатываю фреймворк в Java, который опирается на ряд файлов XML с большим количеством параметров.

При чтении параметров из файла XML мне нужно иметь большой оператор if-else, чтобы решить, что это за параметры, а затем вызвать соответствующие методы. Это нормально? иметь большое заявление if-else?

Я думаю, что есть простой и аккуратный способ сделать это, например, Java XML mapping или Java Reflections? это ответ? если да, не могли бы вы привести примеры того, как это делается, чтобы мне не пришлось полагаться на большое выражение if-else?

Спасибо!

Ответы [ 7 ]

3 голосов
/ 04 апреля 2011

Сначала вы хотите создать интерфейс:

public interface XMLParameterHandler {
  public handle_parameter (String XMLData);
}

Далее вы хотите создать карту:

private Map<string, XMLParameterHandler> handlers;

... и инициализировать ее одним из соответствующих Map реализации:

this.handlers = new HashMap<>();

Вам необходимо реализовать интерфейс для нескольких классов, по одному для каждого параметра, который вы собираетесь обрабатывать.Это хорошее использование внутренних классов.Вставьте каждый из этих реализованных handerls в карту:

handlers.put ("Param1", new XMLParam1HandlerImpl());
handlers.put ("Param2", new XMLParam2HandlerImpl());

Затем вы можете вызвать обработчик из цикла обработки xml:

handlers.get (paramValue).handle_parameter(XmlData);
2 голосов
/ 04 апреля 2011

Существует JAXB (http://en.wikipedia.org/wiki/Java_Architecture_for_XML_Binding) для отображения java-класса в xml.

Но вы не можете сопоставить методы с ним: вы можете только сопоставить атрибуты со значениями файла XML (десериализовать параметры из XML).

1 голос
/ 04 апреля 2011

Рекомендую использовать карту с параметром в качестве ключа и XML-записью в качестве значения (не целого XML)

0 голосов
/ 04 апреля 2011

N функций с параметрами M всегда могут быть реализованы с помощью одной функции с параметрами M + 1.

Если вам нужен большой оператор if, else, чтобы решить, какой метод отправить, то вы можете просто добавитьпараметр для вашего метода и вызов одного метода.

Вам не нужен оператор if-then-else для привязки значений параметра.

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

0 голосов
/ 04 апреля 2011

Для меня это звучит так, как будто вам нужен основанный на данных подход к написанию вашего приложения, а не как в XSLT.Один из способов добиться этого - написать его в XSLT вместо Java - в конце концов, XSLT был специально разработан для обработки XML, а Java - нет.Если вы не можете этого сделать, вы можете изучить, как XSLT делает это, используя правила и действия, и эмулировать этот дизайн в своем коде Java.

0 голосов
/ 04 апреля 2011

большой оператор if-else для определения параметров и вызова соответствующих методов

Вместо этого вы можете использовать шаблон разработки Стратегии с одним объектом Стратегии на параметр и использовать карту от имени параметра до объекта Стратегии для использования. Я нашел этот подход полезным даже для умеренно сложного применения XML.

0 голосов
/ 04 апреля 2011

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

Более стандартным методом было бы использование карты, где ключ - это имя атрибута, а значение - это экземпляр реализации некоторого интерфейса, который вы определяете, например AttributeHandler.,Затем реализации содержат код для каждого атрибута.Это включает в себя написание множества маленьких классов, но вы можете делать их как анонимные классы, чтобы сэкономить место и сохранить код в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...