Я работаю над API компьютерного зрения, где у меня есть различные алгоритмы, которые все работают с данными изображения и пытаются классифицировать некоторые объекты.
Некоторые из простых алгоритмов говорят, что классифицируют объекты просто на основе их размера, т.е. алгоритм может возвращать количество всех объектов в зависимости от их размера, например: маленький, средний, большой, например
Некоторые другие алгоритмы более точно настроены и могут классифицировать объекты по их истинному типу, например, стол, стул, кровать.
Итак, у меня есть интерфейс для всех таких объектов подсчета, как:
class IFurnitureCounter
{
virtual std::map<ObjectType, size_t> getCount(const Image &input) = 0;
};
Идея состоит в том, что каждый из этих алгоритмов будет реализовывать этот getCount()
метод, чтобы вызывающий мог использовать их независимо.
Моя проблема в том, что ключ ObjectType
превращается в мешанину. Итак, я могу определить это ObjectType
как перечисление, например:
enum class ObjectType {SMALL, MEDIUM, BIG, TABLE, CHAIR, BED}
Однако это плохо, так как каждый алгоритм теперь видит все типы, даже если конкретный алгоритм может работать только с их подмножеством. Мне было интересно, есть ли лучшая парадигма разработки для лучшего разделения этих типов между алгоритмами.
EDIT
Одна вещь, о которой я подумал, - это иметь разные enum для разных алгоритмов и специализироваться на этом типе.
Итак, скажем, у нас есть что-то вроде:
enum class SizeEnum {SMALL, MEDIUM, BIG};
enum class ObjectTypeEnum {CHAIR, TABLE, BENCH}
Итак, мой интерфейс может выглядеть так:
template<typename EnumType>
class IFurnitureCounter
{
virtual std::map<EnumType, size_t> getCount(const Image &input) = 0;
};
Теперь у меня может быть что-то вроде:
class MyAwesomeCounter: public IFurnitureCounter<ObjectTypeEnum>
{
// My implementation here...
};
Хотелось бы что-нибудь подобное? Может быть, мой синтаксис не точен, но кто-то может сказать мне, если это разумный подход или нет?