カスタム クエリ クラスを作成していますが、最も洗練されたコーディング方法がわかりません。
目標は次のとおりです。
- 使いやすい
- 拡張性
- 複雑なクエリを定式化できる柔軟性
アプローチ
現在、私は2つの選択肢を考えることができます。
1.ビルダーパターン
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 コンストラクターは、任意の数の条件を取り、結果を返します。
And/Or/Not クエリ
次のようなより複雑なクエリは、作成が複雑です。
[マイケル OR デニス] という名前の背の高いバスケットボール選手
連合
曲がって光る銀の匙
ビルダー パターン:
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 統合、自動補完、および文書化の点で困難です。
まとめます
私は効果的な解決策を探しているので、あらゆる種類の提案を受け付けています。提示した 2 つの選択肢に限定されません。他に可能性がある場合は、教えていただければ幸いです。さらに情報が必要な場合はお知らせください。