C ++: Diferencia entre NVI y método de la plantilla Patrones?
-
28-09-2019 - |
Pregunta
¿Cuál es la diferencia entre NVI ( no virtual Interfaz ) y los patrones de la href="http://en.wikipedia.org/wiki/Template_method_pattern" rel="nofollow noreferrer"> plantilla Método ?
Ellos parecen muy similares y que he leído tanto que son básicamente los mismos y que son sutilmente diferente con Plantilla de ser de alguna manera más general.
Solución
NVI es una expresión idiomática, plantilla de método es un patrón. NVI es una implementación de la Template Method usando envío dinámico en C ++; También es posible crear métodos de plantillas en C ++ usando metaprogramming plantilla para eliminar el envío dinámico.
Un modelo es más general que un idioma, y ??los idiomas pueden utilizar diferentes expresiones idiomáticas para implementar el patrón.
Otros consejos
Como se ha dicho, NVI es un lenguaje programación, relacionada con una categoría de idiomas. Se ha promovido por Herb Sutter entre otros, ya que ayuda a cumplir los contratos:
- invariantes de clase
- contratos de función (afirmaciones más de los parámetros pasados ??y el valor de retorno generada)
- operaciones repetitivas (como la tala)
- control sobre las excepciones generadas (mala idea, aunque;))
Sin embargo, la implementación puede en realidad difieren considerablemente, por ejemplo, otro ejemplo de aplicación NVI es combinarla con Pimpl:
class FooImpl;
class Foo
{
public:
enum type { Type1, Type2 };
Foo(type t, int i, int j);
int GetResult() const;
private:
FooImpl* mImpl;
};
Y para la aplicación:
struct FooImpl
{
virtual ~FooImpl();
virtual int GetResult() const;
};
class FooType1: public FooImpl
{
public:
FooType1(int i, int j);
virtual int GetResult() const;
private:
/// ...
};
Siempre he encontrado que transmitió el punto mejor. Tiene diste cuenta?
El punto principal es que virtual
es un detalle de implementación. Y la exposición de los detalles de implementación de la interfaz es una mala idea, ya que es posible que desee cambiar.
Además detalles de implementación tienden a meterse con la compatibilidad binaria. Por ejemplo la adición de un nuevo método virtual
en una clase puede cambiar el diseño de la tabla virtual (técnica de aplicación común) y por lo tanto botch la compatibilidad binaria. En gcc necesita para asegurarse de que la agrega último (entre lo virtual) si desea conservar la compatibilidad.
Mediante el uso de la combinación NVI + Pimpl anteriormente, no hay virtual
en absoluto (ni siquiera privada) en la clase expuesta. El diseño de memoria es compatible hacia atrás y hacia adelante. Tenemos lograr la compatibilidad binaria.
A continuación, utilizamos varios patrones a la vez:
- Template Method
- Estrategia (ya que podemos cambiar el puntero a voluntad)
- Fábrica (decidir qué aplicación obtenemos)