【发布时间】:2012-03-30 11:34:43
【问题描述】:
我正在创建一个自定义查询类,但我不确定最优雅的编码方式。
目标是:
- 易于使用
- 可扩展性
- 灵活,因此可以制定复杂的查询
方法
目前我能想到两种选择。
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 查询
像下面这样更复杂的查询很难表述:
名叫 [michael OR dennis] 的高个子篮球运动员
联合
弯曲有光泽的银勺
建造者模式:
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 集成、自动完成和文档方面很困难。
总结
我正在寻找一个有效的解决方案,因此我愿意接受任何形式的建议。我不限于我提出的两种选择,如果有其他可能性,如果你告诉我,我会很高兴。如果您需要更多信息,请通知我。
【问题讨论】:
-
如果它是一个数据库查询,您的代码看起来与这个库非常相似...jooq.org。你已经考虑过使用像hibernate这样的ORM
-
不,它与数据库无关。它是关于任何网页上元素的查询。
-
网页!? jquery.com 将是我的第一个停靠港
-
jOOQ 看起来像是两种选择的组合,即构建器模式中的静态导入。有趣
-
@NimChimpsky:是的,我在核心中使用 jQuery,但这通常是一个具有更多功能的 Java 包装器。
标签: java design-patterns dsl builder static-import