En la programación de computadora, un servicio repetido es el código ejecutable que se pasa pues una discusión al otro código. Permite que una capa de nivel inferior del software llame una subrutina (o la función) definida en una capa de alto nivel.

Generalmente, el comienzo del código de alto nivel llamando una función dentro del código de nivel inferior que le pasa un indicador o la manija a otra función. Mientras que la función de nivel inferior ejecuta, puede llamar pasar-en la función cualquier número de épocas de realizar una cierta subtarea. En otro panorama, la función de nivel inferior coloca pasar-en la función como tratante del que deba ser llamado asincrónico por el de nivel inferior en un rato posterior en la reacción algo.

Un servicio repetido se puede utilizar como alternativa más simple al polimorfismo y al programado genérico, en que el comportamiento exacto de una función puede ser determinado dinámicamente pasando indicadores o las manijas de función diversa (con todo compatible) a la función de nivel inferior. Esto puede ser una técnica muy de gran alcance para la reutilización del código.

Motivación

Para entender la motivación para usar servicios repetidos, considerar el problema de realizar una operación arbitraria en cada artículo en una lista. Un acercamiento está al itera sobre la lista, funcionando en cada objeto. Ésta es la solución más común en la práctica, pero no es ideal; el código para manejar el iterator (por ejemplo, una declaración de for) se debe duplicar en cada punto en el código donde se atraviesa la lista. Además, si la lista es puesta al día por un proceso asincrónico (por ejemplo, si se agrega o se quita un artículo), el iterator pudo saltar sobre artículos o llegar a ser corrupto durante el traversal.

Una alternativa pudo ser crear una nueva función de la biblioteca que realiza la operación deseada con la sincronización apropiada. Este acercamiento todavía requiere cada nueva función de biblioteca contener el código para atravesar la lista. Esta solución no es aceptable para las bibliotecas genéricas previstas para los varios usos; el revelador de la biblioteca no puede anticipar cada necesidad del uso, y el revelador de uso no debe necesitar saber los detalles de la puesta en práctica de la biblioteca.

Los servicios repetidos solucionan estos defectos. Un procedimiento se escribe para atravesar la lista, y las aplicaciones de este procedimiento uso-proporcionaron código para funcionar encendido cada artículo. Hay una distinción clara entre la biblioteca y el uso sin sacrificar flexibilidad.

Un servicio repetido se puede también mirar como forma de runtime que ata, según lo discutido en el libro influyente de los patrones del diseño (véase el resumen del capítulo 1).

Ejemplo

El código siguiente en el C demuestra el uso de los servicios repetidos para el caso específico de buscar un arsenal para un artículo (en este caso, el primer número entero mayor de 5). Primero, el acercamiento de la iteración:

lang=" del internacional i; para (i = 0; i < longitud; i++) { si (arsenal > 5) { rotura; } } si (i < longitud) { printf (" Artículo %d \ n", i); } { printf (" No encontrado \ n"); }

Después, el acercamiento del servicio repetido:

lang=" del CÓDIGO DE LA BIBLIOTECA DE/* * traverseWith de la internacional (arsenal de la internacional, longitud del size_t, internacional (*callback) (índice de la internacional, artículo de la internacional, *param vacío), *param vacío) { exitCode de la internacional = 0; para (internacional i = 0; i < longitud; i++) { exitCode = servicio repetido (i, arsenal, param); ¡si (exitCode! = 0) { rotura; } } exitCode de vuelta; } CÓDIGO DE USO DE/* * búsqueda de la internacional (índice de la internacional, artículo de la internacional, *param vacío) { si (artículo > 5) { * (internacional *) param = índice; vuelta 1; } { vuelta 0; } } /* (en otra función) * índice de la internacional; la internacional encontró; encontrado = traverseWith (arsenal, longitud, &search, &index); si (encontrado) { printf (" Artículo %d \ n", índice); } { printf (" No encontrado \ n"); }

Observar que el traverseWith recibe un parámetro adicional que el servicio repetido pueda utilizar para sus propios propósitos. Un servicio repetido utiliza normalmente un parámetro tal como un indicador a los datos de uso fuera de su propio alcance (en este caso, la variable que recibe el índice). Esta característica es necesaria solamente en una lengua estáticamente scoped como C o C++ (en idiomas de C++ y de OO otras soluciones son sin embargo posibles, consideran abajo). Las idiomas dinámicamente scoped (lenguajes el de programación funcional incluyendo) pueden proporcionar el acceso a los datos de uso automáticamente vía los encierros . En balbucean, por ejemplo, el mismo programa parecería esto:

lang=" del ; CÓDIGO DE LA BIBLIOTECA (traverseWith del defun (servicio repetido del arsenal) (dejar ((la nada del exitCode) (i 0)) (mientras que (y (no exitCode) (< i (arsenal de la longitud))) (exitCode del setq (servicio repetido i (arsenal i de la AREF))) (setq i (+ i 1))) exitCode)) ; CÓDIGO DE USO (dejar (el índice encontrar) (el setq encontró (el arsenal del traverseWith (lambda (artículo del idx) (si (nada del punto del <= 5) (idx del índice del setq) t)))))

La función de servicio repetido ahora se define actualmente uso, y refiere al " index" por nombre. Las preocupaciones de la sincronización se han omitido de estos ejemplos, pero pueden ser tratadas fácilmente en la función del traverseWith. Más importantemente, pueden ser tratadas, o ser no hechas caso, cambiando solamente esa función.

Puesta en práctica

La forma de un servicio repetido varía entre los lenguajes de programación
el C del

y el C++ permiten los indicadores de la función como discusiones a otras funciones.
Varios lenguajes de programación (sin embargo especialmente lenguajes el de programación funcional tal como esquema o ml ) permiten los encierros, una generalización de los indicadores de la función, como discusiones a otras funciones.
Varios lenguajes de programación, especialmente idiomas interpretadas permiten que uno pase el nombre del de una función A como parámetro a una función B y que tenga llamada A de B por medio Eval .
En los lenguajes el de programación orientado al objeto una llamada puede aceptar un objeto que ejecute un cierto interfaz abstracto, sin especificar detalladamente cómo el objeto debe hacer tan. El programador que ejecuta ese objeto puede utilizar los métodos del interfaz exclusivamente para el código específico a la aplicación. Tales objetos son con eficacia un paquete de servicios repetidos, más los datos que necesitan manipular. Son útiles en la ejecución de los varios patrones del diseño como el visitante, el observador, y la estrategia .
C++ permite que los objetos proporcionen su propia puesta en práctica de la operación de la llamada de función. La biblioteca estándar de la plantilla acepta estos objetos (llamados los functors ), así como indicadores de la función, como parámetros a los varios algoritmos polimórficos
Algunos sistemas tienen lenguajes de programación incorporados para apoyar la extensión y la adaptación. Estas idiomas proporcionan servicios repetidos sin la necesidad de herramientas separadas del desarrollo de programas.

Casos especiales

Las funciones de servicio repetido también se utilizan con frecuencia como los medios de manejar las excepciones que se presentan dentro de la función baja, como manera de permitir los efectos secundarios en respuesta a una cierta condición, o como manera de recopilar estadísticas operacionales en el curso de un cómputo más grande. Los tratantes de interrupción en un sistema operativo responden a las condiciones del hardware, el sistema operativo accionan a los tratantes de la señal de un proceso, y proceso de los tratantes de acontecimiento la entrada asincrónica que un programa recibe.

Una función de servicio repetido pura del es uno que es el puramente funcional (vuelve siempre el mismo valor dado las mismas entradas) y libera de efectos secundarios observables. Algunas aplicaciones de servicios repetidos, tales como el ejemplo de clasificación, requieren funciones de servicio repetido puras funcionar correctamente.

Un caso especial de un servicio repetido se llama un servicio repetido del predicado del, o apenas predicado para el cortocircuito. Ésta es una función de servicio repetido pura que acepta un solo valor de la entrada y vuelve un valor boleano . Estos tipos de servicios repetidos son útiles para filtrar colecciones de valores por una cierta condición.

En la programación Event-driven, hay a menudo uso, en diversas formas, del patrón del observador, que esencialmente permite el uso de los servicios repetidos del multicast, y de donde están los servicios repetidos registrados temprano, ser invocado en la discreción del callee (es decir cuando ocurre un acontecimiento dado). Algunos lenguajes de programación también tienen ayuda directa para esta construcción (por ejemplo el de .NET delega señales del o de s del cuarto de galón 'y ranura ).

Ver también

Señales y ranuras
Libsigc++, una biblioteca del servicio repetido para C++
Invocación implícita
Salida de usuario

.

  • Zenithic
  • Cléophas Beausoleil
    Random links:Movimiento del diseño de Viridian | Abdullah (Afganistán) | Alfred Stelzner | Pokémon: El cuento eléctrico de Pikachu | & de la persona que interrumpe; Koch P7

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">