Я создаю пользовательский класс запросов, и я не уверен в самом элегантном способе его кодирования.
Цели:
- Простота использования
- расширяемость
- Гибкий, чтобы можно было сформулировать сложные запросы
Подходы
В настоящее время я могу думать о двух альтернативах.
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
. Конструктор запросов принимает произвольное количество условий и возвращает результат.
И/Или/Не запросы
Более сложные запросы, подобные следующим, сложны для формулировки:
высокий баскетболист по имени [майкл ИЛИ Деннис]
СОЕДИНЕНИЕ
серебряная ложка, изогнутая и блестящая
Рисунок 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"));
Выглядит лучше для меня, но мне не очень нравится использование статического импорта. Они сложны с точки зрения интеграции идей, автоматического завершения и документации.
Сумма
Я ищу эффективное решение, поэтому я открыт для любых предложений. Я не ограничиваюсь двумя представленными мной альтернативами, если есть другие возможности, я был бы счастлив, если вы скажете мне. Пожалуйста, сообщите мне, если вам нужна дополнительная информация.