Puntero opaco

¿Qué es un puntero opaco?
Opaco, como sugiere su nombre, es algo que no podemos ver. por ejemplo, la madera es opaca. Un puntero opaco es un puntero que apunta a una estructura de datos cuyo contenido no está expuesto en el momento de su definición.

El siguiente puntero es opaco. Uno no puede conocer los datos contenidos en la estructura STest mirando la definición.

struct STest* pSTest;

Es seguro asignar NULL a un puntero opaco.

pSTest = NULL; 

¿Por qué puntero opaco?
Hay lugares en los que solo queremos insinuar al compilador que “¡Oye! Esta es una estructura de datos que será utilizada por nuestros clientes. No se preocupe, los clientes proporcionarán su implementación mientras preparan la unidad de compilación”. Este tipo de diseño es robusto cuando tratamos con código compartido. Por favor vea el siguiente ejemplo:

Digamos que estamos trabajando en una aplicación para manejar imágenes. Dado que vivimos en un mundo en el que todo se traslada a la nube y los dispositivos son muy asequibles, queremos desarrollar aplicaciones para las plataformas Windows, Android y Apple. Por lo tanto, sería bueno tener un buen diseño que sea robusto, escalable y flexible según nuestros requisitos. Podemos tener un código compartido que sería utilizado por todas las plataformas y luego diferentes puntos finales pueden tener un código específico de la plataforma.
Para manejar imágenes, tenemos una clase CImage que expone API para manejar varias operaciones de imagen (escala, rotar, mover, guardar, etc.).
Dado que todas las plataformas proporcionarán las mismas operaciones, definiríamos esta clase en un archivo de encabezado. Pero la forma en que se maneja una imagen puede diferir entre plataformas. Al igual que Apple, puede tener un mecanismo diferente para acceder a los píxeles de una imagen que Windows. Esto significa que las API pueden exigir un conjunto diferente de información para realizar operaciones. Entonces, para trabajar en código compartido, esto es lo que nos gustaría hacer:

Image.h: un archivo de encabezado para almacenar la declaración de clase.

// This class provides API to deal with various
// image operations. Different platforms can 
// implement these operations in different ways.
class CImage
{
public:
    CImage();
    ~CImage();
    struct SImageInfo* pImageInfo;
    void Rotate(double angle);
    void Scale(double scaleFactorX, 
               double scaleFactorY);
    void Move(int toX, int toY);    
private:
    void InitImageInfo();
};

Image.cpp: código que se compartirá entre diferentes puntos finales

// Constructor and destructor for CImage
CImage::CImage()
{
    InitImageInfo();
}
  
CImage::~CImage()
{
    // Destroy stuffs here
}

Image_windows.cpp: el código específico de Windows residirá aquí

struct SImageInfo
{
   // Windows specific DataSet
};
  
void CImage::InitImageInfo()
{
    pImageInfo = new SImageInfo;
    // Initialize windows specific info here
}
  
void CImage::Rotate()
{
    // Make use of windows specific SImageInfo
}

Image_apple.cpp: el código específico de Apple residirá aquí

struct SImageInfo
{
    // Apple specific DataSet
};
void CImage::InitImageInfo()
{
    pImageInfo = new SImageInfo;
      
    // Initialize apple specific info here
}
void CImage::Rotate()
{
    // Make use of apple specific SImageInfo
}

Como se puede ver en el ejemplo anterior, al definir el modelo de la clase CImage, solo mencionamos que hay una estructura de datos SImageInfo.
El contenido de SImageInfo es desconocido. Ahora es responsabilidad de los clientes (Windows, Apple, Android) definir esa estructura de datos y usarla según sus requisitos
. Si en el futuro queremos desarrollar una aplicación para un nuevo punto final ‘X’, el diseño ya está ahí. Solo necesitamos definir SImageInfo para el punto final ‘X’ y usarlo en consecuencia.

Tenga en cuenta que el ejemplo explicado anteriormente es una forma de hacerlo. El diseño tiene que ver con la discusión y el requisito. Un buen diseño se decide teniendo en cuenta muchos factores. También podemos tener clases específicas de la plataforma como CImageWindows, CImageApple y poner allí todo el código específico de la plataforma.

¿Preguntas? Manténlos viniendo. Nos encantaría responder.

Este artículo es una contribución de Aashish Barnwal . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *