2011-03-04 3 views
5

Mis 2 entornos principales de desarrollo son C y Objective-C. Con Clang y LLVM, el uso de cierres se ha convertido o se está convirtiendo en una realidad completa, llamada Blocks ... pero siguen siendo cierres. No me preocupa el "cómo" técnicoManeras de usar el diseño usando Cierres (o Bloques), como programador en C

Lo que quiero saber es, ¿cuáles son las mejores formas de diseñar software para utilizar Closures?

Sé que puede hacer cosas buenas de clasificación usándolas, pero ¿qué otras posibilidades existen? He visto formas de simplificar la estructura del programa, pero el tema es muy escuchado para buscar. Nunca he visto una lista exhaustiva o un buen recurso.

Bounty colocado: una respuesta recompensa dará una lista completa y ejemplos específicos para la utilización de los bloqueos en C y Objective-C

Respuesta

0

Probablemente no es la respuesta que está buscando, pero puede ayudar ...

Los cierres no son nuevos, han existido desde el comienzo de la programación (Lisp, Algol-60). La mejor manera de aprender sobre cómo se usan es mirar un lenguaje maduro en el que han existido por siempre y ver cómo la gente los usa.

Los lenguajes funcionales y los cierres son sinónimos, generalmente denominados programación de "orden superior", donde las funciones (métodos) toman otras funciones, ya que los argumentos y funciones se pueden crear sobre la marcha (bloques). Así que mirar un libro sobre programación en Haskell no es una mala elección, o tal vez F #.

Si esto parece demasiado radical, podría mirar Ada 95, un lenguaje "convencional" con funciones en línea, aunque es un lenguaje de nicho (rentable) y las características probablemente no sean ampliamente utilizadas.

Si desea algo relativamente nuevo, mire C# donde las funciones en línea se agregaron en v2. Las funciones en línea de C# tienen muchas de las mismas trampas que las de Obj-C, y las personas cayeron en ellas con alegría desinformada, así que busque un libro C# reciente cuando su uso sea más maduro.

Y para cerrar, no use demasiados bloques. Son una herramienta muy poderosa y, cuando corresponde, pueden producir muy buenas soluciones. Sin embargo cuando se usa de manera inapropiada ... aquí hay dragones ;-)

+0

que tendrá que comprobar en las funciones de C# en línea, todo lo demás no es nuevo para mí (pero gracias) .. pero no responde a la pregunta – Nektarios

0

no he trabajar con Objective-C, pero tienen cierres de uso en C, C++, Object Pascal, Delphi, Javascript. "Cierre" es un término muy ambiguo, y su implementación en código, difiere de un lenguaje de programación de otro, así como un término matemático.

Es por eso que tenemos "bloques", "devoluciones de llamada", "indicadores de función", "referencias de métodos", bla.

Básicamente, un "cierre" es una función que se usa como dato.Los programadores almacenan la referencia de función en una variable o parámetro, y en lugar de llamarse inmediatamente, se usa cuando es necesario. Como podemos tener "variables de función", la misma variable se puede usar para ejecutar cierres diferentes.

Dado que usted menciona "Objective C", que también está orientado a objetos, la forma de utilizar el "cierre" es diferente si desea utilizar cierres de métodos o cierres para las funciones globales.

Ejemplo con "Llanura C":


typedef int (*ClosureType)(int a, int b); 

int add(int a, int b) 
{ 
    return a + b; 
} 

int substract(int a, int b) 
{ 
    return a - b; 
} 

int multiply(int a, int b) 
{ 
    return a * b; 
} 

int main(int argc, char *argv[]) 
{ 
    ClosureType functions[3] = { add, substract, multiply }; 

    int option = 0; 

    printf("Operation Menu:\n"); 
    printf("(1) Addition:\n"); 
    printf("(2) Substraction:\n"); 
    printf("(3) Multiplication:\n"); 
    printf("Select an operation\n"); 
     scanf("%d", &option); 

    int r = -1; 
    switch() { 
     case 1: 
      r = functions[0] (3, 4); 
     break; 

     case 2: 
      r = functions[1] (3, 4); 
     break; 

     case 3: 
      r = functions[2] (3, 4); 
     break; 

     default 
     break; 
    } 

    printf("The result of %d and %d: %d\n", 3, 4, r); 
    getch()("\n"); 

    return 0; 
} 

+1

Los cierres y los punteros a las funciones no son lo mismo. Una función utilizada como datos es un puntero de función, que es lo que muestra su ejemplo. Los cierres son más que eso. Ve a leer https://secure.wikimedia.org/wikipedia/en/wiki/Closure_%28computer_science%29 –

+1

@Laurent gracias por aclarar, iba a decir lo mismo, pero no tengo suficiente conocimiento de dominio para ser Por supuesto. Este es el tipo de cosa que me confunde a mí y a las personas como yo, porque creo que hay muchas respuestas confusas en primer lugar. – Nektarios

+0

Creo que debería ser más específico que haya cierres, punteros de funciones, bloques, que funcionen para resolver problemas similares, aunque no sean exactamente iguales. Es posible que desee comprobar cuáles están disponibles en el "Objetivo C", y cuál en "C simple", y se adapta a sus necesidades ... – umlcat

Cuestiones relacionadas