Дизайн аксессуаров - PullRequest
       1

Дизайн аксессуаров

0 голосов
/ 18 июля 2011

Учитывая, что у меня есть

class IChunk
{
  public:
    const char* getRawData() = 0;
    ...
};

class Chunk
{
  public:
    const char* getRawData();
    ...

  private:
    char* data;
};

class IDatabase
{
  public:
    IChunk* getChunk( int index ) = 0;
    ...
};

class Database : public IDatabase
{
  public:
    IChunk* getChunk( int index );
    ...

  private:
    std::vector< Chunk > m_chunks;
};

Я бы хотел по-разному интерпретировать необработанные данные, возвращаемые getRawData(), с помощью нескольких методов доступа. Средства доступа используют интерфейсы IChunk и IDatabase.

  1. Какое будет лучшее место для создания аксессора? Было бы правильно расширить интерфейс IDatabase с помощью функции создания, подобной этой:

    IAccessor*  a  = database->createAccessor( ACC_ID_1, index );
    IAccessor1* a1 = dynamic_cast< IAccessor1* >a;
    IAccessor*  a  = database->createAccessor( ACC_ID_2, index );
    IAccessor1* a2 = dynamic_cast< IAccessor2* >a;
    

    , где index - индекс чанка, а ACC_ID_x - идентификатор интерфейса средства доступа.

  2. В этом случае потребуется динамическое приведение, что может быть небезопасно, а дизайн не очень хорош. Могу ли я улучшить это?

  3. Какой шаблон проектирования следует использовать для реализации фабрики аксессуаров? Мое намерение состоит в том, чтобы разрешить динамическое добавление средств доступа (и соответствующих идентификаторов доступа).

  4. Можно ли реализовать создание аксессора примерно так:

    IAccessor3* a3;
    database->createAccessor( ACC_ID_3, index, (void**)&a3 );
    

1 Ответ

1 голос
/ 18 июля 2011

Почему бы не передать объект базы данных и индекс чанка в качестве параметров конструктора методам доступа?

class IAccessor
{
protected:
  IAccessor (IDatabase *database, int index) : m_database (database), m_index (index) {}
  IDatabase *m_database;
  int m_index;
};

class Accessor1 : public IAccessor
{
public:
  Accessor1 (IDatabase *database, int index) : IAccessor (database, index) {}
};

и затем:

Accessor1 a1 (database, index);
some_value = a1.SomeFunction ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...