我正在创建一个自定义查询类,但我不确定最优雅的编码方式。
目标是:
- 便于使用
- 可扩展性
- 灵活,以便可以制定复杂的查询
方法
目前我可以想到两种选择。
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()
对象。Query 构造函数接受任意数量的条件并返回结果。name()
Condition
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 集成、自动完成和文档方面很困难。
总结
我正在寻找一个有效的解决方案,因此我愿意接受任何形式的建议。我不限于我提出的两种选择,如果有其他可能性,如果你告诉我,我会很高兴。如果您需要更多信息,请通知我。