API запроса базы данных предложений

Работая над проприетарным программным обеспечением для биоинформатики, которое манипулирует объектами домена, я должен улучшить API, чтобы внешние стороны могли получить доступ к (CRUD) данным, хранящимся во внутренней БД.

Данные сгруппированы по типу (например, молекула, олиго и фермент), и в каждом из них могут быть подмножества (молекула:: белок, молекула:: днк и т. Д.), Пригодные для гнездования.

Поскольку каждый тип данных имеет разные атрибуты, мы используем форматированную строку запроса (аналогично широко используемому формату 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 можно сериализовать в (отформатированную) строку автоматически.
Минусы:
-не гибкая, так как комбинация критериев является фиксированной (И, ИЛИ).

1 ответ

Сервис должен принимать только "прототип". Разбор строки в прототипе - это отдельная функция, которая не принадлежит напрямую службе. Я бы продвинул основанный на прототипе, например, сначала показав примеры с ним в HowTo, и упомяну возможность разбора только позже.

В земле C# есть IQueryable Интерфейс - взгляните на ответы на этот вопрос. Прототипы очень похожи Expressionс, но это может быть слишком общим для потребностей под рукой.

Кроме того, возврат массива может быть не лучшим вариантом, потому что это фиксирует реализацию для использования массивов. Опять же в C# есть IEnumerable, но я хотел бы увидеть некоторые простые SearchResult класс, обеспечивающий возможность генерации / возврата массива результатов и, следовательно, позволяющий вам внутренние изменения и оптимизации.

Другие вопросы по тегам