fbpx
Wikipedia

RAII

RAII (del inglés resource acquisition is initialization, que podría traducirse como «adquirir recursos es inicializar») es un popular patrón de diseño en varios lenguajes de programación orientados a objetos como C++ y Ada. La técnica fue inventada por Bjarne Stroustrup[1]​ para reservar y liberar recursos en C++. En este lenguaje, después de que una excepción es lanzada, el único código fuente que con seguridad es ejecutado es el de los destructores de objetos que residen en la pila. Por lo tanto los recursos necesitan ser gestionados con objetos adecuados. Los recursos son adquiridos durante la inicialización, cuando no hay posibilidad de que sean usados antes de estar disponibles, y liberados cuando se destruyen los mismos, algo que es garantizado que suceda incluso cuando se dan errores.

La técnica RAII es vital al escribir código C++ seguro frente a excepciones: para liberar recursos antes de permitir a las excepciones que se propaguen (para evitar fugas de memoria) el desarrollador puede escribir destructores apropiados una sola vez, ahorrándose escribir código de «limpieza» duplicado y disperso por el código fuente entre bloques de manejo de excepciones que pueden ser ejecutados o no.

A diferencia de la recolección de basura, RAII tiene las ventajas de saber cuándo los objetos existen y cuándo no.

Ejemplo 1

La siguiente clase RAII permite un fácil uso posterior de algunas funciones C usadas para el manejo de archivos, además quitándole al desarrollador la preocupación de: tener que ver en qué casos ha de cerrar los archivos.

#include <cstdio> #include <stdexcept> // Para poder usar std::runtime_error class file { public: file (const char* filename) : file_(std::fopen(filename, "w+")) { if (!file_) {  throw std::runtime_error("Error al abrir un archivo."); } } ~file() { if (std::fclose(file_)) {  // Nota: en general es una mala práctica lanzar excepciones desde un destructor  throw std::runtime_error("Error al cerrar un archivo."); } } void write (const char* str) { if (EOF == std::fputs(str, file_)) {  throw std::runtime_error("Error al escribir en un archivo."); } } private: std::FILE* file_; // Evitamos la copia y asignación, ya que no están implementadas. file (const file &); file & operator= (const file &); }; 

La clase file puede ser usada así:

void example_usage() { file logfile("registro_de_incidencias.txt"); // Abrimos el archivo (estamos adquiriendo un recurso). logfile.write("¡Hola, registro!"); // Continuamos usando el objeto logfile. // Podemos lanzar excepciones, usar la orden "return", "exit", etc. sin preocuparnos de cerrar el archivo; // debido a que el archivo se cierra automáticamente cuando se termina la vida de logfile. } 

Ejemplo 2

Se puede comparar los siguientes ejemplos en C y C++:

/* Versión en C */ #include <stdlib.h> void f(int n) { int* array = calloc(n, sizeof(int)); realizar_otras_operaciones(); free(array); } 
// Versión en C++. #include <vector> void f(int n) { std::vector<int> array (n); realizar_otras_operaciones(); } 

La versión en C requiere que el desarrollador libere la memoria en cada caso posible, a diferencia de la versión en C++.

Usos en otros recursos

RAII evita la sobrecarga de los esquemas de la recolección de basura, e incluso puede ser aplicado a otros recursos como:

  • Handles a archivos, que la recolección de basura mark-and-sweep no maneja con igual eficiencia.
  • Ventanas que han de ser cerradas.
  • Iconos en el área de notificación que han de ser ocultados.
  • Código de sincronización como monitores, secciones críticas, etc. que deben ser liberados para permitir que otros hilos de ejecución (threads) los obtengan.
  • Handles al registro de Microsoft Windows que estén abiertos.
  • Conexiones de red.
  • Objetos GDI de Windows.
  • Acciones a realizar cuando se termina una función (o bloque de código) en cualquier punto posible (la acción la realiza el destructor de un objeto creado cuando empieza la función).

Referencias

  1. Stroustrup, Bjarne (1994). The Design and Evolution of C++. Addison-Wesley. ISBN 0-201-54330-3. 
  •   Datos: Q1714630

raii, inglés, resource, acquisition, initialization, podría, traducirse, como, adquirir, recursos, inicializar, popular, patrón, diseño, varios, lenguajes, programación, orientados, objetos, como, técnica, inventada, bjarne, stroustrup, para, reservar, liberar. RAII del ingles resource acquisition is initialization que podria traducirse como adquirir recursos es inicializar es un popular patron de diseno en varios lenguajes de programacion orientados a objetos como C y Ada La tecnica fue inventada por Bjarne Stroustrup 1 para reservar y liberar recursos en C En este lenguaje despues de que una excepcion es lanzada el unico codigo fuente que con seguridad es ejecutado es el de los destructores de objetos que residen en la pila Por lo tanto los recursos necesitan ser gestionados con objetos adecuados Los recursos son adquiridos durante la inicializacion cuando no hay posibilidad de que sean usados antes de estar disponibles y liberados cuando se destruyen los mismos algo que es garantizado que suceda incluso cuando se dan errores La tecnica RAII es vital al escribir codigo C seguro frente a excepciones para liberar recursos antes de permitir a las excepciones que se propaguen para evitar fugas de memoria el desarrollador puede escribir destructores apropiados una sola vez ahorrandose escribir codigo de limpieza duplicado y disperso por el codigo fuente entre bloques de manejo de excepciones que pueden ser ejecutados o no A diferencia de la recoleccion de basura RAII tiene las ventajas de saber cuando los objetos existen y cuando no Indice 1 Ejemplo 1 2 Ejemplo 2 3 Usos en otros recursos 4 ReferenciasEjemplo 1 EditarLa siguiente clase RAII permite un facil uso posterior de algunas funciones C usadas para el manejo de archivos ademas quitandole al desarrollador la preocupacion de tener que ver en que casos ha de cerrar los archivos include lt cstdio gt include lt stdexcept gt Para poder usar std runtime error class file public file const char filename file std fopen filename w if file throw std runtime error Error al abrir un archivo file if std fclose file Nota en general es una mala practica lanzar excepciones desde un destructor throw std runtime error Error al cerrar un archivo void write const char str if EOF std fputs str file throw std runtime error Error al escribir en un archivo private std FILE file Evitamos la copia y asignacion ya que no estan implementadas file const file amp file amp operator const file amp La clase file puede ser usada asi void example usage file logfile registro de incidencias txt Abrimos el archivo estamos adquiriendo un recurso logfile write Hola registro Continuamos usando el objeto logfile Podemos lanzar excepciones usar la orden return exit etc sin preocuparnos de cerrar el archivo debido a que el archivo se cierra automaticamente cuando se termina la vida de logfile Ejemplo 2 EditarSe puede comparar los siguientes ejemplos en C y C Version en C include lt stdlib h gt void f int n int array calloc n sizeof int realizar otras operaciones free array Version en C include lt vector gt void f int n std vector lt int gt array n realizar otras operaciones La version en C requiere que el desarrollador libere la memoria en cada caso posible a diferencia de la version en C Usos en otros recursos EditarRAII evita la sobrecarga de los esquemas de la recoleccion de basura e incluso puede ser aplicado a otros recursos como Handles a archivos que la recoleccion de basura mark and sweep no maneja con igual eficiencia Ventanas que han de ser cerradas Iconos en el area de notificacion que han de ser ocultados Codigo de sincronizacion como monitores secciones criticas etc que deben ser liberados para permitir que otros hilos de ejecucion threads los obtengan Handles al registro de Microsoft Windows que esten abiertos Conexiones de red Objetos GDI de Windows Acciones a realizar cuando se termina una funcion o bloque de codigo en cualquier punto posible la accion la realiza el destructor de un objeto creado cuando empieza la funcion Referencias Editar Stroustrup Bjarne 1994 The Design and Evolution of C Addison Wesley ISBN 0 201 54330 3 Datos Q1714630Obtenido de https es wikipedia org w index php title RAII amp oldid 132947502, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos