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)
scroll top