2012-06-11 10 views
6

¿Cuáles son las desventajas de usar un bloque para definir un método privado dentro de un método, en lugar de usar un método privado real? ¿Hay algo aparte de no poder llamar al método desde otro lugar?Bloques vs métodos privados?

Ejemplo:

-(NSDictionary*)serialize 
{ 
    NSMutableDictionary* serialization = [NSMutableDictionary dictionary]; 

    TwoArgumentsBlockType serializeItemBlock = ^void(MyItemClass* item, NSString* identifier) 
    {  
     if (item) 
     { 
      // serialization code 
     } 
    }; 

    serializeItemBlock(self.someItem1, kSomeIdentifier1); 
    serializeItemBlock(self.someItem2, kSomeIdentifier2); 
    serializeItemBlock(self.someItem3, kSomeIdentifier3); 
    serializeItemBlock(self.someItem4, kSomeIdentifier4); 
    serializeItemBlock(self.someItem5, kSomeIdentifier5); 
    serializeItemBlock(self.someItem6, kSomeIdentifier6); 
    serializeItemBlock(self.someItem7, kSomeIdentifier7); 
    serializeItemBlock(self.someItem8, kSomeIdentifier8); 
    serializeItemBlock(self.someItem9, kSomeIdentifier9); 
    serializeItemBlock(self.someItem10, kSomeIdentifier10); 
    serializeItemBlock(self.someItem11, kSomeIdentifier11); 

    return serialization; 
} 
+0

esta es una buena pregunta, me hizo usar mi eXpeRience con blocKs para pensar diferente. este comentario es sensible a mayúsculas y minúsculas;) P – Lio

Respuesta

1

La claridad del código es importante.

métodos permiten encapsular secciones enteras de código separados unos de otros, y puede hacer que sea más fácil de leer ..

Otra razón para elegir los métodos privados más de los bloques es la gestión de memoria. Este es un tema muy importante para discutir aquí, pero basta decir que los bloques son extraños en la administración de la memoria y no actúan como cualquier otra estructura de código en ese sentido.

+0

Todavía no estoy seguro de la legibilidad. El código anterior tiene la desventaja de ser más largo de lo que sería si el método se declarase por separado, pero, por otro lado, me parece una buena manera de dar un alcance al método, ya que en ese momento no está destinado a ser utilizado. desde otras ubicaciones en el código. – diegoreymendez

+0

En cualquier caso, entiendo que esta es probablemente la razón más importante por la que uno decidirá evitar este enfoque. Gracias por la respuesta. – diegoreymendez

1

Podría decirse que es más difícil para navegar por el código - que tienden a tener puntos de entrada enterrados en lugar oscuramente en medio de alguna función, y no hay ningún nombre de función se puede ver en el depurador o de búsqueda para, que puede hacer la depuración y el seguimiento un poco más difícil.

6

creo que los 3 mayores inconvenientes son:

  1. El bloque no es reutilizable, como usted menciona.
  2. El bloque no se puede probar: no se puede escribir una prueba unitaria que verifique que el bloque hace lo que usted cree que hace.
  3. El código es menos legible. Cuando lee este método, lo importante es que una serie de cosas se serialicen, no los detalles de cómo se implementa la serialización.

Mover este bloque a un método resolvería todos estos problemas. Si el bloque es utilizado por alguna API que toma una devolución de llamada de bloque como argumento, siempre puede return the block from a method.

+0

Creo que parte del problema con mi pregunta inicial es que la respuesta es: "depende de lo que necesites". Por ejemplo: parte de lo que hace que los bloques sean tan interesantes es que permiten a los desarrolladores escribir métodos en línea donde realmente tiene sentido, por ejemplo, en lugares donde se necesita ejecutar código que realmente no pertenece a ningún otro lugar, y en lugares donde la legibilidad sufrir si usaste un método externo. – diegoreymendez

Cuestiones relacionadas