¿Qué es un handle? ¿Es un puntero? ¿Es una referencia?

0
0

El término handle (manejador) se utiliza para referirse a cualquier técnica que le permite llegar a otro objeto – un pseudo puntero generalizado. El término es (deliberadamente) ambiguo y vago.

La ambigüedad es en realidad una ventaja en ciertos casos. Por ejemplo, durante el diseño inicial no podría estar listo para hacer a una representación específica de los handles. Usted no pudo estar seguro de si te quería punteros vs referencias vs punteros a punteros vs referencias a punteros vs índices enteros de una matriz vs cadenas (o alguna otra clave/indice) que se pueden onbtener de una tabla hash (u otra estructura de datos) vs claves de bases de datos vs alguna otra técnica. Si se limita a saber que usted necesitará algún tipo de cosita que únicamente le ayudará a identificar y llegar a un objeto, esa cosita es un handle.

Así que si su objetivo final es permitir que un segmento codigo identifique/buscque un objeto específico de una clase [inlinecode]Fred, necesita pasar un handle de Fred a ese codigo. El handle puede ser una cadena que se puede utilizar como una clave, conocidos por algunos como tabla de búsqueda (por ejemplo, una clave en std::map<std::string,Fred> o un std::map<std:: string , Fred*>), o puede ser un número entero de que sería un índice en un conjunto conocido (por ejemplo, Fred* array = new Fred[maxNumFreds]), o puede ser un simple puntero Fred*, o puede ser algo más.

Los novatos a menudo piensan en términos de punteros, pero en realidad hay riesgos bajos en la utilización de punteros en bruto. Por ejemplo, si quiero mover el objeto Fred? ¿Cómo saber cuándo es seguro eliminar los objetos Fred? ¿Qué pasa si el objeto Fred necesita ser serializado (temporalmente) en el disco? etc, etc La mayoría de las veces que agregar más capas de indirección para manejar situaciones como estas. Por ejemplo, los handles pueden ser Fred**, donde puntero a Fred * está garantizados que no se moverá nunca, pero cuando el objeto Fred necesite moverse, solo deben actualizar los punteros a Fred *. O bien, hacer que el handle sea un número entero que tenga los objetos Fred (o punteros a los objetos Fred) levantado en una tabla/matriz/o lo que sea.

El punto es que usamos la palabra handle, cuando todavía no conocemos los detalles de lo que vamos a hacer.

Podemos usar tambien la palabra handle cuando queremos ser vagos acerca de lo que ya hemos hecho (a veces el término cookie mágica se utiliza para estos casos, como en “El software pasa alrededor de una cookie mágica que se utiliza de manera única identificar y localizar, en este caso, al objeto Fred “). La razón por la que (a veces) quieremos ser vagos acerca de lo que ya hemos hecho es reducir al mínimo el efecto dominó si/cuando los detalles específicos/representación del handle cambie. Por ejemplo, si/cuando alguien cambia el handle de una cadena en una tabla de hash a un entero que se busca en una matriz, no quisieramos ir a actualizar un trillón de líneas de código.

Para facilitar aún más el mantenimiento si/cuando los detalles/representación de un handle cambian (o en general hacer que el código sea más fácil de leer/escribir), a menudo vamos a encapsular el handle en una clase. Esta clase a menudo trandrá sobrecargas del operador -> y el operador * (ya que el handle actúa como un puntero, esto va hacer que se parezca mas a un puntero).

/*Tomado de C++ FAQ Lite*/

  • You must to post comments
An error occurred while importing content. Error: Class HTML_QuickForm_text does not have a constructor, so you cannot pass any constructor arguments