0

在处理域对象的专有生物信息学软件上工作时,我必须增强 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" );


优点: -
更易于可视化/理解- 如果可以自动序列化为(格式化)字符串
,则与查询字符串兼容。缺点: - 不灵活,因为标准组合是固定的(AND、OR)。prototype

4

1 回答 1

0

该服务应该只接受一个“原型”。将字符串解析为原型是其自身的特性,并不直接属于服务。我会通过例如首先在 HowTo 中展示示例来推广基于原型的方法,然后再提及解析功能。

在 C# 领域,有IQueryable界面——看看这个问题的答案。原型看起来很像Expressions,但这对于手头的需求来说可能太通用了。

此外,返回数组可能不是最好的选择,因为这会将实现固定为使用数组。同样在 C# 中,有IEnumerable,但我希望看到一些简单SearchResult的类提供生成/返回结果数组的能力,因此允许您进行内部更改和优化。

于 2012-06-20T04:48:39.823 回答