¿Es mejor llamar a una función que no tiene efecto en ese momento, SI mejora la claridad del código?

60

Tengo tres vistas en mi programa (aplicación iOS). Solo uno de ellos está activo al mismo tiempo, así que establezco la visibilidad para dos de ellos y cambio la visibilidad cuando el usuario presiona los botones. Las vistas se inicializan como visibles, así que configuro la visibilidad en el código antes de que se muestre la vista principal.

Puedo hacer

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

para dos de las vistas, pero ahora no se aborda la tercera (la que debería estar visible al inicio de la aplicación). Pongo un

[view3 setAlpha:1.0f];

después de los dos primeros, porque creo que queda claro que en realidad hay tres vistas, no dos como se podría pensar al ver el código. ¿Cómo hacen esto otros programadores? ¿Es pura preferencia o existen algunas convenciones?

Si la llamada es muy intensa, obviamente es mejor no llamarla cuando eso no es necesario, pero me preguntaba sobre cosas pequeñas como mi ejemplo.

    
pregunta Kevin 17.08.2015 - 09:55

4 respuestas

134

Tienes un invariante:

  

Solo una única vista (de 3) está siempre activa (y visible).

Luego, sugiero que proporcione una función para cambiar la actividad y la visibilidad de TODAS las vistas a la vez:

[setActiveView viewID:2]

Esta función:

  • compruebe si la vista ya está activa, evitando trabajos innecesarios
  • establece la vista como activa y visible
  • configura las otras 2 vistas como inactivas e invisibles

Tiene múltiples ventajas sobre una llamada en bruto a setVisibility :

  • amigable: llamarlo innecesariamente no crea un problema de rendimiento
  • defensivo: su único parámetro es mucho más difícil de destruir, mientras que para setVisibility es más difícil recordar que el rango de valores es 0.0f - 1.0f y que solo uno debe configurarse como 1.0f
  • resistente: el siguiente tipo no puede olvidar accidentalmente una de las vistas
  • adaptable: agregar / eliminar una vista no requiere examinar todo el código de la aplicación para encontrar dónde están los switches, es necesario actualizar una sola función (esta)

Idealmente, para ayudar a imponer el invariante, ninguna otra función debería ser capaz de meterse con esta configuración ...

    
respondido por el Matthieu M. 17.08.2015 - 11:48
12

Idea alternativa: si su objetivo es evitar que se produzcan errores porque la gente olvida que hay tres vistas y hace algo con solo dos de ellos que realmente debería hacer con todos ellos, entonces haga una función que lo haga imposible olvidar:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Ahora tiene algo mucho más poderoso: el tiempo de compilación garantiza que no lo haya olvidado . Si olvidas un parámetro, el compilador te gritará. Esto es mucho más útil que los comentarios o el código innecesario, ya que crea un protocolo con nombre estricto que hace cumplir la propiedad que le interesa.

En el caso de que view3 no necesite que se cambie su visibilidad, puede agregar algún comportamiento donde pasar un valor especial como -1.0 o nil o algo así significa "no cambiar la visibilidad de la vista en absoluto". Esto soluciona el problema de establecer visibilidades innecesariamente.

    
respondido por el Jack 17.08.2015 - 10:58
8

Creo que es mejor agregar un comentario que explique que la llamada no es necesaria (y por qué).

(tal vez, el hecho de que una llamada sea innecesaria, o que necesite un comentario al respecto, podría ser un olor a código)

    
respondido por el Basile Starynkevitch 17.08.2015 - 09:56
4

En este caso particular, @Mattieu M. tiene la solución correcta.

En el caso más general, donde no hay una transformación similar, debes preguntarte: ¿hay alguna posibilidad de que un futuro programador pueda estropear esto?

La respuesta suele ser sí. Lo que significa, sí, debe agregar la llamada. Tal vez alguna versión futura del marco comience con todas las vistas desactivadas en lugar de activadas.

    
respondido por el Stig Hemmer 18.08.2015 - 09:29

Lea otras preguntas en las etiquetas