Подходит ли прокси для создания демонстрационного режима?

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

Мой вопрос: подходит ли шаблон прокси (или любой другой) для создания демонстрационных режимов в программном обеспечении?

Рассмотрим приведенный ниже пример, который упрощен до краткости.

class Arm
{
public:
    int _x = 0;
    int _y = 0;

    virtual void move(int x, int y) = 0;
};

class RobotArm : public Arm
{
    virtual void move(int x, int y)
    {
        /* assum we have actual hardware coommands here which updates variables */
        //_x = x;
        //_y = y;

        std::cout << "hardware is not connected, can't move" << std::endl;
    }
};

class RobotArmDemo : public Arm
{
    virtual void move(int x, int y)
    {
        /* no hardware commands here, just update variables */
        _x = x;
        _y = y;

        std::cout << "Demo Arm moved to " << _x << "," << _y << std::endl;
    }
};

class Robot
{
public:
    Arm *leftArm;
    Arm *rightArm;
};

int main()
{
    Arm * leftArm = new RobotArmDemo; // creating an arm in demo mode!
    Arm * rightArm = new RobotArm; // this arm is the real one

    Robot * robot = new Robot;

    robot->leftArm = leftArm;
    robot->rightArm = rightArm;

    // perform action
    robot->leftArm->move(3, 3); // this is on demo mode
    robot->rightArm->move(1, 2); // this is real mode

    return 0;
}

В приведенном выше коде я создал одну демонстрационную руку и одну реальную руку для робота, чтобы показать, как каждая из них будет работать. Очевидно, что в реальном демонстрационном режиме все производные объекты будут иметь демонстрационную реализацию. Это хороший способ реализовать демонстрационные режимы в программном обеспечении?

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


person zar    schedule 16.11.2016    source источник
comment
Ваш подход хорош, но это не шаблон прокси, прокси нет.   -  person Alexey Guseynov    schedule 17.11.2016
comment
возможно, лучшим термином будет внедрение зависимостей, см. здесь: stackoverflow.com/questions/5585436/   -  person marcinj    schedule 17.11.2016
comment
@AlexeyGuseynov да, я подумал, что это не совсем прокси, но имеет несколько похожий дизайн класса.   -  person zar    schedule 17.11.2016


Ответы (1)


Да, это выглядит как хороший подход.

Что вы также можете рассмотреть помимо вашего дизайна, так это абстрактный фабричный класс, создающий робота, который создает правильные объекты (демонстрационные или реальные классы). Таким образом, первые 5 строк основной функции окажутся в фабричном классе.

person Michel Keijzers    schedule 16.11.2016