使用专有的Bioinformatics软件操作域对象,我必须增强API,以便外部各方可以访问存储在内部数据库中的(CRUD)数据。
数据按类型(如分子,寡核苷酸和酶)分组,每个数据中都可以存在可嵌套的子集(分子::蛋白质,分子:: dna等)。
由于每种数据类型都有不同的属性,我们使用格式化的查询字符串(类似于广泛使用的entrez格式)来指定搜索条件。代码示例如下:
IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();
// IMoleculePersistenceService::search( <search-string>, <subset> );
IMolecule[] searchResult = svc.search( "Foo[Name] OR 128[Length]", "molecule::protein" );
我的问题是:
假设用户具有相应的领域知识,以了解与生物学相关的层次结构。 让搜索功能接受prototype
对象而不是格式化字符串会更好吗?
IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();
IMoleculeTemplate searchPrototype = svc.GetSearchPrototype();
searchPrototype.SetName( "Foo" );
searchPrototype.SetLength( 128 );
IMolecule[] searchResult = svc.search( searchPrototype, "molecule::protein" );
IMolecule[] searchResult2 = svc.search( svc.GetSearchPrototype( <parameters> ), "molecule::protein" );
优点:
- 更容易想象/理解
- 如果prototype
可以自动序列化为(格式化)字符串,则与查询字符串兼容。
缺点:
- 固定标准组合时不灵活(AND,OR)。
答案 0 :(得分:0)
服务应该只接受“原型”。将字符串解析为原型是其自身的特征,并不直接属于该服务。我通过例如推广基于原型的原型。首先在HowTo中展示它的示例,并在稍后提及解析功能。
在C#land中,有IQueryable
界面 - 看看answers to this question。原型非常类似于Expression
s,但这对于手头的需求来说可能过于通用。
此外,返回数组可能不是最佳选择,因为这会将实现修复为使用数组。再次在C#中,有IEnumerable
,但我希望看到一些简单的SearchResult
类提供生成/返回结果数组的功能,因此允许您进行内部更改和优化。