Пользовательский класс запросов Java (DSL): шаблон построителя, статический импорт или что-то еще для сложных запросов?

Я создаю собственный класс запросов и не уверен, какой самый элегантный способ его кодирования.

Цели:

  • Простота использования
  • Расширяемость
  • Гибкость, позволяющая формулировать сложные запросы

Подходы

В настоящее время я могу думать о двух альтернативах.

1. Шаблон построителя

Result r = new Query().is("tall").capableOf("basketball").name("michael").build();

Методы is(), enableOf()и name()возвращают ссылку на ] Запросить объект. build()вернет объект Result.

2. Статический импорт

Result r = new Query(is("tall"), capableOf("basketball"), name("michael"));

Методы is(), enableOf()и name()являются статическими импортами и возвращают Условие объектов. Конструктор запроса принимает произвольное количество условий и возвращает результат.

И/Или/Не запросы

Более сложные запросы, такие как следующие, сложно сформулировать:

высокий баскетболист по имени [майкл ИЛИ деннис]

СОЮЗ

серебряная ложка, изогнутая и блестящая

Шаблон Builder:

Result r = new Query().is("tall").capableOf("basketball").or(new Query().name("michael"), new Query().name("dennis")).
    union(
        new Query().color("silver").a("spoon").is("bent").is("shiny")
    ).
    build();

Это трудно писать и читать. Кроме того, мне не нравится многократное использование new.

Статический импорт:

Result r = new Query(is("tall"), capableOf("basketball"), or(name("michael"), name("dennis"))).
    union(color("silver"), a("spoon"), is("bent"), is("shiny"));

Мне кажется, лучше, но мне не очень нравится использование статического импорта. Они сложны с точки зрения интеграции с ide, автодополнения и документации.

Подведение итогов

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

13
задан Alp 4 April 2012 в 08:15
поделиться