Категоризация предметов в правильном направлении - PullRequest
2 голосов
/ 17 августа 2011

Я работаю над приложением, которое, помимо прочего, загружает элементы, относящиеся к определенной категории, с сервера.Я хочу, чтобы загрузчик выглядел так:

class Downloader
{
    Downloader(const ItemCategoryBase &category);
    ...
}

Каждый класс, производный от ItemCategoryBase, предоставит свой идентификатор категории через виртуальную функцию (фактически это единственное, что каждый производный класс будет делатьdo).

Проблема, с которой я столкнулся, заключается в том, что у меня есть в общей сложности 120 категорий предметов, и написание производного класса для каждой будет болезненным.

Я подумал об использованиипримитив для хранения идентификатора, но я не хочу реализовывать проверку диапазона и генерировать исключения в случае, если идентификатор выходит за пределы диапазона, главным образом потому, что идентификаторы категорий не являются частью одного и того же интервала.

Мне нужен эффективный способ написания кода, который бы соответствовал схеме выше.

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Поскольку вы используете C ++, почему бы не использовать шаблоны и указать параметр шаблона нетипичного типа, содержащий идентификатор?

Например, предположим, что категория является целым числом:

template<int category_id>
class Downloader : public ItemCategoryBase
{
    public:
    virtual int get_id()
    {
        return category_id;
    }
};

Вы могли бы также позволить компилятору сделать всю работу за вас.

1 голос
/ 17 августа 2011

Если вы действительно определили, что это правильный путь, я бы предложил написать генератор кода, который бы справился с вами: создайте документ CSV, содержащий все идентификаторы категории, и напишите приложение, которое вставляет каждый идентификатор.в заголовочные / исходные файлы шаблона и сохраняет его. (Например, поместите «$ CATEGORY_ID» в любом месте, куда указывается идентификатор категории в файлах, а затем просто замените «$ CATEGORY_ID» на каждый идентификатор по очереди.)

Однако я не уверен, что понимаю ваше утверждение: «Я рассмотрел вопрос об использовании примитива для хранения идентификатора, но я не хочу реализовывать проверку диапазона и генерировать исключения в случае, если идентификатор выходит издиапазон в основном потому, что идентификаторы категорий не являются частью одного и того же интервала. "Я не могу представить себе случай, когда вам все равно не пришлось бы обрабатывать сложности где-то в вашем приложении, и проверка диапазона не была бы сложной: просто поместите все действительные идентификаторы категории в структуру списка любого типа идентификатора.и простой вызов поиска по индексу может ответить, является ли идентификатор частью этого списка.

Если я вас неправильно понял, что именно в вашей настройке делает работу со 120 производными классами ItemCategoryBase проще, чем один базовый класс ItemCategoryBase, проверенный по списку идентификаторов?Вы говорите «главным образом потому, что идентификаторы категорий не являются частью одного и того же интервала», поэтому, возможно, проверка по списку даст вам то, что вам нужно.В противном случае, вы можете объяснить немного больше о том, как это работает?Хотя я понимаю, что всегда есть исключения, 120 классов, не делающих ничего, кроме предоставления разных идентификаторов, действительно поражают меня как то, что вряд ли будет решением, которое хорошо вам пригодится в долгосрочной перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...