7 votos

Marca Joshi, C++ Patrones de Diseño y fijación de Precios de Derivados : Puente Patrón vs Más Simple de Herencia

He estado trabajando a través de "C++ Patrones de Diseño y fijación de Precios de Derivados" de Mark Joshi. En el capítulo 4 Parameters clase utiliza un puente de patrón y se emplea un clone() método.

La justificación del patrón menciona que permite la extensión de los parámetros de la clase heredando de ParametersInner y siempre que la clase de con virtual clone(), Integral(double time1, double time2)y IntegralSquare(double time1, double time2) métodos.

Yo, no obstante, puede alcanzar los mismos con un simple inherritance. También puedo evitar tener que utilizar el método clone mediante std::make_unique fuera de la clase.

Mi versión de esto es la siguiente. (Yo uso un curve de la clase en lugar de un parameters de la clase)

#include <vector>
#include <memory>

class curve
{
public:

    virtual double Integral(double time1, double time2) const = 0;
    virtual double IntegralSquare(double time1, double time2) const = 0;

    virtual double Mean(double time1, double time2) const {
        return Integral(time1, time2) / (time2 - time1);
    }

    virtual double RootMeanSquare(double time1, double time2) const {
        return IntegralSquare(time1, time2) / (time2 - time1);
    }
};

class constant_curve : curve
{
public:

    constant_curve() = default;
    constant_curve(const constant_curve &) = default;
    constant_curve & operator=(const constant_curve &) = default;

    constant_curve(double value):
        m_val{value}
    {}

    virtual double Integral(double time1, double time2) const override{
        return (time2 - time1)*m_val;
    }

    virtual double IntegralSquare(double time1, double time2) const  override{
        return (time2 - time1)*m_val*m_val;
    }

private:
    double m_val;
};

int main()
{
    std::vector<std::unique_ptr<curve>> curves;
    curves.emplace_back(std::make_unique<constant_curve>(10));
}

Mi Pregunta es la siguiente:

¿Cuáles son las razones para usar el puente patrón como se usa en el libro como aposición a la más simple patrón de arriba?

No estoy seguro de si me permite copiar el código a este foro, así que aquí hay un enlace al código. Patrones de diseño y fijación de Precios de Derivados 2ª Edición.

4voto

Nick Klauer Puntos 2837

Aquí está mi pensamiento, es más un intento de responder de una adecuada respuesta, puedo estar equivocado :

Página 54 del libro está escrito :

[...] Lo que realmente me gustaría es un pay-off de la clase que tiene el buen polimórficos características que nuestra clase, mientras que tomando el cuidado de su propia gestión de memoria. Hay un par de métodos para la resolución de este problema. Uno es el uso de una clase contenedora que ha Puente con un constructor virtual sido templatized: esta es realmente la programación genérica en lugar de orientado a objetos de programación, y se explora este enfoque en la Sección 5.4. El otro es conocido como el puente patrón.

Por lo que entiendo que el puente de patrones objetivos para cuidar de la memoria . En el código, el único miembro de la parameter de la clase es un puntero a la clase abstracta ParametersInner. Y el papel de la parameter de la clase es la gestión de memoria asociada a la ParametersInner mediante la encapsulación de la new (a través de el clon) y delete dentro de su constructor/destructor.

Así que creo que este nivel extra de la herencia actúa exactamente tiene un puntero inteligente hace.

El segundo enfoque, la clase contenedora presentado en 5.4 es, en esencia, un puntero inteligente, pero creo que el uso de puntero inteligente no era muy común en la época en que el autor escribió el libro (de 2004 para la primera edición, 2007 y para el segundo) y esta es probablemente la razón por la que él considera principalmente el puente de los patrones que parece un poco anticuado para mí. Tenga en cuenta que std::make_unique es un c++14 característica que sólo ha sido lanzado oficialmente en el año 2014 y std::make_shared es una característica de c++11, introducido en 2011 .

Un breve capítulo se ha añadido en la segunda edición para presentar puntero inteligente. El autor presenta brevemente puntero inteligente en el capítulo 13.3, pero se parece más a una adición de último minuto a un libro ya escrito (primera edición) que a una verdadera consideración. Como usted ha dicho, yo creo que la mayoría del código del libro podría haber sido rediseñado en una forma más sencilla gracias a los punteros inteligentes.

Así que para resumir, a pesar de que, según yo, un libro esencial sobre c++ derivados, creo que ahora está un poco anticuado, el uso de puntero inteligente, común hoy en día, podría facilitar considerablemente el diseño.

Así que, finalmente :

¿Cuáles son las razones para usar el puente patrón como se utiliza en el libro, a diferencia de la más simple patrón de arriba?

Porque punteros inteligentes realmente no disponible en este momento (excepto con el impulso de la biblioteca..) , la historia importa.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X