Pregunta

Esta es una programación general, pero si hace la diferencia, estoy usando el objetivo-c. Supongamos que hay un método que devuelve un valor y también realiza algunas acciones, pero no le importa el valor que devuelve, solo lo que hace. ¿Llamarías al método como si fuera nulo? ¿O colocar el resultado en una variable y luego eliminarlo u olvidarlo? Exprese su opinión, qué haría si tuviera esta situación.

¿Fue útil?

Solución

Un ejemplo común de esto es printf, que devuelve un int ... pero rara vez se ve esto:

int val = printf("Hello World");

Otros consejos

Sí, simplemente llame al método como si fuera nulo. Probablemente lo hagas todo el tiempo sin darte cuenta. El operador de asignación '=' en realidad devuelve un valor, pero rara vez se usa.

Depende del entorno (el lenguaje, las herramientas, el estándar de codificación, ...).

Por ejemplo, en C, es perfectamente posible llamar a una función sin usar su valor. Con algunas funciones como printf, que devuelve un int, se realiza todo el tiempo.

A veces, no usar un valor provocará una advertencia, lo que no es deseable. Asignar el valor a una variable y luego no usarlo solo provocará otra advertencia sobre una variable no utilizada. Para este caso, la solución es convertir el resultado en vacío mediante el prefijo de la llamada con (vacío), por ejemplo,

(void) my_function_returning_a_value_i_want_to_ignore().

Hay dos problemas separados aquí, en realidad:

  1. ¿Debería preocuparse por el valor devuelto?
  2. ¿Debería asignarlo a una variable que no va a usar?

La respuesta a # 2 es un rotundo "NO" - a menos, por supuesto, que esté trabajando con un idioma donde eso sería ilegal (me viene a la mente Turbo Pascal). No tiene absolutamente ningún sentido definir una variable solo para descartarla.

La primera parte no es tan fácil. En general, se devuelve un valor de razón: para las funciones idempotent el resultado es el único propósito de la función; para los no idempotentes, generalmente representa algún tipo de código de retorno que indica si la operación se completó normalmente. Hay excepciones, por supuesto, como encadenamiento de métodos .

Si esto es común en .Net (por ejemplo), probablemente haya un problema con la ruptura del código CQS .

Cuando llamo a una función que devuelve un valor que ignoro, generalmente es porque lo estoy haciendo en una prueba para verificar el comportamiento. Aquí hay un ejemplo en C #:

    [Fact]
    public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
    {
        var statValueRepository = new Mock<IStatValueRepository>();

        new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();

        statValueRepository.Verify(x => x.GetStatValues());
    }

Realmente no me importa el tipo de retorno, solo quiero verificar que se invocó un método en un objeto falso.

En C es muy común, pero hay lugares donde está bien hacerlo y otros lugares donde realmente no lo está. Las versiones posteriores de GCC tienen un atributo de función para que pueda recibir una advertencia cuando se utiliza una función sin verificar el valor de retorno:

  

El atributo warn_unused_result hace que se emita una advertencia si una persona que llama a la función con este atributo no utiliza su valor de retorno. Esto es útil para funciones en las que no verificar el resultado es un problema de seguridad o siempre un error, como realloc.

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }
     

da como resultado una advertencia en la línea 5.

La última vez que usé esto no había forma de desactivar la advertencia generada, lo que causa problemas cuando compila código de terceros que no desea modificar. Además, por supuesto, no hay forma de verificar si el usuario realmente hace algo sensato con el valor devuelto.

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