Я создаю пользовательский класс запросов, и я не уверен в самом элегантном способе его кодирования.
Цели:
- Простота в использовании
- Расширяемость
- Гибкость, позволяющая формулировать сложные запросы
Подходы
В настоящее время я могу придумать две альтернативы.
1.Шаблон Builder
Result r = new Query().is("tall").capableOf("basketball").name("michael").build();
Методы is()
, capableOf()
и name()
возвращают собственную ссылку на объект Query
.build()
вернет объект Result
.
2.Статический импорт
Result r = new Query(is("tall"), capableOf("basketball"), name("michael"));
Методы is()
, capableOf()
и name()
являются статическим импортом и возвращают Condition
объекты.Конструктор Query принимает произвольное количество условий и возвращает результат.
И / или / не запросы
Более сложные запросы, подобные следующим, сложно сформулировать:
высокий баскетболист по имени [майкл или денис]
UNION
серебряная ложка изогнутая и блестящая
Образец строителя:
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"));
Выглядит лучше для меня, но мне не очень нравитсяиспользование статического импорта.Они сложны с точки зрения идеальной интеграции, автозаполнения и документирования.
Подводя итог
Я ищу эффективное решение, поэтому я открыт для предложений любого рода.Я не ограничен двумя альтернативами, которые я представил, если есть другие возможности, я был бы счастлив, если бы вы сказали мне.Пожалуйста, сообщите мне, если вам нужна дополнительная информация.