2012-05-01 10 views
6

Como puede ser claro por el título, ¿qué enfoque preferimos?Pasar un parámetro en lugar de devolverlo de la función

La intención es pasar algunos parámetros del método y obtener algo como salida. Podemos pasar otro parámetro y el método lo actualizará y el método no necesita devolver nada ahora, el método simplemente actualizará la variable de salida y se reflejará en la persona que llama.

Solo intento enmarcar la pregunta a través de este ejemplo.

List<String> result = new ArrayList<String>(); 

for (int i = 0; i < SOME_NUMBER_N; i++) { 
    fun(SOME_COLLECTION.get(i), result); 
} 

// in some other class 
public void fun(String s, List<String> result) { 
    // populates result 
} 

frente

List<String> result = new ArrayList<String>(); 

for (int i = 0; i < SOME_NUMBER_N; i++) { 
    List<String> subResult = fun(SOME_COLLECTION.get(i)); 
    // merges subResult into result 
    mergeLists(result, subResult); 
} 

// in some other class 
public List<String> fun(String s) { 
    List<String> res = new ArrayList<String>(); 
    // some processing to populate res 
    return res; 
} 

entiendo que uno pasa a la referencia y otro no lo hace.

¿Cuál deberíamos preferir (en diferentes situaciones) y por qué?

Actualización: Considérelo solo para objetos mutables.

+0

No estoy seguro de lo que estás preguntando. ¿Estás preguntando en qué situaciones debes pasar una variable a un método vs adquirirlo dentro del método con un getArg() o como se llame? – Charles

+0

No, lo está malinterpretando o no pude transmitir. Pregunto: ¿Debemos pasar una variable a una función como referencia o devolverla desde la función? ¿En qué situaciones debemos usar cualquiera de estos? ¡Espero, estoy claro! – instanceOfObject

Respuesta

14

Devolver un valor de la función es generalmente una manera más limpia de escribir código.Pasar un valor y modificarlo es más estilo C/C++ debido a la naturaleza de crear y destruir punteros.

Los desarrolladores generalmente no esperan que sus valores se modifiquen al pasarlo a través de una función, a menos que la función indique explícitamente que modifica el valor (y de todos modos, se pasa revista a la documentación).

Aunque hay excepciones.

Considere el ejemplo de Collections.sort, que realmente hace una especie de lista in situ. Imagine una lista de 1 millón de artículos y está ordenando eso. Tal vez no desee crear una segunda lista que tenga otro millón de entradas (aunque estas entradas estén apuntando hacia el original).

También es una buena práctica favorecer la posesión de objetos inmutables. Los objetos inmutables causan muchos menos problemas en la mayoría de los aspectos del desarrollo (como el enhebrado). Entonces al devolver un objeto nuevo, no está forzando que el parámetro sea mutable.

Lo importante es tener claras sus intenciones en los métodos. Mi recomendación es evitar modificar el parámetro cuando sea posible, ya que no es el comportamiento más típico en Java.

+0

¡Tiene sentido! ¡Gracias! – instanceOfObject

0

Al volver, mantendrá su código más limpio y causará menos acoplamiento entre los métodos/clases.

0

Esto es más acerca de las mejores prácticas y su propio método para programar. Yo diría que si usted sabe que esto va a ser una función de tipo de retorno como un valor:

función IsThisNumberAPrimeNumber {}

entonces usted sabe que esto sólo va a volver nunca un valor lógico. Usualmente uso funciones como programas auxiliares y no como sub procedimientos grandes. También aplico convenciones de nomenclatura que ayudan a dictar lo que espero que devuelva la función sub \. Ejemplos:

GetUserDetailsRecords GetUsersEmailAddress IsEmailRegistered

Si nos fijamos en los 3 nombres, se puede decir la primera se va a dar alguna lista o clase de múltiples registros de detalles de usuario, la segunda te dará una el valor de cadena de un correo electrónico y el tercero probablemente le dará un valor booleano. Si cambias el nombre, cambias el significado, entonces yo diría que consideres esto además.

0

La razón por la que no creo que entendamos es que esos son dos tipos de acciones totalmente diferentes. Pasar una variable a una función es un medio de dar datos de una función. Devolverlo desde la función es una manera de pasar datos de una función.

Si se refiere a la diferencia entre estas dos acciones:

public void doStuff(int change) { 
    change = change * 2; 
} 

y

public void doStuff() { 
    int change = changeStorage.acquireChange(); 
    change = change * 2; 
} 

continuación, la segunda es generalmente más limpio, sin embargo, hay varias razones (seguridad, función de visibilidad, etc.) que puede evitar que pase datos de esta manera.

También es preferible porque hace que el código de reutilización sea más fácil, y también lo hace más modular.

6

Deberías devolverlo. El segundo ejemplo que proporcionó es el camino a seguir.

Antes que nada, es más claro. Cuando otras personas leen su código, no se comprende que no se den cuenta de que el parámetro se está modificando como salida. Puede intentar nombrar las variables, pero cuando se trata de la legibilidad del código, es preferible.

El GRAN motivo por qué debería devolverlo en lugar de pasarlo, es con objetos inmutables. Su ejemplo, la Lista, es mutable, por lo que funciona bien. Pero si tratara de usar una cadena de esa manera, no funcionaría.

Como las cadenas son inmutables, si pasa una cadena como parámetro, y luego la función fuera a decir:

public void fun(String result){ 
    result = "new string"; 
} 

no sería ser alterado El valor de resultado que ha aprobado en . En cambio, la variable de ámbito local 'resultado' ahora apunta a una nueva cadena dentro de fun, pero el resultado en su método de llamada aún apunta a la cadena original.

Si llama:

String test = "test"; 
fun(test); 
System.out.println(test); 

Se imprimirá: "prueba", no "nueva cadena"!

Definitivamente, es superior al rendimiento. :)

+0

¡Sí! ¡Eso lo entiendo, la pregunta era solo para objetos mutables! Gracias por la respuesta por cierto! – instanceOfObject

+0

No hay problema. Sí, para objetos mutables funciona, y en algunos casos será preferible (no se pueden devolver múltiples objetos sin utilizar una tupla) pero, en general, si todo sigue igual, la devolución es un mejor estilo de código. – SpacePrez

Cuestiones relacionadas