Как правильно хранить / передавать переменную типа интерфейса (современный c ++)? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть два интерфейса: INetwork и IController.Класс App будет хранить реализации обоих интерфейсов в виде полей.Оба интерфейса должны иметь доступ к общедоступным методам друг друга.Это будет выглядеть примерно так:

class INetwork
{
public:
    virtual ~INetwork() {}
    virtual void do_something() = 0;
    virtual void setController(IController*);
}

class IController
{
public:
    virtual ~IController() {}
    virtual void do_something() = 0;
    virtual void setNetwork(INetwork*);
}

class Controller : public IController
{
    void do_something() override;
}

class Network : public INetwork
{
    void do_something() override;
}

class App
{
private:
    IController *controller;
    INetwork *network;

    void initialize()
    {
        controller = new Controller(); //todo: factory
        network = new Network(); //todo: factory
        controller.setNetwork(network);
        network.setController(controller);
    }
}

Идея:

  • Network и Controller - это две отдельные сущности, которые будут развиваться с течением времени (ControllerV1, ControllerV2, ControllerMultithreaded, NetworkHttp, NetworkModbus и т. Д.), Но мне все еще необходимо поддерживать обратную совместимость, и конкретные реализации будут зависеть от конфигурации.Вот почему я использую интерфейсы.
  • Network и Controller смогут управлять друг другом в зависимости от различных событий, изменений состояния и так далее.Вот почему я передаю их друг другу через setController(IController*) и setNetwork(INetwork*).Я также хотел бы реализовать паттер Observer для Network и Controller.

Теперь основной проблемой является то, что я не уверен, как правильно реализовать все мои идеи, используя современный C ++11/14 подходов.Должен ли я хранить INetwork и IController простой указатель внутри App или я должен использовать std::shared_ptr здесь?Как хранить и передавать ссылки на INetwork в IController и наоборот?Есть ли какие-либо проблемы с наследованием?

C ++ предоставляет несколько инструментов, и я немного растерялся.

TL & DR

  1. Должен ли я использовать необработанный указатель или лучшепереключиться на std :: shared_ptr?
  2. Что вы думаете о схеме наследования?

1 Ответ

0 голосов
/ 26 мая 2018

Не существует единственного правильного ответа на вопросы, которые вы задаете.

Существуют различные способы хранения / передачи переменных, которые являются интерфейсами, и вы упомянули некоторые из этих способов.Некоторые другие способы решения этой проблемы зависят от того, чего вы в конечном итоге пытаетесь достичь.

Например, если вы в конечном итоге беспокоитесь о полиморфном поведении и , к которому вы не привязаныэто как деталь дизайна / типа, вы также можете рассмотреть возможность стирания типа и сохранения / передачи этих объектов по значению (семантически говоря).Что касается того, как и почему вы можете захотеть сделать это таким образом - что также решает ваш вопрос о проблемах с использованием наследования - я бы посоветовал посмотреть выступление Шона Родителя: Наследование - это базовый класс зла .

Что и как вам следует сделать, это вопрос мнения, который лучше подходит для такого сайта, как Code Review или Software Engineering .

...