Один интерфейс для слишком разных вещей?
От: Аноним  
Дата: 16.04.08 10:09
Оценка:
Есть некий набор компонент они деляться на сетевые и локальные.

Приложение должно показать список найденных компонент, и принимать решение
можно или нет выполнить данную операцию над данным устройством.

В данный момент дизайн выглядит следующим образом:

Есть абстактный интерфейс:

enum Type {
  Local,
  Net,
};

struct ComponentId {
  union {
   NetId,
   LocalId
  } data;
  bool compare(ComponentId, ComponentId);
};

struct IComponent {
  virtual CompoentId id();
  virtual Type type();
  virtual void update();
};

struct ILocalComponent : public IComponent {
  virtual int characteristic1();
...
};

struct INetComponent : public IComponent {
 virtual double some_info();
};


Есть некий CompoentId используемый для сортировки списка, и сериализации в базу данных,
IComponent содержаший общие методы и ILocalCompoent и INetComponent для получения более конкретной
информации.

Не нравиться "union" в ComponentId, но решение в виде LocalComponentId и NetComponentId,
намного увеличит иерархию.
Еще не нравиться использование следующего алгоритма каждый раз и обращении к IComponent:

IComponent *component;
if (component->type() == Net) {
  INetComponent *c = dynamic_cast<INetComponent *>(component);
  ASSERT(c != NULL);
  //work
} else if (component->type() == Local) {
  ILocalComponent *c = dynamic_cast<ILocalComponent *>(component);
  ASSERT(c != NULL);
 //work
}


Есть идеи по улучшению архитектуру с целью уменьшения дублирования кода,
сокращения его размера, облегчения добавления нового типа в ряд Local, Net?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.