Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 建议数据库查询API_Design Patterns_Search_Usability_Api Design_Query By Example - Fatal编程技术网

Design patterns 建议数据库查询API

Design patterns 建议数据库查询API,design-patterns,search,usability,api-design,query-by-example,Design Patterns,Search,Usability,Api Design,Query By Example,在一个操作域对象的专有生物信息学软件上工作,我必须增强API,以便外部各方能够访问存储在内部数据库中的(CRUD)数据 数据按类型(如分子、低聚物和酶)分组,在每个类型中,可以有可嵌套的子集(分子::蛋白质、分子::dna等) 因为每种数据类型都有不同的属性,所以我们使用格式化的查询字符串(类似于广泛使用的格式)来指定搜索条件。代码示例如下所示: IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();

在一个操作域对象的专有生物信息学软件上工作,我必须增强API,以便外部各方能够访问存储在内部数据库中的(CRUD)数据

数据按类型(如分子、低聚物和酶)分组,在每个类型中,可以有可嵌套的子集(分子::蛋白质、分子::dna等)

因为每种数据类型都有不同的属性,所以我们使用格式化的查询字符串(类似于广泛使用的格式)来指定搜索条件。代码示例如下所示:

IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();

// IMoleculePersistenceService::search( <search-string>, <subset> );
IMolecule[] searchResult = svc.search( "Foo[Name] OR 128[Length]", "molecule::protein" );

优点:
-更易于可视化/理解
-如果
prototype
可以自动序列化为(格式化)字符串,则与查询字符串兼容。
缺点:

-不灵活,因为标准组合是固定的(或和或)。

服务应只接受“原型”。将字符串解析为原型本身就是一项功能,并不直接属于服务。例如,我会首先在HowTo中展示基于原型的示例,然后再提到解析功能

在C#land中,有一个
IQueryable
接口——请查看。原型看起来非常像
Expression
s,但这对于手头的需求来说可能过于通用

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

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" );