Pregunta

Hace poco trató de entender un programa en C ++ que fue escrito por alguien que supongo que tenía un fondo en la programación funcional: Por ejemplo, había declarado un cierre clase que ampliamente utilizado y cuáles no tanto asemejarse a lo que se conoce como un cierre en la programación funcional. Otra clase se llama un protector , pero bastante no han descubierto aún lo que es bueno para. Parece que tiene algún tipo de funcionalidad de limpieza que se le atribuye.

El único idioma en el que he visto un concepto llamado protector es Erlang, pero que no lo hace de forma remota un aspecto similar al código que encontré. En qué otros idiomas está disponible como existen un concepto que el autor del código C ++ pudo haberse referido a?

¿Fue útil?

Solución

A mí me suena como si estuviera utilizando RAII.
El constructor de la clase / destructor se utiliza para simétricamente manejar algún tipo de asignación de recursos / liberación en un contexto seguro excepción (los programadores de Java Lo llamaría finalmente {} como el destructor se garantizó a ser llamado.).

Este es un C ++ lenguaje muy común y está ampliamente UED en C ++ moderna.

¿La mirada código como el siguiente:

void Plop()
{
     Guard   guard(lock);
     // Do lots of stuff
}

A continuación, el guardia está bloqueando la cerradura en el constructor y el desbloqueo de la cerradura en el destructor.

Otros consejos

El término "protector" se utiliza en varios lenguajes funcionales la forma en que se utiliza en Erlang, pero no parece que el uso para adaptarse a su descripción. Sin ver el código C ++ que es difícil saber realmente lo que se pretendía por ella.

Una conjetura por su descripción sería que implementa algo así como bracket , que básicamente se asegura de que algunos recursos son liberados si se cierra la función envueltos, incluso si eso ocurriera por una excepción. En Python se podría usar para este finally, en C ++ por lo general tienen el código de limpieza en el destructor de un objeto en la pila.

En términos generales, un guardia es simplemente una construcción que tiene que evaluar a verdadero para su ejecución a lo largo de algún camino a seguir. Esto o algo parecido existe en todos los lenguajes de programación de Turing completa útiles, pero es quizás tan básico que a menudo no se nombra por separado como una entidad. Aquí está un ejemplo sencillo en Haskell:

f x
 | x < 0 = -x
 | otherwise = x

Esto es equivalente a la función de valor absoluto: niega un número si es negativo para producir su contraparte positiva; de lo contrario, devolver el mismo valor pasado Hay dos guardias aquí:.. x < 0, lo cual es cierto cuando x es menor que cero, y otherwise, que es siempre verdad

Módulo Control.Monad de Haskell tiene guard :

  

guard :: MonadPlus m => Bool -> m ()
  guard b es return () si b es True, y mzero si b es False.

Por ejemplo, para calcular ternas pitagóricas donde cada pierna no más de 25 es, usted podría utilizar

triples = do
  a <- [1..25]
  b <- [a..25]
  c <- [b..25]
  guard (p a b c)
  return (a,b,c)
  where
    p a b c = a*a + b*b == c*c

Para una explicación de lo que está pasando, ver mi blog Un punto y coma programable explicó .

Los guardias de la informática por lo general se refieren a la expresión booleana que indica que una construcción de bucle debe continuar. Por ejemplo (perdón el juego de palabras)

for (int i = 0; i < N; ++i)
  /* stuff */

A continuación, i < N es la guardia.

Es difícil responder a su pregunta más a fondo y sin más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top